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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2641|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

MCU_OS調(diào)度器的實現(xiàn)(微操作系統(tǒng)程序)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:685385 發(fā)表于 2022-1-9 18:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
       MCU的微操作系統(tǒng),簡單來說就是一個算法,而任何算法都是是基于數(shù)據(jù)結(jié)構(gòu)的

學習大型OS,還是需要數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的,對于非軟件專業(yè)的人,可能沒有學過。。。。。。

       還好,有微小的算法系統(tǒng),可以實現(xiàn)MCU軟件的設(shè)計,這個比較容易理解,需要的可以討論,

這個是基于一本書上的實例代碼,把他的主要內(nèi)容總結(jié)了一下,下載可以直接套用,   自己再編寫也沒多少代碼。。。。。。。。。。。。。。。。。。。

單片機源程序如下:
  1. #include "OS.h"
  2. // 中斷服務(wù)函數(shù) ,沒歌1s 來調(diào)度這個函數(shù)

  3. //調(diào)度器的實現(xiàn)

  4. void SCH_Update()
  5. {
  6.         unsigned char Index;
  7.        
  8.         for(Index =0;Index < SCH_MAX_TASKS;Index++)
  9.         {
  10.                 if(SCH_tasks_G[Index].pTask)  // 任務(wù)存在,不為0  ,這個涉及,任務(wù)的刪除
  11.                 {
  12.                           //判斷這個任務(wù)是否要執(zhí)行
  13.                         if(0 == SCH_tasks_G[Index].Delay)
  14.                         {
  15.                                 SCH_tasks_G[Index].RunMe += 1;   //這個任務(wù)要運行
  16.                                
  17.                                 //判斷這個任務(wù)是周期性,還是單次任務(wù)
  18.                                 if(SCH_tasks_G[Index].Period)
  19.                                 {
  20.                                         SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
  21.                                        
  22.                                 }                                       
  23.                                
  24.                         }
  25.                         else
  26.                         {
  27.                                 SCH_tasks_G[Index].Delay -= 1;
  28.                         }
  29.                 }
  30.                
  31.         }
  32.        
  33. }




  34. //任務(wù)的添加

  35. unsigned char SCH_Add_Task(void (*pTask)(),const unsigned int Delay,const unsigned int Period)
  36. {
  37.         unsigned char Index = 0;
  38.        
  39.         while((SCH_tasks_G[Index].pTask != 0)&&(Index < SCH_MAX_TASKS))
  40.         {
  41.                 Index++;
  42.         }
  43.        
  44.         if(Index == SCH_MAX_TASKS)
  45.         {
  46.                 //ERROE_CODE =
  47.                
  48.                 return SCH_MAX_TASKS;
  49.         }
  50.        
  51.         SCH_tasks_G[Index].pTask = pTask;
  52.         SCH_tasks_G[Index].Delay = Delay;
  53.         SCH_tasks_G[Index].Period = Period;
  54.        
  55.         SCH_tasks_G[Index].RunMe = 0;
  56.        
  57.         return Index;
  58. }


  59. // 任務(wù)的刪除

  60. unsigned char SCH_Delete_Task(Task_ID)
  61. {
  62.         unsigned char Return_Code = 0;
  63.        
  64.         //判斷這個地方的函數(shù)指針是否為0
  65.         if(0 == SCH_tasks_G[Task_ID].pTask)
  66.         {
  67.                 // 這里沒有任務(wù).....
  68.                 //
  69.                 //設(shè)置全局錯誤變量    ,也可以不要這個錯誤機制
  70.                 //Error =
  71.                 Return_Code = 0;
  72.         }
  73.         else
  74.         {
  75.                 Return_Code = 1;
  76.         }
  77.         SCH_tasks_G[Task_ID].pTask = 0x0000;
  78.         SCH_tasks_G[Task_ID].Delay = 0;
  79.         SCH_tasks_G[Task_ID].Period = 0;
  80.         SCH_tasks_G[Task_ID].RunMe = 0;
  81.         return Return_Code;
  82. }


  83. //216
  84. void SCH_Dispatch_Tasks()
  85. {
  86.         unsigned char Index;
  87.         //所有的任務(wù)輪訓之后,再釋放CPU
  88.         for(Index = 0;Index < SCH_MAX_TASKS;Index++)
  89.         {
  90.                 if(SCH_tasks_G[Index].RunMe > 0)
  91.                 {
  92.                         (*SCH_tasks_G[Index].pTask)();  //執(zhí)行任務(wù)
  93.                        
  94.                         SCH_tasks_G[Index].RunMe -= 1;  // 復(fù)位/減小RunMe的標志
  95.                        
  96.                         //周期性任務(wù)會自動再次執(zhí)行
  97.                        
  98.                         // 如果這個是單次任務(wù),將他從隊列中刪除,不是單次任務(wù),就需要手動刪除
  99.                         if(0 == SCH_tasks_G[Index].Period)
  100.                         {
  101.                                 SCH_Delete_Task(Index);
  102.                         }
  103.                        
  104.                 }
  105.         }
  106. }



  107. //啟動調(diào)度器

  108. void SCH_Start()
  109. {
  110.          //EA= 1;
  111.         ;
  112. }





  113. void AX()
  114. {
  115. }


  116. int main()
  117. {
  118.         //
  119.         unsigned char Task_ID;
  120.         Task_ID = SCH_Add_Task(AX,1000,0);
  121.        
  122.         SCH_Start();
  123.        
  124.         while(1)
  125.         {
  126.                 SCH_Dispatch_Tasks();
  127.         }
  128.        
  129. }
復(fù)制代碼

Keil代碼下載:
onr.zip (12.68 KB, 下載次數(shù): 18)

評分

參與人數(shù) 1黑幣 +70 收起 理由
admin + 70 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:301191 發(fā)表于 2022-1-12 01:30 | 只看該作者
頂一下
回復(fù)

使用道具 舉報

板凳
ID:262 發(fā)表于 2022-1-13 00:17 | 只看該作者
這種思路對于大項目還是很有幫助的
回復(fù)

使用道具 舉報

地板
ID:65241 發(fā)表于 2022-3-1 20:09 | 只看該作者
SCH_Start()里該運行些什么呢?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 日本午夜一区二区三区 | 四虎最新 | 欧洲一区视频 | 成人美女免费网站视频 | 欧美福利 | av免费观看在线 | 国产精品综合一区二区 | 日韩欧美一区二区三区在线播放 | 成人h动漫亚洲一区二区 | 日本三级黄视频 | 365夜爽爽欧美性午夜免费视频 | 欧美福利精品 | 精品国产乱码久久久久久丨区2区 | 亚洲国产精品久久久 | 亚洲欧美视频 | 日本精品一区 | 国产福利在线视频 | 日韩在线观看 | 亚洲 欧美 综合 | 国产精品国产三级国产aⅴ中文 | 欧美精品综合 | 久草色播 | www久久| 久久久久久久久99 | 精品少妇一区二区三区在线播放 | 国产精品视频免费播放 | 欧美日韩三级 | av天天操 | 99亚洲视频 | 欧美日韩在线免费 | 91视视频在线观看入口直接观看 | 日本一卡精品视频免费 | 一区二区在线 | 久久精品国产亚洲一区二区三区 | 日韩网站在线 | 成人精品视频免费 | 91色综合 | 亚洲日韩视频 | 日韩在线一区二区三区 | www国产亚洲精品 |