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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4003|回復: 1
打印 上一主題 下一主題
收起左側

適合51單片機和STM32的簡易任務調度器

[復制鏈接]
跳轉到指定樓層
樓主
ID:68814 發表于 2019-9-14 18:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個代碼是從網上看到,經過少量修改得到的,如果有侵刪請告知。

  1. //===========簡易任務調度器==============

  2. #define  TASK_MAX   2 //任務的數量記得匹配一下

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

  11. static TASK_COMPONENTS TaskComps[]=   //任務的編號,從0開始
  12. {   
  13.     {0,0,1000,1000, Task1}, //因為定時器是1ms的,也就是這個任務的執行間隔時間是200ms
  14.     {1,0,10,        10,  Task2}, //****按照格式可以補充你的任務****/
  15. };

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

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

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

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


總結:該調度器只是簡單按照任務次序輪詢,無法按照任務執行的間隔時間做實時切換。對于大部分對任務執行時間精確度要求不高的場合,是比較好用的。這樣的架構也會使代碼相對簡潔一些。





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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一二三区在线观看 | 久久精品成人热国产成 | 韩日一区二区三区 | 欧美专区在线观看 | 欧洲免费视频 | 精品一区二区三区中文字幕 | 九九免费在线视频 | 久久免费精品 | 一区二区三区四区电影视频在线观看 | www.9191| 亚洲狠狠爱一区二区三区 | 久久午夜精品 | 一区二区三区四区不卡 | 日韩精品久久久久 | 国产视频第一页 | 成人免费在线视频 | 欧美一区二区三区在线免费观看 | 日韩欧美一区二区三区四区 | 亚洲协和影视 | 成人免费激情视频 | 国产一二三区精品视频 | 精品一区二区三区入口 | 成人午夜电影网 | 国产日韩欧美在线观看 | 在线视频 欧美日韩 | www.色.com | 一区二区三区四区av | 一级做a爰片性色毛片 | 网站国产| 在线观看国产h | 日韩精品无码一区二区三区 | 久久99视频精品 | 精品不卡 | 99久久婷婷国产综合精品电影 | 久久99精品久久久久婷婷 | aaa级片 | 成人av一区二区三区 | 亚洲欧美日韩电影 | 一级毛片免费视频 | 成人午夜看片 | 成人在线视频免费观看 |