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

正文內(nèi)容

緒、jeanjlabrosse的故事80年代末,我設計了一個基于(編輯修改稿)

2024-10-07 08:06 本頁面
 

【文章內(nèi)容簡介】 問共享資源結(jié)束以后,釋放信號量,調(diào)用該函數(shù)。先檢查是否有等待該信號量的任務。沒有,信號量計數(shù)器加 1,有,則調(diào)用調(diào)度器 OS_Sched()。 32 ? 刪除信號量 OS_EVENT *OSSemDel( OS_EVENT * pevent, INT8U opt, INT8U *err) opt OS_DEL_NO_PEND 沒有等待任務刪除 OS_DEL_ALLWAYS 立即刪除 只能任務執(zhí)行,不能在中斷服務程序中刪除 ? 查詢信號量的狀態(tài) INT8U OSSemQuery( OS_EVENT * pevent OS_SEM_DATA *pdata) pdata是一個結(jié)構指針,存儲信號量的狀態(tài)。 33 ( 3)消息郵箱管理 消息郵箱是 uC/OSII中的一種通信機制,通常使用時要先定義一個指針型的變量該指針指向一個包含了消息內(nèi)容的特定數(shù)據(jù)結(jié)構。發(fā)送消息的任務或中斷服務子程序把這個變量送往郵箱,接收消息的任務從郵箱中取出該指針變量,完成信息交換。 uC/OSII提供 6種對消息郵箱的操作,它們通過以下函數(shù)實現(xiàn): ?創(chuàng)建 OS_EVENT * OSMoxCreate( void * msg) Msg為消息指針,一般初始為 NULL。 34 ? 向消息郵箱發(fā)送消息 INT8U OSMboxPost( OS_EVENT * pevent, void * msg) 發(fā)送廣播消息 INT8U OSMboxPostOpt( OS_EVENT * pevent, void * msg, INT8U opt) opt: OS_POST_OPT_BROADCAST 廣播消息 OS_POST_OPT_NONE 最高優(yōu)先級 35 ? 請求消息郵箱 void * OSMboxPend( OS_EVENT * pevent, INT16U timeout, INT8U *err) ? 查詢郵箱狀態(tài) INT8U OSMboxQuery( OS_EVENT * pevent, OS_MBOX_DATA *pdata) ? 刪除郵箱 OS_EVENT *OSMboxDel( OS_EVENT * pevent, INT8U opt, INT8U *err) 36 ( 4)消息隊列管理 消息隊列是 uC/OSII的另一種通信機制,它可以使一個任務或中斷服務子程序向另一個任務發(fā)送以指針定義的變量。 uC/OSII提供了 9個對消息隊列進行操作的函數(shù)。 ? 創(chuàng)建 先創(chuàng)建一個指針數(shù)組,然后用該數(shù)組來創(chuàng)建消息隊列 OS_EVENT OSQCreate( void ** start,INT16U size) ? 請求消息隊列 void* OSQPend( OS_EVENT * pevent, INT16U timeout,INT8U *err) 37 ? 向消息隊列發(fā)送消息 INT8U OSQPost( OS_EVENT * pevent,void * msg) 工作方式 FIFO INT8U OSQPostFront( OS_EVENT * pevent,void * msg) 工作方式 LIFO 發(fā)送廣播消息 INT8U OSQPostOpt( OS_EVENT * pevent,void * msg, INT8U opt) 38 ? 清空消息隊列 INT8U OSQFlush ( OS_EVENT * pevent ) ? 刪除消息隊列 OS_EVENT * OSQDel( OS_EVENT * pevent ) ? 查詢消息隊列 INT8U OSuery( OS_EVENT * pevent, OS_Q_DATA *pdata) 39 4. 181。C/ OSII操作系統(tǒng)的文件系統(tǒng) 181。C/ OSII操作系統(tǒng)的文件體系結(jié)構如圖 2所示 , 其核心主要可分為以下 3部分: ( 1) 應用軟件層 , 指的是基于 181。C/ OSII的應用程序代碼 。 ( 2) 內(nèi)核的核心代碼層 , 主要包括 8個源代碼文件 。 這 8個源代碼文件為 、 、 、 、 、 ,其主要實現(xiàn)的功能分別是核心管理 、 事件管理 、 存儲管理 、 消息隊列管理 、 定時管理 、 信號量處理 、 消息管理和任務調(diào)度等 , 這部分代碼與處理器無關 。 ( 3) 系統(tǒng)設置與移植層 。 系統(tǒng)設置部分的代碼由兩個頭文件 。 其主要功能是用來配置事件控制塊的數(shù)目以及是否包含消息管理的相關代碼等 。 與處理器相關的移植代碼部分包括:一個頭文件 、 一個匯編文件 C代碼文件 。 系統(tǒng)設置與移植層與具體應用和處理器相關 , 在隨后的 181。C/ OSII的移植和開發(fā)過程中 , 用戶所需要關注的就是這部分文件 。 40 圖 2 181。C/ OSII文件體系結(jié)構 41 181。C/ OSII 操作系統(tǒng)的初始化 在調(diào)用 181。C/ OSII操作系統(tǒng)的其他服務之前 , 181。C/ OSII操作系統(tǒng)要求用戶首先調(diào)用系統(tǒng)初始化函數(shù) OSInit()。 執(zhí)行 OSInit()函數(shù)后將初始化 181。C/ OSII所有的變量和數(shù)據(jù)結(jié)構 , 另外 OSInit()會建立空閑任務 , 并且這個任務總是處于就緒狀態(tài)的 。 空閑任務OSTaskldle()函數(shù)的優(yōu)先級總是設置成為最低級別 , 即OS_LOWEST_PRIO。 多任務的啟動是用戶通過調(diào)用 OSStart()函數(shù)來實現(xiàn)的 。 然而 ,在啟動 181。C/ OSII之前 , 用戶至少要建立一個應用任務 , 例如: void main() { OSInit()。 .. 通過 OSTaskCreate()或 OSTaskCreateExt()創(chuàng)建至少一個任務 .. OSStart()。 /*開始多任務調(diào)度 , OSStart()永遠都不會返回 */ } 42 181。C/ OSII系統(tǒng)在 ARM系統(tǒng)中的移植 所謂移植,就是指使一個實時操作系統(tǒng)能夠在其他的微處理器平臺上進行運行。由于 181。C/OSII的主要代碼都是由標準的 C語言寫成的,所以,一般來說移植過程并不復雜。 181。C/ OSII移植條件 雖然 181。C/ OSII的大部分源代碼是用 C語言寫成的 ,但是 , 仍需要用匯編語言完成一些與微處理器相關的代碼 。 例如 , 181。C/ OSII在讀寫微處理器 、寄存器時只能通過匯編語言來實現(xiàn) 。 這是因為 181。C/ OSII在設計的時候就已經(jīng)充分考慮了可移植性 。 為了要使 181。C/ OSII可以正常工作 , 處理器必須要滿足如下要求: 43 1). 微處理器的 C編譯器能產(chǎn)生可重入代碼 可重入的代碼指的是一段代碼 (如一個函數(shù) )可以被多個任務同時調(diào)用 , 而不必擔心會破壞其內(nèi)部的數(shù)據(jù) 。 也就是說 , 可重入型函數(shù)在任何時候都可以被中斷執(zhí)行 , 也不會因為在函數(shù)中斷的時候被其他的任務重新調(diào)用 , 影響函數(shù)中的數(shù)據(jù) 。 可重入代碼或者只使用局部變量 , 即變量保存在 CPU寄存器中或堆棧中;或者使用全局變量 ,則要對全局變量予以保護 。 通常的 C編譯器 , 把局部變量分配在棧中 。 所以 , 多次調(diào)用同一個函數(shù) , 可以保證每次的局部變量互不受影響 。而全局變量 , 在多次調(diào)用函數(shù)的時候 , 必然受到影響 。 代碼的可重入性是保證完成多任務的基礎 , 除了在 C程序中使用局部變量以外 , 還需要 C編譯器的支持 。 基于ARM的 SDT、 ADS等集成開發(fā)環(huán)境 , 都可以生成可重入的代碼 。 44 2). 在程序中可以使用 c語言打開或者關閉中斷 在 181。C/ OSII中 , 可以通過進入中斷屏蔽的宏定義OS_ENTER_CRITICAL()或者退出中斷屏蔽的宏定義 OS EXIT_CRITICAL()來控制系統(tǒng)關閉中斷或者打開中斷 ,這需要微處理器的支持 。 在目前的 ARM系列的微處理器上 , 都可以設置相應的寄存器來關閉或者打開系統(tǒng)的所有中斷 。 3) . 微處理器支持中斷 , 并且能產(chǎn)生定時中斷 (通常在10Hz1000Hz之間 )。 181。C/ OSII是通過微處理器產(chǎn)生定時的中斷來實現(xiàn)多任務之間的調(diào)度的 。 4) . 微處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧 ,并具有將堆棧指針和其他 CPU寄存器讀寫到堆棧 (或者內(nèi)存 )的指令 。 5) 181。C/ OSII進行任務調(diào)度的時候 , 會把當前任務的 CPU內(nèi)部寄存器的內(nèi)容存放到此任務的堆棧中 。 然后 , 再從另一個任務的堆棧中恢復原來的工作寄存器 , 繼續(xù)運行另一個任務 。 所以 , 寄存器中內(nèi)容的入棧和出棧是 181。C/ OSII多任務調(diào)度的基礎 。 45 181。C/ OSII的移植步驟 在的移植過程中 , 使用的是基于 ARM公司架構的軟件開發(fā)工具作為編譯器 , 所值得關注的問題是與微處理器相關的代碼 , 這部分主要包括一個頭文件 、 一個匯編文件 個 C代碼文件 。 1) . 設置頭文件 ( 1) 與編譯器相關的數(shù)據(jù)類型 define INT8U unsigned char define INTl6U unsigned short define INT32U unsigned long define OS_STK unsigned long define BOOLEAN int define OS_CPU_SR unsigned long define INT8S char 因為不同的微處理器有不同的字長,所以 181。C/ OSⅡ 的移植包括了一系列的類型定義以確保其可移植性。 46 用戶必須將任務堆棧的數(shù)據(jù)類型定義到 181。C/ OSII操作系統(tǒng)中 ,這個過程是通過為 OS_STK聲明正確的 C語言數(shù)據(jù)類型來完成的 。由于使用的微處理器上的堆棧成員是 16位的 , 所以將 OS_TSK聲明為無符號整形數(shù)據(jù)類型 。 值得注意的是 , 所有的任務堆棧都必須使用 OS_STK聲明數(shù)據(jù)類型 。 ( 2) 進入中斷屏蔽的宏定義 OS_ENTER_CRITICAL()和退出中斷屏蔽的宏定義 OS_EXIT_CRITICAL() extern int INTS_OFF(void); extern void INTS_ON(void); define OS_ENTER_CRITICAL() {cpu_sr = INTS_OFF(); } define OS_EXIT_CRITICAL() {if(cpu_sr==0) INTS_ON(); } 與所有的實時內(nèi)核一樣 , 181。C/ OSII操作系統(tǒng)在進行任務切換時需要先禁止中斷在訪問代碼的臨界區(qū) , 并且在訪問完畢后重新允許中斷 。 這就使得 181。C/ OSII能夠保護臨界區(qū)代碼免受多任務或中斷服務例程 (ISR)的破壞 。 在 S3C44B0微處理器上是通過OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()兩個函數(shù)來實現(xiàn)開 、關中斷的 。 47 ( 3) 棧增長方向標 OS_STK_GROWTH define OS_STK_GROWTH 1 define STACKSIZE 256 絕大多數(shù)的微處理器的堆棧是從高地址向低地址增長的 , 但是有些微處理器是采用相反方式工作的 。 鑒于這種情況 181。C/ OSII操作系統(tǒng)被設計成為這兩種情況都可以處理 , 只要在結(jié)構常量OS_STK_GROWTH中指定堆棧的生長方式就可以了 。例如: 設 OS_STK_GROWTH為 0表示堆棧從下往上增長 。
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1