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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11532|回復: 3
打印 上一主題 下一主題
收起左側

uc/os-ii操作系統中任務間的同步與通信問題--實例(注釋很詳細)

[復制鏈接]
跳轉到指定樓層
樓主
本例用了BC4.5軟件,在DOS環境模擬uc/os-ii ,這是本人發表在論壇上的一篇筆記;放到這里以便常溫故。

最近本人在學習uc/os-ii操作系統,收獲真的很大,uc/os-ii系統中我覺得任務間的同步與通信是有點難;本人將學習筆記整理出來放在這里,希望有高人能指出錯誤的地方,歡迎指教,謝謝!

/*建立兩個用戶任務:MyTask和YouTask。這兩個任務都要訪問一個共享資源S,但是YouTask訪問需要的時間要長一些,而MYTASK訪問的時間要短點,這樣就不可避免的出現了在任務YOUTASK訪問S期間,任務MYTASK也來訪問S,從而出現干擾*/#include "INCLUDES.h"
#define  TASK_STK_SIZE  512       /* 任務堆棧長度*/            
char   ss;
OS_STK        MyTaskStk[TASK_STK_SIZE];
OS_STK        YouTaskStk[TASK_STK_SIZE];
INT8U  y1=0,y2=0;   //字符顯示位置  
char *s="原始數據";
void  MyTask(void *data);    /* 聲明任務      */
void  YouTask(void *data);
/*
****************************************************************************
*                       MAIN主函數
***************************************************************************
*/
void  main (void)
{
  OSInit();      /* 初始化uC/OS-II   */
  PC_DOSSaveReturn();     /* 保存DOS環境     */
  PC_VectSet(uCOS, OSCtxSw);     /* 安裝uC/OS-II的中斷 */
  OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 0); /*創建起始函數*/
  OSStart();     /* 啟動多任務管理   */
}
/*
**************************************************************************
*       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);       /* 安裝時鐘中斷向量  */
    PC_SetTickRate(OS_TICKS_PER_SEC);     /* 設置時鐘頻率 */
    OS_EXIT_CRITICAL();
    OSStatInit();      /* 初始化統計任務   */
    OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 2); /*創建任務函數*/
    for (;;)
    {
     s = "MyTask get source S";
     PC_DispStr(2,++y1,s,DISP_BGND_BLACK+DISP_FGND_WHITE);/*任務*/   
     //如果恩下ESC鍵,則退出UC/OS-II
        if (PC_GetKey(&key) == TRUE)
         {                     
            if (key == 0x1B)
            {         
                PC_DOSReturn();     /* Return to DOS  */
            }
        }
        OSTimeDly(500);   /* 等待500個時鐘節拍 */
    }
}

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)    /*條件語句“OSTime<1000”非常重要!*/
  {
   //sprintf(ss,"%d",OSTimeGet());
   PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);/*本實驗的精髓語句*/
  }     
        OSTimeDly(100);    //等待100個時鐘節拍               
    }
}
/*在YOUTASK訪問資源S期間高優先級的任務MYTASK也訪問了S,從而干擾了任務YOUTASK對共享資源S的訪問,運行后顯示表明在任務YOUTASK的延時期間前,共享資源S的內容發生了變化。筆記:
YouTask任務分析:在YouTask任務中程序代碼雖然較少但是程序流程相當復雜!必須搞懂每句的含義,提高程序分析能力!分析程序一定要注意流程!下面將YouTask任務中重要部分語句(紅色注釋部分)分析如下:
1,在MyTask任務掛起同時執行“PC_DispStr(28,++y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語句,所以在顯示屏相應的位置幾乎同時顯示"MyTask get source S"和"YouTask get source S";
2,操作系統的每個任務都在for死循環里完成;“OSTimeSet(0);”語句的意思是,每進入一次for循環里就給系統時間全局變量OSTime重新賦值,在這里就是將OSTime清零;為下一語句“while(OSTime<1000)”做鋪墊;
3,本任務中有兩個循環體,另一個就是“while(OSTime<1000)”,因為前面有“OSTimeSet(0);”語句,所以系統每次進入YOUTASK任務的for循環里都會執行“while(OSTime<1000)”語句,進入“while(OSTime<1000)”語句之后,全局變量OSTime會以設定的時鐘節拍不斷自加1,當全局變量OSTime等于1000時,系統就會退出“while(OSTime<1000)”語句,執行“ OSTimeDly(100);”語句,也就是說在OSTime的值在0到1000的時間段里程序會一直執行“PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語句,即顯示相應的內容;
4,因為在YouTask任務中有兩句即“PC_DispStr(28,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語句和
“PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語句,這樣就會在同一個任務中出現爭搶s資源的現象(即在內存同一位置幾乎同時被賦不同的值)而造成程序出錯干擾,這是不允許的!。所以在實驗現象中在“55,y2”坐標處先顯示“YouTask get source S”再變成顯示"MyTask get source SS"的現象。
5,注意:a,在死循環for里才是要創建任務的內容,換句話說任務需要執行的內容只能寫在死循環for里;b,本實驗中,兩個任務都應用了“OSTimeDly(ticks)”函數,當兩個任務同時掛起時系統運行哪個任務呢?操作系統不會讓cpu閑著,這時會選擇優先級最高的任務運行!
6,系統進入YouTask任務時,執行“PC_DispStr(28,++y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語句,在顯示屏相應的位置顯示"MyTask get source S",接著進入while循環執行
“PC_DispStr(55,y2,s,DISP_BGND_BLACK+DISP_FGND_WHITE);”語句即顯示"YouTask get source S",程序很快就會退出while循環執行下面的“ OSTimeDly(100);”語句即掛起YouTask任務,就在掛起YouTask任務的同時系統選擇運行MyTask任務,s同時被賦值為"MyTask get source S",所以在實驗現象中就出現在“55,y2”坐標處先顯示“YouTask get source S”再馬上變成顯示"MyTask get source SS"的現象(為什么是兩個“SS”?)。
7,本實驗中MyTask任務占用CPU的時長由程序代碼的精度決定。可以通過實驗驗證。
8,在時序上,s先在MyTask任務中被賦值,再執行YouTask任務s再次被賦值,接著還是在YouTask任務的while中s 再次被賦值;在這個過程中兩個任務沒有對s資源發生爭搶,而在YouTask任務的“ OSTimeDly(100);”語句中兩個任務對s資源發生了爭搶,導致出現“55,y2”處出現干擾。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩1
回復

使用道具 舉報

沙發
ID:201329 發表于 2018-4-10 21:47 | 只看該作者
樓主很認真,贊一個。在此提出自己的一點看法,不吝賜教。
1、MyTask先運行,在第一列打印出“MyTask get source S”。在MyTask任務OSTimeDly(500)期間,操作系統進行任務調度,此時,就緒的YouTask開始運行,在第二列打印出“YouTask get source S”。
2、 OSTimeSet(0)使OSTime變量置零,進入while(OSTime<1000)循環。因為此時MyTask任務控制塊的OSTCBDLY變量還未為0【OSTimeDly(500)設置MyTask任務控制塊的OSTCBDLY變量為500】,即MyTask還處于未就緒狀態,所以一直在while(OSTime<1000)循環內第三列打印“YouTask get source S”
3、當OSTime還未計到1000而MyTask任務OSTimeDly(500)已經完成【即MyTask任務控制塊的OSTCBDLY變為0】,MyTask任務就緒,操作系統再次進行任務調度,就緒的MyTask開始運行,在第一列打印出“MyTask get source S”。同時改變s變量的值。4、 MyTas再次進入運行OSTimeDly(500),系統返回YouTask任務的while(OSTime<1000)循環繼續執行。因為s變量已經在MyTask中改變,所以可以看到輸出窗口第三列先輸出“YouTask get source S”,隨后即變為“MyTask get source S”。【因為You是三個字節,My是兩個字節,所以“YouTask get source S”最后的S沒有抹除,所以會出現顯示"MyTask get source SS"的現象】
5、當OSTime還未計到1000而MyTask任務OSTimeDly(500)又已經完成【因為第一次系統從MyTask任務調度到YouTask任務以及YouTask任務的執行花費了時間,MyTask任務控制塊的OSTCBDLY變量的值其實已經小于500了】,操作系統再調MyTas,在第一列打印出“MyTask get source S”。
6、OSTime終于計到1000,又進入了YouTask任務OSTimeDly(100)。此時兩個任務都沒有就緒,系統調度空閑任務。隨后YouTask首先就緒,在第二列又打出“YouTask get source S”。


總結:任務資源共享干擾發生在3。程序運行果如圖


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

20180410214632.png

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:523499 發表于 2019-4-28 11:13 來自手機 | 只看該作者
請問 在youtask中的while如何在mytask延時到的時候就發生任務調度
回復

使用道具 舉報

地板
ID:137412 發表于 2019-6-11 14:03 | 只看該作者
2015年的帖子,到現在都沒人糾正其中的錯誤,也是蠻悲哀的了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜在线 | 一级午夜aaa免费看三区 | 亚洲aⅴ一区二区 | 亚洲一二三在线观看 | 亚洲欧美第一视频 | 欧美在线视频网 | 欧美午夜激情在线 | 久久精品视频91 | 午夜影院 | 精品国产一区二区三区四区在线 | 午夜在线观看视频 | 九九热在线免费视频 | 久久久久久久国产精品影院 | 亚洲精品精品 | 黄色一级电影在线观看 | 久久精品成人一区 | 国产精品3区 | 久久噜噜噜精品国产亚洲综合 | 久久亚洲国产精品 | www国产成人免费观看视频,深夜成人网 | 久久久xx| 户外露出一区二区三区 | 一区二区三区欧美 | 91美女在线观看 | 一区二区三区在线观看视频 | 亚洲午夜视频 | 久久久久久亚洲精品 | 天堂中文资源在线 | 欧美色偷拍| 日韩一区二区av | 国产片淫级awww| 日本欧美在线观看视频 | 久久久久久高潮国产精品视 | 日韩在线中文字幕 | 国产午夜精品一区二区三区 | 欧美一二精品 | 欧美一区二区三区,视频 | 国产一区二区三区四区 | 中文字幕在线免费观看 | 欧美一级黑人aaaaaaa做受 | 高清一区二区视频 |