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

正文內(nèi)容

嵌入式實(shí)時(shí)操作系統(tǒng)分析(1)(參考版)

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

【正文】 for (。 void *msg。 ... OSStart()。 void main(void) { ... OSInit()。 ? OSMboxAccept():無(wú)等待地請(qǐng)求郵箱消息 ?若郵箱為滿,返回它的當(dāng)前內(nèi)容;若郵箱為空,返回空指針; ?OSMboxAccept (OS_EVENT *pevent)。 ? OSMboxPend():等待一個(gè)郵箱中的消息 ?若郵箱為滿,將其內(nèi)容(某消息的地址)返回;若郵箱為空,當(dāng)前任務(wù)將被阻塞,直到郵箱中有了消息或等待超時(shí); ?OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。 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)。 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)。 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)。 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)。 121 發(fā)送一個(gè)信號(hào)量 ? OSSemPost() ?發(fā)送一個(gè)信號(hào)量,即操作系統(tǒng)中的 V操作,將信號(hào)量的值加 1; ?OSSemPost (OS_EVENT *pevent)。 120 等待一個(gè)信號(hào)量 ? OSSemPend() ?等待一個(gè)信號(hào)量,即操作系統(tǒng)中的 P操作,將信號(hào)量的值減 1; ?OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。 ?t:信號(hào)量的初始值。 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開(kāi)關(guān)常量置為 1,這樣 μC/OS 才能支持信號(hào)量。 ... 臨界資源 113 ? 當(dāng)處理臨界段代碼時(shí),需要關(guān)中斷,處理完畢后,再開(kāi)中斷; ? 關(guān)中斷時(shí)間是實(shí)時(shí)內(nèi)核最重要的指標(biāo)之一; ? 在實(shí)際應(yīng)用中,關(guān)中斷的時(shí)間很大程度中取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量; ? ?C/OSII定義兩個(gè)宏開(kāi)關(guān)中斷 :OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()。 ... 任務(wù) 1 任務(wù) 2 ... OS_ENTER_CRITICAL()。 112 ... OS_ENTER_CRITICAL()。 當(dāng)某個(gè)任務(wù)要等待一個(gè)事件的發(fā)生時(shí) ,需要調(diào)用本函數(shù) 將 該 任務(wù)從就緒任務(wù)表中刪除,并放到相應(yīng)事件的等待任務(wù)表中 ; ? OSEventTaskWait (OS_EVENT *pevent); ? OSEventTO() ? 由于等待超時(shí)而將任務(wù)置為就緒態(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)。 ? OSEventTaskRdy()。 0 OS_MAX_EVENTS OSEventFreeList OS_EVENT 109 ECB的基本操作 ? OSEventWaitListInit() ? 初始化一個(gè)事件控制塊。 108 空閑 ECB的管理 ? ECB的總數(shù)由用戶所需要的信號(hào)量、郵箱和消息隊(duì)列的總數(shù)決定,由 define OS_MAX_EVENTS定義。 x = OSUnMapTbl[peventOSEventTbl[y]]。= ~OSMapTbl[prio 3]。= ~OSMapTbl[prio amp。 0x07]。 105 最低優(yōu)先級(jí)任務(wù) (即空閑任務(wù),不可能處于等待狀態(tài) ) 56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39 24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 [0] [1] [2] [3] [4] [5] [6] [7] .OSEventGrp OSEventTbl [ OS_LOWEST_PRIO / 8+1 ] X Y 最高優(yōu)先級(jí)任務(wù) 正在等待該事件的任務(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]。當(dāng)某組中有任務(wù)處于等待該事件的狀態(tài)時(shí),對(duì)應(yīng)的位就被置位。 103 任務(wù)和 ISR之間的通信方式 ECB ISR Task Signal Signal Wait Wait Task Task A ISR Task Signal Signal Wait Wait Task Task B Task Task Wait / Signal C ECB ECB ECB Wait / Signal TimeOut 104 等待任務(wù)列表 ? 每個(gè)正在等待某個(gè)事件的任務(wù)被加入到該事件的 ECB的等待任務(wù)列表中,該列表包含兩個(gè)變量 OSEventGrp和 OSEventTbl[]。對(duì)于處于等待狀態(tài)的任務(wù),還可以給它指定一個(gè)最長(zhǎng)等待時(shí)間; ? 多個(gè)任務(wù)可以同時(shí)等待同一個(gè)事件的發(fā)生。OSEventCnt OSEventGrp 101 事件控制塊 ECB數(shù)據(jù)結(jié)構(gòu) 2 0 1 7 6 5 4 3 10 8 9 15 14 13 12 11 18 16 17 23 22 21 20 19 26 24 25 31 30 29 28 27 34 32 33 39 38 37 36 35 42 40 41 47 46 45 44 43 50 48 49 55 54 53 52 51 58 56 57 63 62 61 60 59 /*等待任務(wù)組 */ } OS_EVENT。 /*計(jì)數(shù)器 ( 當(dāng)事件是信號(hào)量時(shí) ) */ INT8U OSEventType。 /*指向消息或消息隊(duì)列的指針 */ INT8U OSEventTbl[OS_EVENT_TBL_SIZE]。 } 96 統(tǒng)計(jì)任務(wù)初始化 97 系統(tǒng)啟動(dòng)后的狀態(tài) 假設(shè)用戶創(chuàng)建的 任務(wù)優(yōu)先級(jí)為 6 98 第三章、實(shí)時(shí)操作系統(tǒng) ?C/OSII 1 3 2 4 ?C/OSII概述 任務(wù)管理 中斷和時(shí)間 管理 任務(wù)之間的通信與 同步 5 存儲(chǔ)管理 99 任務(wù)間通信與同步 ?任務(wù)間通信的管理:事件控制塊 ECB; ?同步與互斥 ? 臨界區(qū)( Critical Sections); ? 信號(hào)量( Semaphores); ? 任務(wù)間通信 ? 郵箱( Message Mailboxes); ? 消息隊(duì)列( Message Queues)。 OSStatRdy = TRUE。 OS_ENTER_CRITICAL()。 OS_EXIT_CRITICAL()。 OS_ENTER_CRITICAL()。 OSStartHighRdy()。 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]。 OSPrioHighRdy = (INT8U)((Y3) + X)。 if (OSRunning == FALSE) { y = OSUnMapTbl[OSRdyGrp]。 /*開(kāi)始多任務(wù)調(diào)度 ! 永不返回 */ } 94 OSStart() void OSStart (void) { INT8U Y。 /* 初始化 uC/OSII */ ... 通過(guò)調(diào)用 OSTaskCreate()或 OSTaskCreateExt() 創(chuàng)建至少一個(gè)任務(wù) 。然而,啟動(dòng) μ C/OSⅡ 之前,用戶至少要建立一個(gè)應(yīng)用任務(wù)。 /* 開(kāi)始多任務(wù)調(diào)度 */ } 91 系統(tǒng)的初始化與啟動(dòng) ? 在調(diào)用 ?C/OSII的任何其它服務(wù)之前,用戶必須首先調(diào)用系統(tǒng)初始化函數(shù) OSInit()來(lái)初始化?C/OS的所有變量和數(shù)據(jù)結(jié)構(gòu) ; ? OSInit()建立空閑任務(wù) OSTaskIdle(),該任務(wù)總是處于就緒狀態(tài),其優(yōu)先級(jí)一般被設(shè)成最低,即OS_LOWEST_PRIO;如果需要, OSInit()還建立統(tǒng)計(jì)任務(wù) OSTaskStat(),并讓其進(jìn)入就緒狀態(tài); ? OSInit()還初始化了 4個(gè)空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū):空閑TCB鏈表 OSTCBFreeList、空閑事件鏈表OSEventFreeList、空閑隊(duì)列鏈表 OSQFreeList和空閑存儲(chǔ)鏈表 OSMemFreeList。 /* 初始化 uC/OSII*/ /* 應(yīng)用程序初始化代碼 ... */ /* 調(diào)用 OSTaskCreate()創(chuàng)建至少一個(gè)任務(wù) */ 允許時(shí)鐘節(jié)拍中斷 。負(fù)責(zé)啟動(dòng)定時(shí)器 90 時(shí)鐘節(jié)拍的啟動(dòng) ? 用戶必須在多任務(wù)系統(tǒng)啟動(dòng)以后再開(kāi)啟時(shí)鐘節(jié)拍器,也就是在調(diào)用 OSStart()之后; ? 在調(diào)用 OSStart()之后做的第一件事是初始化定時(shí)器中斷。 89 何時(shí)啟動(dòng)系統(tǒng)定時(shí)器 ? 如果在 OSStart之前啟動(dòng)定時(shí)器,則系統(tǒng)可能無(wú)法正確執(zhí)行完 OSStartHighRdy ? OSStart函數(shù)直接調(diào)用 OSStartHighRdy去執(zhí)行最高優(yōu)先級(jí)的任務(wù), OSStart不返回。 ? OSTimeSet():設(shè)置該計(jì)數(shù)器的值。 88 系統(tǒng)時(shí)間 ? 每隔一個(gè)時(shí)鐘節(jié)拍,發(fā)生一個(gè)時(shí)鐘中斷,將一個(gè) 32位的計(jì)數(shù)器 OSTime加 1; ? 該計(jì)數(shù)器在用戶調(diào)用 OSStart()初始化多任務(wù)和4,294,967,295個(gè)節(jié)拍執(zhí)行完一遍的時(shí)候從 0開(kāi)始計(jì)數(shù)。 87 OSTimeDlyResume() ?OSTimeDlyResume():讓處在延時(shí)期的任務(wù)提前結(jié)束延時(shí),進(jìn)入就緒狀態(tài); ?使用方法 ? INT8U OSTimeDlyResume (INT8U prio)。 OSSched()。 } OSTCBCurOSTCBDly = ticks。= ~OSTCBCurOSTCBBitX) == 0) { OSRdyGrp amp。 84 OSTimeDLY() void OSTimeDly (INT16U ticks)
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1