版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、嵌入式實時操作系統(tǒng),第五章 信號量集,R,5.2.3 向信號量集發(fā)信號,任務可以通過調(diào)用函數(shù)OSFlagPost( )向信號量集發(fā)信號。該函數(shù)的原型如下: OS_FLAGS OSFlagPost( OS_FLAG_GRP *pgrp, /信號量集指針 OS_FLAGS flags, /選擇所要發(fā)送的信號 INT8U opt, /信號有效的選項 INT8 *err /錯誤信息 ); 所謂任務向信號量集發(fā)信號,就是對信號量集標志組中的信號進行置1(置位)或置0(復位)的操作。至于對信號量集中的哪些信號進行操作,由函數(shù)中的參數(shù)flags來指定;對指定的信號是置1還是置0,由函數(shù)中的參數(shù)opt來指定(
2、opt=OS_FLAG_SET為置1操作;opt=OS_FLAG_CLR為置0操作)。,例如,要對信號量集FlagPtr發(fā)送信號,待發(fā)送的信號為OSFlagFlags中的第0位和第3位并且是要把它們置1,則調(diào)用時的代碼如下: OS_FLAGS OSFlagPost( FlagPtr, /信號量集指針 (OS_FLAGS)9, /選擇所要發(fā)送的信號 OS_FLAG_SET, /信號有效的選項 ,例5-1 設計一個有三個任務的應用程序,這三個任務分別叫做MyTask、YouTask和HerTask。要求用一個信號量集來控制MyTask的運行,即任務YouTask發(fā)送一個信號,任務HerTask發(fā)送
3、一個信號,當這兩個任務都發(fā)了信號之后,MyTask才能運行。 答:應用程序的代碼如下: /*Test*/ #include “includes.h” #define TASK_STK_SIZE 512 /任務堆棧長度 #define N_MESSAGES 128 /定義消息隊列長度 OS_STK StartTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū) OS_STK MyTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū) OS_STK YouTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū) OS_STK HerTaskStkTASK_STK_SIZE; /定
4、義任務堆棧區(qū) INT16S key; /用于退出的鍵 char *s1=“MyTask正在運行”; char *s2=“YouTask正在運行”; char *s3=“HerTask正在運行”; INT8U err; INT8U y=0; /字符顯示位置,OS_FLAG_GRP *Sem_F; void StartTask(void *data); /聲明起始任務 void MyTask(void *data); /聲明任務 void YouTask(void *data); /聲明任務 void HerTask(void *data); /聲明任務 /*主函數(shù)*/ void main(voi
5、d) OSInit(); /初始化c/os-II PC_DOSSaveReturn( ); /保存DOS環(huán)境 PC_VectSet(uCOS,0SCtxSw); /安裝c/os-II中斷 Sem_F=OSFlagCreate(0, /啟動多任務管理 ,/*任務StartTask*/ void StartTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=pdata; OS_ENTER_CRITICAL( ); PC_VectSet(0 x08,OSTickISR); /安裝時鐘中斷向量 PC_Set
6、TickRate(OS_TICKS_PER_SEC); /設置c/os-II時鐘頻率 OS_EXIT_CRITICAL( ); OSStatInit(); /初始化統(tǒng)計任務 OSTaskCreate(MyTask, /創(chuàng)建任務MyTask (void *)0, /給任務傳遞參數(shù) /使任務的優(yōu)先級別為4,OSTaskCreate(HerTask, /創(chuàng)建任務HerTask (void *)0, /給任務傳遞參數(shù) /等待3s ,/*任務MyTask*/ void MyTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endi
7、f pdata=pdata; for( ; ; ) OSFlagPend( /請求信號量集 Sem_F, (OS_FLAGS)3, /請求第0位和第1位信號 OS_FLAG_WAIT_SET_ALL, /信號都為1表示有效 0, ,PC_DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); OSTimeDlyHMSM(0,0,2,0); /等待2s ,/*任務YouTask*/ void YouTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=p
8、data; for( ; ; ) PC_DispStr(10,+y, s2, DISP_BGND_BLACK+DISP_FGND_WHITE); OSTimeDlyHMSM(0,0,8,0); /等待8s OSFlagPost( /發(fā)送信號量集 Sem_F, (OS_FLAGS)2, /給第1位發(fā)信號 OS_FLAG_SET, /信號置1 0, /等待2s ,/*任務HerTask*/ void HerTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=pdata; for( ; ; ) PC_Di
9、spStr(10,+y, s3, DISP_BGND_BLACK+DISP_FGND_WHITE); OSTimeDlyHMSM(0,0,8,0); /等待8s OSFlagPost( /發(fā)送信號量集 Sem_F, (OS_FLAGS)1, /給第0位發(fā)信號 OS_FLAG_SET, /信號置1 /等待1s /*END*/,例5-2 把例5-1中任務MyTask調(diào)用的請求信號量集函數(shù)OSFlagPend( )改為無等待請求函數(shù)OSFlagAccept( ),運行該程序后,觀察運行結(jié)果并與例5-2應用程序的運行結(jié)果進行比較。 答:任務MyTask修改后的代碼如下: /*任務MyTask*/ vo
10、id MyTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=pdata for( ; ; ) OSFlagAccept( /無等待的請求信號量集 Sem_F, (OS_FLAGS)3, /請求第0位和第1位信號 OS_FLAG_WAIT_SET_ALL, /信號都為1表示有效 ,PC_DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); OSTimeDlyHMSM(0,0,2,0); /等待2s ,5.2.4 查詢信號量集的狀態(tài),調(diào)用函數(shù)OSFl
11、agQuery( )可以查詢一個信號量集的狀態(tài)。該函數(shù)的原型如下: OS_FLAGS OSFlagQuery( OS_FLAG_GRP *pgrp, /待查詢的信號量集的指針 INT8U *err; /錯誤信息 ); 函數(shù)的返回值為被查詢信號量集標志組的成員OSFlagFlags,應用程序可以用它來完成一些更為復雜的控制。,例5-3 修改例5-2應用程序,使任務MyTask可以根據(jù)信號的不同狀態(tài)實現(xiàn)不同的功能。 答:修改后三個任務的代碼如下: OS_FLAGS Flags; /定義變量 /*任務MyTask*/ void MyTask(void *pdata) #if OS_CRITICAL_
12、METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=pdata for( ; ; ) OSFlagQuery( /查詢信號量集的狀態(tài) Sem_F, ,switch(Flags) case1: s1=“第0位信號有效”; PC_DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); break; case2: s1=“第1位信號有效”; PC_DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); break;,case3: s1=“第0位和第1位信號都有效”; PC_
13、DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); break; OSFlagPost( /發(fā)送信號量集 Sem_F, (OS_FLAGS)3, /給第0、1位發(fā)信號 OS_FLAG_CLR, /信號置0 /等待2s ,/*任務YouTask*/ void YouTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=pdata; for( ; ; ) PC_DispStr(10,+y, s2, DISP_BGND_BLACK+DISP_FGND_W
14、HITE); OSTimeDlyHMSM(0,0,4,0); /延時4s OSFlagPost( /發(fā)送信號量集 Sem_F, (OS_FLAGS)2, /給第1位發(fā)信號 OS_FLAG_SET, /信號置1 /等待2s ,/*任務HerTask*/ void HerTask(void *pdata) #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif pdata=pdata; for( ; ; ) PC_DispStr(10,+y, s3, DISP_BGND_BLACK+DISP_FGND_WHITE); if(y14) OSFlagPost( /發(fā)送信號量集 Sem_F, (OS_FLAGS)1, /給第0位發(fā)信號 OS_FLAG_SET, /信號置1 /等待1s /*END*/,5.2.5 刪除信號量集,通過調(diào)用函數(shù)OSFlagDle( )可以刪除一個信號
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋼結(jié)構(gòu)幕墻完工報告編制方案
- 四川申論真題及答案
- 水滸傳出題目及答案
- 2026年中信出版社編輯崗位的常見問題及答案解析
- 2025年企業(yè)采購管理與供應商評估規(guī)范手冊
- 中小學實驗人員培訓制度
- 宣傳部人員培訓制度
- 帶教師資培訓及考核制度
- 2026年IT技術支持工程師面試題庫與解析
- 安全環(huán)保教育培訓制度
- 代位追償培訓課件
- 2024內(nèi)蒙古畜牧業(yè)溫室氣體減排策略與路徑研究報告
- 醫(yī)院培訓課件:《醫(yī)務人員不良執(zhí)業(yè)行為記分管理辦法》
- DJG330521-T 102-2024 企業(yè)能級工資集體協(xié)商工作評價規(guī)范
- 物體打擊事故培訓課件
- 豬場產(chǎn)房技術員述職報告
- 數(shù)據(jù)分析崗位轉(zhuǎn)正匯報
- 2025年港口碼頭安全隱患排查計劃
- STEAM教育與高中地理教學融合的活動設計研究
- 基礎設施以工代賑項目可行性研究報告
- 國際法教學大綱
評論
0/150
提交評論