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

正文內(nèi)容

第5章嵌入式操作系統(tǒng)-資料下載頁

2025-07-20 12:32本頁面
  

【正文】 向數(shù)據(jù)結(jié)構(gòu) OS_SEM_DATA的指針 pdata, 用該指針來存儲信號量的有關(guān)信息。 第 5章  嵌入式操作系統(tǒng)    3.消息郵箱管理  消息郵箱 (簡稱郵箱 )是 μ C/OSⅡ 中的一種通信機制。在使用消息郵箱時,通常先定義一個指針型的變量,該指針指向一個包含了消息內(nèi)容的特定數(shù)據(jù)結(jié)構(gòu)。發(fā)送消息的任務(wù)或中斷服務(wù)子程序把這個指針型的變量送往郵箱,接收消息的任務(wù)從郵箱中取出該指針變量,從而實現(xiàn)任務(wù)間或中斷服務(wù)子程序與任務(wù)間的信息交換。 μ C/OSⅡ 提供 6種對消息郵箱的操作,它們通過以下函數(shù)實現(xiàn): 第 5章  嵌入式操作系統(tǒng)    (1) OSMboxCreate(): 建立一個郵箱。使用郵箱之前,必須先建立郵箱。通過調(diào)用函數(shù) OSMboxCreate()可以創(chuàng)建一個郵箱,并且指定其初始值。這個初始值一般是 NULL, 但也可以使其在最開始就包含一條消息。如果使用郵箱的目的是為了通知一個事件的發(fā)生 (即只發(fā)送一條消息 ),則要初始化該郵箱為空 (即 NULL), 因為在開始時事件很有可能還沒發(fā)生;如果用郵箱共享某些資源,則要初始化該郵箱為一個非空的指針,在這種情況下,郵箱被當成一個二值信號量使用。 第 5章  嵌入式操作系統(tǒng)     (2) OSMboxDel(): 刪除一個郵箱。函數(shù) OSMboxDel()用來刪除一個郵箱。使用該函數(shù)時要特別注意,多個任務(wù)可能還在試圖操作已經(jīng)刪除的郵箱。因此,在刪除郵箱之前,必須首先刪除可能操作該郵箱的所有任務(wù)。   (3) OSMboxPend(): 等待郵箱中的消息。通過調(diào)用可以實現(xiàn)等待一則消息發(fā)送到郵箱中的功能。如果郵箱中有消息 (非 NULL指針 ),則從該郵箱中取出該消息,返回給調(diào)用該函數(shù)的任務(wù),并將 NULL指針存入郵箱中;如果郵箱為空,則調(diào)用該函數(shù)的任務(wù)進入掛起態(tài),等待另一個任務(wù) (或中斷服務(wù)子程序 )通過郵箱發(fā)送消息或者等待超時。 第 5章  嵌入式操作系統(tǒng)     (4) OSMboxPost(): 向郵箱發(fā)送一則消息。向郵箱發(fā)送一則消息可以通過調(diào)用函數(shù) OSMboxPost()來實現(xiàn)。該函數(shù)除了發(fā)送消息外,還會檢查是否有任務(wù)在等待該郵箱中的消息,如果有,就會將其喚醒并進行一次任務(wù)切換。但是,如果從中斷服務(wù)子程序中調(diào)用 OSMboxPost(), 則不會發(fā)生任務(wù)切換?! ?(5) OSMboxPostOpt(): 向郵箱發(fā)送一則消息??梢允褂靡粋€功能更強的函數(shù) OSMboxPostOpt()向郵箱中發(fā)送消息。該函數(shù)是 μ C/OSⅡ 新增加的函數(shù),可以替代 OSMboxPost()。 此外,函數(shù) OSMboxPostOpt()可以向等待郵箱的所有任務(wù)發(fā)送消息 (廣播 )。 第 5章  嵌入式操作系統(tǒng)     (6) OSMboxAccept(): 無等待地從郵箱中得到一則消息。當需要無等待地從郵箱中獲得消息時,可以調(diào)用函數(shù)OSMboxAccept()來實現(xiàn)。如果調(diào)用了該函數(shù),即使郵箱為空,應(yīng)用程序也可以從郵箱中得到消息,而不必使任務(wù)進入掛起態(tài)。調(diào)用函數(shù) OSMboxAccept()的任務(wù)必須檢查其返回值,如果返回值是 NULL, 則說明郵箱是空的,沒有可用的消息;如果該值是非 NULL值,則說明郵箱中有消息可用。中斷服務(wù)子程序在試圖得到一則消息時,應(yīng)該使用函數(shù)OSMboxAccept(), 而不能使用函數(shù) OSMboxPend()?! ?(7) OSMboxQuery(): 查詢一個郵箱的狀態(tài)。函數(shù)OSMboxQuery()使得應(yīng)用程序可以隨時查詢一個郵箱的當前狀態(tài)。 第 5章  嵌入式操作系統(tǒng)    4.消息隊列管理  消息隊列 (簡稱隊列 )是 μ C/OSⅡ 的另一種通信機制。它可以使一個任務(wù)或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送以指針定義的變量。針對不同的應(yīng)用,每個指針指向的包含了消息的數(shù)據(jù)結(jié)構(gòu)的類型也有所不同。 μ C/OSⅡ 提供了 9個對消息隊列進行操作的函數(shù): OSQCreate()、 OSQPDel()、 OSQPend()、OSQPost()、 OSQPostFront()、 OSQPostOpt()、 OSQAccept()、OSQFlush()和 OSuery()。 其中,除了 OSQPost()、OSQPostFront()和 OSQFlush(), 其他幾個函數(shù)的操作特點都與消息郵箱管理的功能函數(shù)類似。這里重點介紹一下這 3個函數(shù)。 第 5章  嵌入式操作系統(tǒng)     (1) OSQPost(): 向消息隊列發(fā)送一則消息 (FIFO)。 在向消息隊列發(fā)送一則消息時,需要注意插入的新消息在隊列中的位置。如果調(diào)用函數(shù) OSQPost(), 則使用指針變量 .OSQIn(指向消息隊列中插入下一條消息的位置的指針 )作為指向下一個插入消息的單元指針。新消息在消息隊列中的位置滿足先入先出 (FIFO)的原則。第 5章  嵌入式操作系統(tǒng)    (2) OSQPostFront(): 向消息隊列發(fā)送一則消息 (LIFO)。函數(shù) OSQPostFront()與 OSQPost()類似,只是在插入新的消息到消息隊列中時,使用 .OSQOut(指向消息隊列中下一條取出消息的位置的指針 )而不是 .OSQIn, 作為指向下一個插入消息的單元指針。因此,新消息在消息隊列中的位置滿足后入先出 (LIFO)的原則。    (3) OSQFlush(): 清空消息隊列。函數(shù) OSQFlush()允許清空一個消息隊列中的所有消息,從而使該隊列可以重新開始使用。 第 5章  嵌入式操作系統(tǒng) 內(nèi)存管理    為了避免直接使用 ANSI C中的 malloc()和 free()兩個函數(shù)動態(tài)分配 /釋放內(nèi)存所造成的內(nèi)存碎片以及執(zhí)行時間不確定等缺點,在 μC/OSⅡ 中,操作系統(tǒng)把連續(xù)的大塊內(nèi)存按分區(qū)來管理。每個分區(qū)中包含整數(shù)個大小相同的內(nèi)存塊。利用這種機制, μC/OSⅡ 對 malloc()和 free()函數(shù)進行了改進,使得它們可以分配和釋放固定大小的內(nèi)存塊。而且,這樣使得malloc()和 free()函數(shù)的執(zhí)行時間是確定的?! ?μ C/OSⅡ 對內(nèi)存的管理主要是通過內(nèi)存控制塊 (MCB,Memery Control Blocks)和 4個功能函數(shù)來實現(xiàn)的。 第 5章  嵌入式操作系統(tǒng)    1.內(nèi)存控制塊    為了便于管理內(nèi)存, μC/OSⅡ 使用內(nèi)存控制塊來跟蹤每一個內(nèi)存分區(qū),并對系統(tǒng)中的每個內(nèi)存分區(qū)都建立它自己的內(nèi)存控制塊。內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)如下所示:Typedef struct{void *OSMemAddr。 /* 指向內(nèi)存分區(qū)起始地址的指針 */void *OSMemFreeList。 /* 指向下一個空余內(nèi)存控制塊或下一個空余內(nèi)存塊的指針 */INT32U OSMemBlkSize。/* 內(nèi)存分區(qū)中內(nèi)存塊的大小 */ INT32U OSMemNBlks。 /* 內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)量 */INT32U OSMemNFree。 /* 內(nèi)存分區(qū)中當前可以獲得的空余內(nèi)存塊數(shù)量 */} OS_MEM。 第 5章  嵌入式操作系統(tǒng)    2.建立內(nèi)存分區(qū) (OSMemCreate())   在使用一個分區(qū)之前,必須調(diào)用函數(shù) OSMemCreate()先建立該內(nèi)存分區(qū)。如果函數(shù) OSMemCreate()操作失敗,則它將返回一個 NULL指針;否則,它將返回一個指向內(nèi)存控制塊的指針。對內(nèi)存管理的其他操作,如 OSMemGet()、 OSMemPut()及OSMemQuery()等,都需要通過該指針進行。 第 5章  嵌入式操作系統(tǒng)     3.分配內(nèi)存塊 (OSMemGet())   當調(diào)度某任務(wù)執(zhí)行時,必須先從已建立的內(nèi)存分區(qū)中為該任務(wù)申請一個內(nèi)存塊。應(yīng)用程序通過調(diào)用函數(shù) OSMemGet()來從內(nèi)存分區(qū)中申請一個內(nèi)存塊。顯然,應(yīng)用程序必須知道內(nèi)存塊的大小,并且在使用時不能超過其容量。當應(yīng)用程序不再使用這個內(nèi)存塊后,必須及時將其釋放,重新放回到相應(yīng)的內(nèi)存分區(qū)中。 第 5章  嵌入式操作系統(tǒng)     4.釋放內(nèi)存塊 (OSMemPut())    函數(shù) OSMemPut()用來將應(yīng)用程序不再使用的一個內(nèi)存塊釋放并放回到相應(yīng)的內(nèi)存分區(qū)中。需要注意的是, OSMemPut()并不知道該內(nèi)存塊是屬于哪個內(nèi)存分區(qū)。   5.查詢內(nèi)存分區(qū)的狀態(tài) (OSMemQuery())   μ C/OSⅡ 提供 OSMemQuery()函數(shù)來查詢一個特定內(nèi)存分區(qū)的狀態(tài)。通過調(diào)用該函數(shù),可以知道特定內(nèi)存分區(qū)中內(nèi)存塊的大小、可用內(nèi)存塊數(shù)目以及已經(jīng)使用的內(nèi)存塊數(shù)目等信息。所有這些信息都存放在 OS_MEM_DATAS數(shù)據(jù)結(jié)構(gòu)中。 第 5章  嵌入式操作系統(tǒng) μC/OSⅡ 的初始化   μ C/OSⅡ 在調(diào)用其他內(nèi)核服務(wù)之前,首先要調(diào)用系統(tǒng)初始化函數(shù) OSInit()來對系統(tǒng)進行初始化。 OSInit()初始化 μ C/OSⅡ 所有變量和數(shù)據(jù)結(jié)構(gòu),并建立空閑任務(wù) OS_TaskIdle()。 空閑任務(wù) OS_TaskIdle()總是處于就緒態(tài),它的優(yōu)先級總是設(shè)成最低,即 OS_LOWEST_PRIO。 如果統(tǒng)計任務(wù)允許OS_TASK_STAT_EN和 OS_TASK_CREAT_EXT_EN都設(shè)為 1,則空閑任務(wù) OS_TaskIdle()還要統(tǒng)計任務(wù) OS_TaskStat()并且使其進入就緒態(tài)。統(tǒng)計任務(wù)的優(yōu)先級總是設(shè)為OS_LOWEST_PRIO1。 此外, μ C/OSⅡ 還初始化了 5個空的數(shù)據(jù)結(jié)構(gòu)緩沖區(qū)。每個緩沖區(qū)都是單向鏈表,允許 μ C/OSⅡ從緩沖區(qū)迅速取得或釋放一個緩沖區(qū)中的元素。 第 5章  嵌入式操作系統(tǒng) μC/OSⅡ 的啟動    通過調(diào)用 OSStart()能夠?qū)崿F(xiàn) μC/OSⅡ 的多任務(wù)的啟動。但是,在啟動 μC/OSⅡ 之前,必須至少建立一個應(yīng)用任務(wù),其過程如下所示:   void main(void)    { OSInit()。 /* 初始化 μC/OSⅡ */.../* 通過調(diào)用 OSTaskCreat()或 OSTaskCreatExt()創(chuàng)建至少一個應(yīng)用任務(wù) */...OSStart()。 /* 開始多任務(wù)調(diào)度。 OSStart()永遠不會返回 */   } 第 5章  嵌入式操作系統(tǒng) μ C/OSⅡ 在 ARM上的移植 μC/OSⅡ 的移植條件    (1) 處理器的 C編譯器能夠產(chǎn)生可重入代碼。 μ C/OSⅡ 是一個多任務(wù)實時內(nèi)核,一段代碼 (如一個函數(shù) )可能被多個任務(wù)調(diào)用,代碼的可重入性是保證多任務(wù)正確執(zhí)行的基礎(chǔ)??芍厝氪a是指可以被多個任務(wù)調(diào)用而數(shù)據(jù)不會被破壞的一段代碼。也就是說,可重入代碼在執(zhí)行過程中如果被中斷,能夠在中斷結(jié)束后繼續(xù)正確運行,不會因為在代碼中斷時被其他任務(wù)重新調(diào)用而破壞代碼中的數(shù)據(jù)??芍厝氪a或者只使用局部變量,即變量保存在 CPU寄存器中或堆棧中;或者使用全局變量,則要對全局變量予以保護。下面兩個例子可以說明可重入代碼和不可重入代碼的區(qū)別。 第 5章  嵌入式操作系統(tǒng) void temp (int *x, int *y) { t temp。temp = *x。*x = *y。 *y = temp。} int tempvoid temp (int *x, int *y) { temp = *x。*x = *y。 *y = temp。} 第 5章  嵌入式操作系統(tǒng)     (2) 處理器支持中斷并能產(chǎn)生定時中斷 (通常在 10~ 100 Hz之間 )。 μC/OSⅡ 通過處理器產(chǎn)生的定時器中斷來實現(xiàn)多任務(wù)之間的調(diào)度。 而在 ARM7TDMI的處理器上可以產(chǎn)生定時器中斷?! ?(3) 用 C語言可以在程序中開 /關(guān)中斷。在第 2章介紹過,ARM處理器中包含一個 CPSR寄存器,該寄存器包括一個全局的中斷禁止位,控制它就可以打開或關(guān)閉中斷。在 μ C/OSⅡ中,可以通過 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()兩個宏來控制處理器的相應(yīng)位進行開 /關(guān)中斷的操作。 第 5章  嵌入式操作系統(tǒng)    (4) 處理器支持能夠容納一定量 (幾千字節(jié) )數(shù)據(jù)的存儲硬件堆棧。 對于一些只有 10根地址線的 8位控制器,芯片最多可訪問 1 KB的存儲單元,在這樣的條件下,移植 μ C/OSⅡ 是比較困難的。 第 5章  嵌入式操作系統(tǒng)    (5) 處理器有將堆棧指針和其他 CPU寄存器的內(nèi)容讀出并存儲到堆?;騼?nèi)存中的指令。 μ C/OSⅡ 進行任務(wù)調(diào)度時,首先將當前任務(wù)的 CPU寄存器存放到該任務(wù)的堆棧中,然后再從另一個新任務(wù)的堆棧中恢復(fù)其原來的寄存器的值,使之繼續(xù)運行。所以,寄存器的入棧 /出棧操作是 μ C/OSⅡ 多任務(wù)調(diào)度的基礎(chǔ)。在 ARM處理器中,匯編指令 stmfd可將所有寄存器壓棧,指令 ldmfd可將所有的寄存器出棧。 第 5章  嵌入式操作系統(tǒng) μC/OSⅡ 的移植步驟  移植 μC/OSⅡ 主要完成以下兩部分工作?! ?1.設(shè)置與處理器和編譯器相關(guān)的代碼    define語句定義的、與處理器相關(guān)的常數(shù)、宏以及類型。因此,所有需要完成的基本配
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1