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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2682|回復: 3
收起左側

MCU_OS調度器的實現(微操作系統程序)

  [復制鏈接]
ID:685385 發表于 2022-1-9 18:38 | 顯示全部樓層 |閱讀模式
       MCU的微操作系統,簡單來說就是一個算法,而任何算法都是是基于數據結構的

學習大型OS,還是需要數據結構基礎的,對于非軟件專業的人,可能沒有學過。。。。。。

       還好,有微小的算法系統,可以實現MCU軟件的設計,這個比較容易理解,需要的可以討論,

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

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

  3. //調度器的實現

  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)  // 任務存在,不為0  ,這個涉及,任務的刪除
  11.                 {
  12.                           //判斷這個任務是否要執行
  13.                         if(0 == SCH_tasks_G[Index].Delay)
  14.                         {
  15.                                 SCH_tasks_G[Index].RunMe += 1;   //這個任務要運行
  16.                                
  17.                                 //判斷這個任務是周期性,還是單次任務
  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. //任務的添加

  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. // 任務的刪除

  60. unsigned char SCH_Delete_Task(Task_ID)
  61. {
  62.         unsigned char Return_Code = 0;
  63.        
  64.         //判斷這個地方的函數指針是否為0
  65.         if(0 == SCH_tasks_G[Task_ID].pTask)
  66.         {
  67.                 // 這里沒有任務.....
  68.                 //
  69.                 //設置全局錯誤變量    ,也可以不要這個錯誤機制
  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.         //所有的任務輪訓之后,再釋放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)();  //執行任務
  93.                        
  94.                         SCH_tasks_G[Index].RunMe -= 1;  // 復位/減小RunMe的標志
  95.                        
  96.                         //周期性任務會自動再次執行
  97.                        
  98.                         // 如果這個是單次任務,將他從隊列中刪除,不是單次任務,就需要手動刪除
  99.                         if(0 == SCH_tasks_G[Index].Period)
  100.                         {
  101.                                 SCH_Delete_Task(Index);
  102.                         }
  103.                        
  104.                 }
  105.         }
  106. }



  107. //啟動調度器

  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. }
復制代碼

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

評分

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

查看全部評分

回復

使用道具 舉報

ID:301191 發表于 2022-1-12 01:30 | 顯示全部樓層
頂一下
回復

使用道具 舉報

ID:262 發表于 2022-1-13 00:17 | 顯示全部樓層
這種思路對于大項目還是很有幫助的
回復

使用道具 舉報

ID:65241 發表于 2022-3-1 20:09 | 顯示全部樓層
SCH_Start()里該運行些什么呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品美女视频 | 国产精品99久久免费观看 | 日韩av成人在线 | 日本精品一区 | 男女羞羞视频在线观看 | 欧美日韩成人影院 | 成人久久 | 亚州综合一区 | 亚洲精品久久久久久下一站 | 欧美日在线 | 欧美网站一区 | 国产精品第2页 | 一级国产精品一级国产精品片 | 亚洲成人黄色 | 紧缚调教一区二区三区视频 | 欧美亚洲日本 | 人人玩人人添人人澡欧美 | 亚洲国产精品成人综合久久久 | 久久久久久亚洲精品 | 国产一区二区三区 | 亚洲精品一区二三区不卡 | 粉嫩在线 | 欧美日日日日bbbbb视频 | www.国产一区| 一区二区三区四区在线播放 | 性色视频 | 无毛av| 欧美日韩国产一区 | 精品欧美一区二区精品久久久 | 免费一级黄色 | 欧美日韩精品一区 | www.欧美视频 | 成人小视频在线免费观看 | 成人在线视频免费看 | 国产三级精品视频 | 天天干国产 | 在线日韩福利 | 国产一区二区三区四区三区四 | 亚洲精彩视频在线观看 | 永久精品 | 九九亚洲 |