久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: uc/os-ii操作系統(tǒng)中任務(wù)間的同步與通信問(wèn)題--實(shí)例(注釋很詳細(xì)) [打印本頁(yè)]

作者: liuyy    時(shí)間: 2015-1-12 15:29
標(biāo)題: uc/os-ii操作系統(tǒng)中任務(wù)間的同步與通信問(wèn)題--實(shí)例(注釋很詳細(xì))
本例用了BC4.5軟件,在DOS環(huán)境模擬uc/os-ii ,這是本人發(fā)表在論壇上的一篇筆記;放到這里以便常溫故。

最近本人在學(xué)習(xí)uc/os-ii操作系統(tǒng),收獲真的很大,uc/os-ii系統(tǒng)中我覺(jué)得任務(wù)間的同步與通信是有點(diǎn)難;本人將學(xué)習(xí)筆記整理出來(lái)放在這里,希望有高人能指出錯(cuò)誤的地方,歡迎指教,謝謝!

/*建立兩個(gè)用戶任務(wù):MyTask和YouTask。這兩個(gè)任務(wù)都要訪問(wèn)一個(gè)共享資源S,但是YouTask訪問(wèn)需要的時(shí)間要長(zhǎng)一些,而MYTASK訪問(wèn)的時(shí)間要短點(diǎn),這樣就不可避免的出現(xiàn)了在任務(wù)YOUTASK訪問(wèn)S期間,任務(wù)MYTASK也來(lái)訪問(wèn)S,從而出現(xiàn)干擾*/#include "INCLUDES.h"
#define  TASK_STK_SIZE  512       /* 任務(wù)堆棧長(zhǎng)度*/            
char   ss;
OS_STK        MyTaskStk[TASK_STK_SIZE];
OS_STK        YouTaskStk[TASK_STK_SIZE];
INT8U  y1=0,y2=0;   //字符顯示位置  
char *s="原始數(shù)據(jù)";
void  MyTask(void *data);    /* 聲明任務(wù)      */
void  YouTask(void *data);
/*
****************************************************************************
*                       MAIN主函數(shù)
***************************************************************************
*/
void  main (void)
{
  OSInit();      /* 初始化uC/OS-II   */
  PC_DOSSaveReturn();     /* 保存DOS環(huán)境     */
  PC_VectSet(uCOS, OSCtxSw);     /* 安裝uC/OS-II的中斷 */
  OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 0); /*創(chuàng)建起始函數(shù)*/
  OSStart();     /* 啟動(dòng)多任務(wù)管理   */
}
/*
**************************************************************************
*       STARTUP TASK
************************************************************************
*/
void  MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3    /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
    INT16S   key;             /*用于退出的建*/
    pdata = pdata;    /* Prevent compiler warning   */
    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);       /* 安裝時(shí)鐘中斷向量  */
    PC_SetTickRate(OS_TICKS_PER_SEC);     /* 設(shè)置時(shí)鐘頻率 */
    OS_EXIT_CRITICAL();
    OSStatInit();      /* 初始化統(tǒng)計(jì)任務(wù)   */
    OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 2); /*創(chuàng)建任務(wù)函數(shù)*/
    for (;;)
    {
     s = "MyTask get source S";
     PC_DispStr(2,++y1,s,DISP_BGND_BLACK+DISP_FGND_WHITE);/*任務(wù)*/   
     //如果恩下ESC鍵,則退出UC/OS-II
        if (PC_GetKey(&key) == TRUE)
         {                     
            if (key == 0x1B)
            {         
                PC_DOSReturn();     /* Return to DOS  */
            }
        }
        OSTimeDly(500);   /* 等待500個(gè)時(shí)鐘節(jié)拍 */
    }
}

