找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

適合51單片機(jī)和STM32的簡(jiǎn)易任務(wù)調(diào)度器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:68814 發(fā)表于 2019-9-14 18:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)代碼是從網(wǎng)上看到,經(jīng)過少量修改得到的,如果有侵刪請(qǐng)告知。

  1. //===========簡(jiǎn)易任務(wù)調(diào)度器==============

  2. #define  TASK_MAX   2 //任務(wù)的數(shù)量記得匹配一下

  3. typedef struct _TASK_COMPONENTS
  4. {
  5.     unsigned char TaskNumber; //表示任務(wù)的編號(hào)
  6.                 unsigned char Run;    // 0表示任務(wù)不運(yùn)行,1表示任務(wù)運(yùn)行
  7.     unsigned int Timer;   // 表示任務(wù)的執(zhí)行間隔時(shí)間
  8.     unsigned int ItvTime; // 參數(shù)傳遞作用,數(shù)值上等于Timer
  9.     void (*TaskHook)(void); //任務(wù)函數(shù)
  10. }TASK_COMPONENTS;  

  11. static TASK_COMPONENTS TaskComps[]=   //任務(wù)的編號(hào),從0開始
  12. {   
  13.     {0,0,1000,1000, Task1}, //因?yàn)槎〞r(shí)器是1ms的,也就是這個(gè)任務(wù)的執(zhí)行間隔時(shí)間是200ms
  14.     {1,0,10,        10,  Task2}, //****按照格式可以補(bǔ)充你的任務(wù)****/
  15. };

  16. void TaskHangup(unsigned char Task_Num)//任務(wù)掛起函數(shù),參數(shù)就是你的任務(wù)編號(hào)
  17. {
  18.         TaskComps[Task_Num].Run=0;
  19. }

  20. void TaskRecovery(unsigned char Task_Num)//任務(wù)恢復(fù)函數(shù),參數(shù)就是你的任務(wù)編號(hào)
  21. {
  22.         TaskComps[Task_Num].Run=1;
  23. }

  24. void TaskRemarks(void) //放在你的定時(shí)器中斷里面  定時(shí)器需要設(shè)定1ms中斷一次
  25. {
  26.         unsigned char i;
  27.         for (i=0; i<TASK_MAX; i++)          // 逐個(gè)任務(wù)時(shí)間處理
  28.                         {
  29.                                          if (TaskComps[i].Timer)          // 時(shí)間不為0
  30.                                         {
  31.                                                         TaskComps[i].Timer--;         // 減去一個(gè)節(jié)拍
  32.                                                         if ((TaskComps[i].Timer == 0) ||(TaskComps[i].Timer>0XFFF0))  // 時(shí)間減完了 [/size][/indent][size=4]//如果任務(wù)執(zhí)行時(shí)間比較長,可能當(dāng)時(shí)間片減到0的時(shí)候任務(wù)還在執(zhí)行,然后減下去就溢出,是0XFFFF
  33.                                                                                                                                                                                                                                                                                                         //所以用[/size][size=4]0XFFF0[/size][size=4]這個(gè)值保證溢出的時(shí)候也能執(zhí)行下面的語句
  34.                                                         {
  35.                                                                          TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復(fù)計(jì)時(shí)器值,從新下一次
  36.                                                                          TaskComps[i].Run = 1;           // 任務(wù)可以運(yùn)行
  37.                                                         }
  38.                                         }
  39.                  }
  40. }

  41. void TaskProcess(void)//放在你的while(1)循環(huán)里面
  42. {
  43.     unsigned char  i;
  44.                 for (i=0; i<TASK_MAX; i++)           // 逐個(gè)任務(wù)判斷是否達(dá)到執(zhí)行條件
  45.     {         
  46.                         if (TaskComps[i].Run)     // 達(dá)到執(zhí)行條件
  47.         {
  48.              TaskComps[i].Run = 0;     // 標(biāo)志清0  把這句話放下面會(huì)出現(xiàn)異常 原因暫未查明
  49.                                                  TaskComps[i].TaskHook();  // 運(yùn)行任務(wù)
  50.         }
  51.     }   
  52.                 MCU_IDLE();//進(jìn)入低功耗模式
  53. }[/size]</font>
復(fù)制代碼
一些說明:
1、MCU_IDLE();//進(jìn)入低功耗模式  32和51的低功耗函數(shù)是不一樣的,這里只是提供一種低功耗的思路,比如51低功耗函數(shù)直接操作PCON寄存器,定時(shí)器中斷會(huì)喚醒,喚醒后會(huì)執(zhí)行TaskRemarks函數(shù),判斷任務(wù)時(shí)間是否到了,到了標(biāo)志位置1。
2、Task1等函數(shù)具體可以更換為自己的任務(wù)函數(shù)名稱,但是在這個(gè)文件內(nèi)使用的話記得加extern聲明一下是外部函數(shù)。
3、這個(gè)調(diào)度器實(shí)際上就是一個(gè)定時(shí)器做事件的時(shí)間基準(zhǔn),建議任務(wù)函數(shù)內(nèi)部的延時(shí)時(shí)間不要大于任務(wù)執(zhí)行的間隔時(shí)間。因?yàn)閷?shí)際的執(zhí)行過程一定是任務(wù)0先執(zhí)行(即使里面有長延時(shí)函數(shù)),接著執(zhí)行任務(wù)1,任務(wù)2等。


總結(jié):該調(diào)度器只是簡(jiǎn)單按照任務(wù)次序輪詢,無法按照任務(wù)執(zhí)行的間隔時(shí)間做實(shí)時(shí)切換。對(duì)于大部分對(duì)任務(wù)執(zhí)行時(shí)間精確度要求不高的場(chǎng)合,是比較好用的。這樣的架構(gòu)也會(huì)使代碼相對(duì)簡(jiǎn)潔一些。





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

使用道具 舉報(bào)

沙發(fā)
ID:807361 發(fā)表于 2023-6-24 22:37 | 只看該作者
思路好像還不錯(cuò)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表