freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

嵌入式實(shí)時(shí)操作系統(tǒng)分析(1)-資料下載頁(yè)

2025-04-29 05:58本頁(yè)面
  

【正文】 件的任務(wù)的優(yōu)先級(jí) X X X Y Y Y 0 0 任 務(wù) 的 優(yōu) 先 級(jí) .OSEventTbl[ ]中相應(yīng)位的位置 .OSEventGrp 中相應(yīng)位的位置及 .OSEventTbl[ ]中的 數(shù)組 下 標(biāo) 106 使任務(wù)進(jìn)入 /脫離等待狀態(tài) 將一個(gè)任務(wù)插入到事件的等待任務(wù)列表中 peventOSEventGrp |= OSMapTbl[prio 3]。 peventOSEventTbl[prio 3] |= OSMapTbl[prio amp。 0x07]。 從等待任務(wù)列表中刪除一個(gè)任務(wù) if ((peventOSEventTbl[prio 3] amp。= ~OSMapTbl[prio amp。 0x07]) == 0) { peventOSEventGrp amp。= ~OSMapTbl[prio 3]。 } 107 在等待事件的任務(wù)列表中查找優(yōu)先級(jí)最高的任務(wù) 在等待任務(wù)列表中查找最高優(yōu)先級(jí)的任務(wù) y = OSUnMapTbl[peventOSEventGrp]。 x = OSUnMapTbl[peventOSEventTbl[y]]。 prio = (y 3) + x。 108 空閑 ECB的管理 ? ECB的總數(shù)由用戶所需要的信號(hào)量、郵箱和消息隊(duì)列的總數(shù)決定,由 define OS_MAX_EVENTS定義。 ? 在調(diào)用 OSInit()初始化系統(tǒng)時(shí),所有的 ECB被鏈接成一個(gè)單向鏈表 —— 空閑事件控制塊鏈表; ? 每當(dāng)建立一個(gè)信號(hào)量、郵箱或消息隊(duì)列時(shí),就從該鏈表中取出一個(gè)空閑事件控制塊,并對(duì)它進(jìn)行初始化。 0 OS_MAX_EVENTS OSEventFreeList OS_EVENT 109 ECB的基本操作 ? OSEventWaitListInit() ? 初始化一個(gè)事件控制塊。 當(dāng)創(chuàng)建一個(gè)信號(hào)量、郵箱或消息隊(duì)列時(shí),相應(yīng)的創(chuàng)建函數(shù)會(huì)調(diào)用本函數(shù)對(duì) ECB的內(nèi)容進(jìn)行初始化,將 OSEventGrp和 OSEventTbl[]數(shù)組清零; ? OSEventWaitListInit (OS_EVENT *pevent); ? prevent:指向需要初始化的事件控制塊的指針。 ? OSEventTaskRdy()。 ? 使一個(gè)任務(wù)進(jìn)入就緒態(tài) 。 當(dāng) 一個(gè) 事件 發(fā)生時(shí) , 需要將其等待任務(wù)列表中的最高優(yōu)先級(jí)任務(wù)置 為 就緒態(tài) ; ? OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk); ? msg:指向消息的指針; msk:用于設(shè)置 TCB的狀態(tài)。 110 ECB的基本操作(續(xù)) ? OSEventTaskWait() ? 使一個(gè)任務(wù)進(jìn)入等待狀態(tài) 。 當(dāng)某個(gè)任務(wù)要等待一個(gè)事件的發(fā)生時(shí) ,需要調(diào)用本函數(shù) 將 該 任務(wù)從就緒任務(wù)表中刪除,并放到相應(yīng)事件的等待任務(wù)表中 ; ? OSEventTaskWait (OS_EVENT *pevent); ? OSEventTO() ? 由于等待超時(shí)而將任務(wù)置為就緒態(tài) 。如果一個(gè)任務(wù)等待的事件 在預(yù)先指定的時(shí)間內(nèi)沒有發(fā)生 ,需要調(diào)用本函數(shù)將該 任務(wù) 從等待 列表 中 刪除,并把它置 為 就緒狀態(tài) ; ? OSEventTO (OS_EVENT *pevent); 111 同步與互斥 ? 為了實(shí)現(xiàn)資源共享,一個(gè)操作系統(tǒng)必須提供 臨界區(qū) 操作的功能; ? μ C/OS采用關(guān)閉 /打開中斷的方式來(lái)處理臨界區(qū)代碼,從而避免競(jìng)爭(zhēng)條件,實(shí)現(xiàn)任務(wù)間的互斥; ? μ C/OS定義兩個(gè)宏 (macros)來(lái)開關(guān)中斷,即:OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL(); ? 這兩個(gè)宏的定義取決于所用的微處理器,每種微處理器都有自己的 。 112 ... OS_ENTER_CRITICAL()。 任務(wù) 1的臨界區(qū)代碼; OS_EXIT_CRITICAL()。 ... 任務(wù) 1 任務(wù) 2 ... OS_ENTER_CRITICAL()。 任務(wù) 2的臨界區(qū)代碼; OS_EXIT_CRITICAL()。 ... 臨界資源 113 ? 當(dāng)處理臨界段代碼時(shí),需要關(guān)中斷,處理完畢后,再開中斷; ? 關(guān)中斷時(shí)間是實(shí)時(shí)內(nèi)核最重要的指標(biāo)之一; ? 在實(shí)際應(yīng)用中,關(guān)中斷的時(shí)間很大程度中取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量; ? ?C/OSII定義兩個(gè)宏開關(guān)中斷 :OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()。 ?C/OSII中開關(guān)中斷的方法 114 ? OS_CRITICAL_METHOD==1 ? 用處理器指令關(guān)中斷,執(zhí)行 OS_ENTER_CRITICAL(),開中斷執(zhí)行 OS_EXIT_CRITICAL(); ? OS_CRITICAL_METHOD==2 ? 實(shí)現(xiàn) OS_ENTER_CRITICAL()時(shí),先在堆棧中保存中斷的開 /關(guān)狀態(tài),然后再關(guān)中斷;實(shí)現(xiàn) OS_EXIT_CRITICAL()時(shí),從堆棧中彈出原來(lái)中斷的開 /關(guān)狀態(tài); ? OS_CRITICAL_METHOD==3 ? 把當(dāng)前處理器的狀態(tài)字保存在局部變量中(如 OS_CPU_SR,關(guān)中斷時(shí)保存,開中斷時(shí)恢復(fù) ?C/OSII中采用了 3種開關(guān)中斷的方法 115 ? Intel 80x86實(shí)模式下中斷的打開與關(guān)閉; ? 方法 1 ? define OS_ENTER_CRITICAL() asm CLI ? define OS_EXIT_CRITICAL() asm STI ? 方法 2 ? define OS_ENTER_CRITICAL() asm {PUSHF。 CLI} ? define OS_EXIT_CRITICAL() asm POPF 116 信號(hào)量 ? 信號(hào)量在多任務(wù)系統(tǒng)中的功能 ?實(shí)現(xiàn)對(duì)共享資源的互斥訪問(wèn)(包括單個(gè)共享資源或多個(gè)相同的資源); ?實(shí)現(xiàn)任務(wù)之間的行為同步; ? 必須在 OS_SEM_EN開關(guān)常量置為 1,這樣 μC/OS 才能支持信號(hào)量。 117 ? uC/OS中信號(hào)量由兩部分組成:信號(hào)量的計(jì)數(shù)值( 16位無(wú)符號(hào)整數(shù))和等待該信號(hào)量的任務(wù)所組成的等待任務(wù)表; ? 信號(hào)量系統(tǒng)服務(wù) ?OSSemCreate() ?OSSemPend(), OSSemPost() ?OSSemAccept(), OSSemQuery() 118 任務(wù)、 ISR和信號(hào)量的關(guān)系 或 任務(wù) 任 務(wù) ISR OSSemAccept( ) OSSemPend( ) OSSemQuery( ) OSSemPost( ) OSSemPost( ) OSSemAccept( ) OSSemCreate( ) N N 119 創(chuàng)建一個(gè)信號(hào)量 ? OSSemCreate() ?創(chuàng)建一個(gè)信號(hào)量,并對(duì)信號(hào)量的初始計(jì)數(shù)值賦值,該初始值為 0到 65,535之間的一個(gè)數(shù); ?OS_EVENT *OSSemCreate(INT16U t)。 ?t:信號(hào)量的初始值。 ? 執(zhí)行步驟 ?從空閑事件控制塊鏈表中得到一個(gè) ECB; ?初始化 ECB,包括設(shè)置信號(hào)量的初始值、把等待任務(wù)列表清零、設(shè)置 ECB的事件類型等; ?返回一個(gè)指向該事件控制塊的指針。 120 等待一個(gè)信號(hào)量 ? OSSemPend() ?等待一個(gè)信號(hào)量,即操作系統(tǒng)中的 P操作,將信號(hào)量的值減 1; ?OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。 ? 執(zhí)行步驟 ?如果信號(hào)量的計(jì)數(shù)值大于 0,將它減 1并返回; ?如果信號(hào)量的值等于 0,則調(diào)用本函數(shù)的任務(wù)將被阻塞起來(lái),等待另一個(gè)任務(wù)把它喚醒; ?調(diào)用 OSSched()函數(shù),調(diào)度下一個(gè)最高優(yōu)先級(jí)的任務(wù)運(yùn)行。 121 發(fā)送一個(gè)信號(hào)量 ? OSSemPost() ?發(fā)送一個(gè)信號(hào)量,即操作系統(tǒng)中的 V操作,將信號(hào)量的值加 1; ?OSSemPost (OS_EVENT *pevent)。 ? 執(zhí)行步驟 ?檢查是否有任務(wù)在等待該信號(hào)量,如果沒有,將信號(hào)量的計(jì)數(shù)值加 1并返回; ?如果有,將優(yōu)先級(jí)最高的任務(wù)從等待任務(wù)列表中刪除,并使它進(jìn)入就緒狀態(tài); ?調(diào)用 OSSched(),判斷是否需要進(jìn)行任務(wù)切換。 122 無(wú)等待地請(qǐng)求一個(gè)信號(hào)量 ? OSSemAccept() ?當(dāng)一個(gè)任務(wù)請(qǐng)求一個(gè)信號(hào)量時(shí),如果該信號(hào)量暫時(shí)無(wú)效,則讓該任務(wù)簡(jiǎn)單地返回,而不是進(jìn)入等待狀態(tài); ?INT16U OSSemAccept(OS_EVENT *pevent)。 ? 執(zhí)行步驟 ?如果該信號(hào)量的計(jì)數(shù)值大于 0,則將它減 1,然后將信號(hào)量的原有值返回; ?如果該信號(hào)量的值等于 0,直接返回該值 (0)。 123 查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài) ? OSSemQuery() ?查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài); ?INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata)。 ?將指向信號(hào)量對(duì)應(yīng)事件控制塊的指針pevent所指向的 ECB的內(nèi)容拷貝到指向用于記錄信號(hào)量信息的數(shù)據(jù)結(jié)構(gòu)OS_SEM_DATA數(shù)據(jù)結(jié)構(gòu)的指針 pdata所指向的緩沖區(qū)當(dāng)中。 124 任務(wù)間通信 ? 低級(jí)通信 ? 只能傳遞狀態(tài)和整數(shù)值等控制信息,傳送的信息量??; ? 例如:信號(hào)量 ? 高級(jí)通信 ? 能夠傳送任意數(shù)量的數(shù)據(jù); ? 例如:共享內(nèi)存、郵箱、消息隊(duì)列 125 共享內(nèi)存 ?在 ?C/OSII中如何實(shí)現(xiàn)共享內(nèi)存? ? 內(nèi)存地址空間只有一個(gè),為所有的任務(wù)所共享! ? 為了避免競(jìng)爭(zhēng)狀態(tài),需要使用信號(hào)量來(lái)實(shí)現(xiàn)互斥訪問(wèn)。 126 消息郵箱 ? 郵箱 ( MailBox):一個(gè)任務(wù)或 ISR可以通過(guò)郵箱向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量,該指針指向一個(gè)包含了特定 “消息 ” ( message)的數(shù)據(jù)結(jié)構(gòu); ? 必須在 OS_MBOX_EN開關(guān)常量置為 1,這樣 μC/OS 才能支持郵箱。 127 ? 一個(gè)郵箱可能處于兩種狀態(tài): ?滿的狀態(tài):郵箱包含一個(gè)非空指針型變量; ?空的狀態(tài):郵箱的內(nèi)容為空指針 NULL; ? 郵箱的系統(tǒng)服務(wù) ?OSMboxCreate() ?OSMboxPost() ?OSMboxPend() ?OSMboxAccept() ?OSMboxQuery() 128 任務(wù)、 ISR和消息郵箱的關(guān)系 129 郵箱的系統(tǒng)服務(wù)( 1) ? OSMboxCreate():創(chuàng)建一個(gè)郵箱 ?在創(chuàng)建郵箱時(shí),須分配一個(gè) ECB,并使用其中的字段 OSEventPtr指針來(lái)存放消息的地址; ?OS_EVENT *OSMboxCreate(void *msg)。 ?msg:指針的初始值,一般情形下為 NULL。 ? OSMboxPend():等待一個(gè)郵箱中的消息 ?若郵箱為滿,將其內(nèi)容(某消息的地址)返回;若郵箱為空,當(dāng)前任務(wù)將被阻塞,直到郵箱中有了消息或等待超時(shí); ?OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。 130 郵箱的系統(tǒng)服務(wù)( 2) ? OSMboxPost():發(fā)送一個(gè)消息到郵箱中 ?如果有任務(wù)在等待該消息,將其中的最高優(yōu)先級(jí)任務(wù)從等待列表中刪除,變?yōu)榫途w狀態(tài); ?OSMboxPost(OS_EVENT *pevent, void *msg)。 ? OSMboxAccept():無(wú)等待地請(qǐng)求郵箱消息 ?若郵箱為滿,返回它的當(dāng)前內(nèi)容;若郵箱為空,返回空指針; ?OSMboxAccept (OS_EVENT *pevent)。 ? OSMboxQuery():查詢一個(gè)郵箱的狀態(tài) ?OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata); 131 樣例程序( 1) OSMboxCreate()函數(shù) OS_EVENT *CommMbox。 void main(void) { ... OSInit()。 ... CommMbox = OSMboxCreate((void*)0)。 ... OSStart()。 } OSMboxPend()函數(shù) void CommTask(void *pdata) { INT8U err。 void *msg。 pdata = pdata。 for (。) { ... msg =OSMboxPend(CommMbox, 10, amp。
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1