找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2694|回復(fù): 3
收起左側(cè)

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

  [復(fù)制鏈接]
ID:685385 發(fā)表于 2022-1-9 18:38 | 顯示全部樓層 |閱讀模式
       MCU的微操作系統(tǒng),簡單來說就是一個算法,而任何算法都是是基于數(shù)據(jù)結(jié)構(gòu)的

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

       還好,有微小的算法系統(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ù)輪訓(xùn)之后,再釋放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 共享資料的黑幣獎勵!

查看全部評分

回復(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ù) 返回頂部 返回列表