void  YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3   /*Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
INT8U err;
pdata=pdata;
for (;;)
{
  s = "YouTask get source S";
  PC_DispStr(28,++y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);
  OSTimeSet(0);    /*置OSTime為0,注意此句的作用*/
  while(OSTime<1000)    /*條件語(yǔ)句“OSTime<1000”非常重要!*/
  {
   //sprintf(ss,"%d",OSTimeGet());
   PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);/*本實(shí)驗(yàn)的精髓語(yǔ)句*/
  }     
        OSTimeDly(100);    //等待100個(gè)時(shí)鐘節(jié)拍               
    }
}
/*在YOUTASK訪問(wèn)資源S期間高優(yōu)先級(jí)的任務(wù)MYTASK也訪問(wèn)了S,從而干擾了任務(wù)YOUTASK對(duì)共享資源S的訪問(wèn),運(yùn)行后顯示表明在任務(wù)YOUTASK的延時(shí)期間前,共享資源S的內(nèi)容發(fā)生了變化。筆記:
YouTask任務(wù)分析:在YouTask任務(wù)中程序代碼雖然較少但是程序流程相當(dāng)復(fù)雜!必須搞懂每句的含義,提高程序分析能力!分析程序一定要注意流程!下面將YouTask任務(wù)中重要部分語(yǔ)句(紅色注釋部分)分析如下:
1,在MyTask任務(wù)掛起同時(shí)執(zhí)行“PC_DispStr(28,++y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語(yǔ)句,所以在顯示屏相應(yīng)的位置幾乎同時(shí)顯示"MyTask get source S"和"YouTask get source S";
2,操作系統(tǒng)的每個(gè)任務(wù)都在for死循環(huán)里完成;“OSTimeSet(0);”語(yǔ)句的意思是,每進(jìn)入一次for循環(huán)里就給系統(tǒng)時(shí)間全局變量OSTime重新賦值,在這里就是將OSTime清零;為下一語(yǔ)句“while(OSTime<1000)”做鋪墊;
3,本任務(wù)中有兩個(gè)循環(huán)體,另一個(gè)就是“while(OSTime<1000)”,因?yàn)榍懊嬗小癘STimeSet(0);”語(yǔ)句,所以系統(tǒng)每次進(jìn)入YOUTASK任務(wù)的for循環(huán)里都會(huì)執(zhí)行“while(OSTime<1000)”語(yǔ)句,進(jìn)入“while(OSTime<1000)”語(yǔ)句之后,全局變量OSTime會(huì)以設(shè)定的時(shí)鐘節(jié)拍不斷自加1,當(dāng)全局變量OSTime等于1000時(shí),系統(tǒng)就會(huì)退出“while(OSTime<1000)”語(yǔ)句,執(zhí)行“ OSTimeDly(100);”語(yǔ)句,也就是說(shuō)在OSTime的值在0到1000的時(shí)間段里程序會(huì)一直執(zhí)行“PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語(yǔ)句,即顯示相應(yīng)的內(nèi)容;
4,因?yàn)樵赮ouTask任務(wù)中有兩句即“PC_DispStr(28,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語(yǔ)句和
“PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語(yǔ)句,這樣就會(huì)在同一個(gè)任務(wù)中出現(xiàn)爭(zhēng)搶s資源的現(xiàn)象(即在內(nèi)存同一位置幾乎同時(shí)被賦不同的值)而造成程序出錯(cuò)干擾,這是不允許的!。所以在實(shí)驗(yàn)現(xiàn)象中在“55,y2”坐標(biāo)處先顯示“YouTask get source S”再變成顯示"MyTask get source SS"的現(xiàn)象。
5,注意:a,在死循環(huán)for里才是要?jiǎng)?chuàng)建任務(wù)的內(nèi)容,換句話說(shuō)任務(wù)需要執(zhí)行的內(nèi)容只能寫(xiě)在死循環(huán)for里;b,本實(shí)驗(yàn)中,兩個(gè)任務(wù)都應(yīng)用了“OSTimeDly(ticks)”函數(shù),當(dāng)兩個(gè)任務(wù)同時(shí)掛起時(shí)系統(tǒng)運(yùn)行哪個(gè)任務(wù)呢?操作系統(tǒng)不會(huì)讓cpu閑著,這時(shí)會(huì)選擇優(yōu)先級(jí)最高的任務(wù)運(yùn)行!
6,系統(tǒng)進(jìn)入YouTask任務(wù)時(shí),執(zhí)行“PC_DispStr(28,++y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語(yǔ)句,在顯示屏相應(yīng)的位置顯示"MyTask get source S",接著進(jìn)入while循環(huán)執(zhí)行
“PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語(yǔ)句即顯示"YouTask get source S",程序很快就會(huì)退出while循環(huán)執(zhí)行下面的“ OSTimeDly(100);”語(yǔ)句即掛起YouTask任務(wù),就在掛起YouTask任務(wù)的同時(shí)系統(tǒng)選擇運(yùn)行MyTask任務(wù),s同時(shí)被賦值為"MyTask get source S",所以在實(shí)驗(yàn)現(xiàn)象中就出現(xiàn)在“55,y2”坐標(biāo)處先顯示“YouTask get source S”再馬上變成顯示"MyTask get source SS"的現(xiàn)象(為什么是兩個(gè)“SS”?)。
7,本實(shí)驗(yàn)中MyTask任務(wù)占用CPU的時(shí)長(zhǎng)由程序代碼的精度決定。可以通過(guò)實(shí)驗(yàn)驗(yàn)證。
8,在時(shí)序上,s先在MyTask任務(wù)中被賦值,再執(zhí)行YouTask任務(wù)s再次被賦值,接著還是在YouTask任務(wù)的while中s 再次被賦值;在這個(gè)過(guò)程中兩個(gè)任務(wù)沒(méi)有對(duì)s資源發(fā)生爭(zhēng)搶,而在YouTask任務(wù)的“ OSTimeDly(100);”語(yǔ)句中兩個(gè)任務(wù)對(duì)s資源發(fā)生了爭(zhēng)搶,導(dǎo)致出現(xiàn)“55,y2”處出現(xiàn)干擾。



作者: 帥帥進(jìn)城    時(shí)間: 2018-4-10 21:47
樓主很認(rèn)真,贊一個(gè)。在此提出自己的一點(diǎn)看法,不吝賜教。
1、MyTask先運(yùn)行,在第一列打印出“MyTask get source S”。在MyTask任務(wù)OSTimeDly(500)期間,操作系統(tǒng)進(jìn)行任務(wù)調(diào)度,此時(shí),就緒的YouTask開(kāi)始運(yùn)行,在第二列打印出“YouTask get source S”。
2、 OSTimeSet(0)使OSTime變量置零,進(jìn)入while(OSTime<1000)循環(huán)。因?yàn)榇藭r(shí)MyTask任務(wù)控制塊的OSTCBDLY變量還未為0【OSTimeDly(500)設(shè)置MyTask任務(wù)控制塊的OSTCBDLY變量為500】,即MyTask還處于未就緒狀態(tài),所以一直在while(OSTime<1000)循環(huán)內(nèi)第三列打印“YouTask get source S”
3、當(dāng)OSTime還未計(jì)到1000而MyTask任務(wù)OSTimeDly(500)已經(jīng)完成【即MyTask任務(wù)控制塊的OSTCBDLY變?yōu)?】,MyTask任務(wù)就緒,操作系統(tǒng)再次進(jìn)行任務(wù)調(diào)度,就緒的MyTask開(kāi)始運(yùn)行,在第一列打印出“MyTask get source S”。同時(shí)改變s變量的值。4、 MyTas再次進(jìn)入運(yùn)行OSTimeDly(500),系統(tǒng)返回YouTask任務(wù)的while(OSTime<1000)循環(huán)繼續(xù)執(zhí)行。因?yàn)閟變量已經(jīng)在MyTask中改變,所以可以看到輸出窗口第三列先輸出“YouTask get source S”,隨后即變?yōu)椤癕yTask get source S”。【因?yàn)閅ou是三個(gè)字節(jié),My是兩個(gè)字節(jié),所以“YouTask get source S”最后的S沒(méi)有抹除,所以會(huì)出現(xiàn)顯示"MyTask get source SS"的現(xiàn)象】
5、當(dāng)OSTime還未計(jì)到1000而MyTask任務(wù)OSTimeDly(500)又已經(jīng)完成【因?yàn)榈谝淮蜗到y(tǒng)從MyTask任務(wù)調(diào)度到Y(jié)ouTask任務(wù)以及YouTask任務(wù)的執(zhí)行花費(fèi)了時(shí)間,MyTask任務(wù)控制塊的OSTCBDLY變量的值其實(shí)已經(jīng)小于500了】,操作系統(tǒng)再調(diào)MyTas,在第一列打印出“MyTask get source S”。
6、OSTime終于計(jì)到1000,又進(jìn)入了YouTask任務(wù)OSTimeDly(100)。此時(shí)兩個(gè)任務(wù)都沒(méi)有就緒,系統(tǒng)調(diào)度空閑任務(wù)。隨后YouTask首先就緒,在第二列又打出“YouTask get source S”。


總結(jié):任務(wù)資源共享干擾發(fā)生在3。程序運(yùn)行果如圖


20180410214632.png (8.33 KB, 下載次數(shù): 202)

20180410214632.png

作者: Cyoungdig    時(shí)間: 2019-4-28 11:13
請(qǐng)問(wèn) 在youtask中的while如何在mytask延時(shí)到的時(shí)候就發(fā)生任務(wù)調(diào)度
作者: jpcarson    時(shí)間: 2019-6-11 14:03
2015年的帖子,到現(xiàn)在都沒(méi)人糾正其中的錯(cuò)誤,也是蠻悲哀的了。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩在线视频免费观看 | 国产又粗又猛又爽又黄 | 日本国产视频 | 国产美女永久免费无遮挡 | 中文字幕在线免费观看 | 激情五月婷婷丁香 | 四虎影院永久免费 | 久久久久九九九 | 五月激情综合网 | 国产日韩中文字幕 | 国产免费久久 | 久久人人爽 | 97色在线| 狠狠的干| 欧美综合久久 | 免费成人小视频 | 天天干天天摸 | 国产精品久久久久久久午夜 | 日韩精品中文字幕在线观看 | 午夜精品久久久久久久99黑人 | 黄色小视频在线播放 | 三级a毛片 | 色污污| 羞羞的视频在线观看 | h视频免费在线观看 | 青青草成人在线 | 日韩一级免费 | 久久av在线| 欧美性猛交xxxx乱大交退制版 | 欧美成人精品欧美一级乱黄 | 激情视频网址 | 国产欧美精品一区二区 | 日韩精品一区二区三区免费视频 | 成年人一级片 | 日韩视频免费在线观看 | 国产成人精品一区 | 四虎www| 日本成人免费网站 | 久久黄色 | 午夜小视频在线观看 | 99黄色|