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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2789|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品一区二区三 | 四虎永久免费影院 | 男人的天堂在线视频 | 欧美电影一区 | 能看的av | 欧美专区日韩 | 天天搞天天操 | 国产精品一区一区三区 | 国产午夜三级一区二区三 | 亚洲精品二区 | 色婷婷久久久久swag精品 | 99reav| 福利网址| 99色综合| 草久久久 | 国产精品久久久久aaaa | 亚洲精品在线免费 | 毛片电影 | 日日骚av| 午夜精品一区二区三区在线视频 | 精品国产视频 | 国产在线精品一区二区 | 国产95在线 | 福利在线观看 | 国产91中文 | 久久爱黑人激情av摘花 | 欧美一级片 | 一区中文字幕 | 91视频在线 | 麻豆精品久久久 | 亚洲欧美中文日韩在线v日本 | 欧美激情一区二区 | 成人免费一区二区三区牛牛 | 黄色一级大片在线免费看产 | 每日更新av | 青青久草 | 中国av在线免费观看 | 深夜福利影院 | 欧美一级二级在线观看 | 黄色一级毛片免费看 | 亚洲视频在线观看免费 |