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

正文內(nèi)容

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

2025-04-29 06:25本頁面
  

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