找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

閑著無聊寫了個簡便的裸機調(diào)度器 附單片機程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:130230 發(fā)表于 2020-11-8 00:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
廢話不說,直接上單片機程序。
=========================================================================================
  1. /*
  2. 說明:精簡調(diào)度器實現(xiàn)
  3. 作者:jizhongbiao
  4. 微信:mcu6666
  5. */
  6. #ifndef CORE_H
  7. #define CORE_H

  8. /* 基本類型轉(zhuǎn)義(與平臺相關(guān)注意修改) */
  9. typedef (unsigned char)  u8;
  10. typedef (char)           i8;
  11. typedef (unsigned short) u16;
  12. typedef (short)          i16;

  13. #define USE_LOW_POWER_MODE 0 /* 需要低功耗則打開這個宏 */

  14. enum {
  15.     /* 依次在此處添加任務(wù)枚舉作為唯一ID */
  16.     MAX_TASK_NUM
  17. };

  18. typedef enum {
  19.     DEL_INDEX,
  20.     DEL_ID,
  21.     MAX_DEL_TYPE,
  22. }DeleteType;

  23. typedef enum {
  24.     DEL_PARAERR,
  25.     DEL_SUCCESS,
  26.     DEL_FAIL,
  27.     MAX_DEL,
  28. } DeleteResult;

  29. typedef enum {
  30.     ADD_PARAERR,
  31.     ADD_SUCCESS,
  32.     ADD_FAIL,
  33.     MAX_ADD,
  34. }AddResult;

  35. /* 任務(wù)數(shù)據(jù)結(jié)構(gòu)定義 */
  36. typedef struct {
  37.     void (*TaskPtr)(void); /* 待運行的任務(wù)函數(shù)指針 */
  38.     u16  actionDelay;      /* 運行延遲,以時標為單位,為0代表立即執(zhí)行 */
  39.     u16  actionPeriod;     /* 運行間隔為0代表單次運行 */
  40.     u8   readyFlg;         /* 就緒標志 */
  41.     u8   taskId;           /* 任務(wù)標識 非優(yōu)先級 */
  42. }TaskStruct;

  43. void Scheduling(void);
  44. DeleteResult TaskDelete(const u8 para, const DeleteType type);
  45. void UpdataHandle(void);
  46. AddResult AddTask( void (*TaskPtr)(), const u16 delay, const u16 period, const u8 id);

  47. #endif


  48. ==========================================================================================
  49. /*
  50. 說明:精簡合作式調(diào)度器實現(xiàn)
  51. 作者:jizhongbiao
  52. 微信:mcu6666(項目承接)
  53. 版本:tt001.0
  54. 備注:1,需要硬件提供一個定時中斷
  55.       2,當前版本不支持搶占式調(diào)度
  56. */
  57. #include "core.h"

  58. /* 任務(wù)隊列 */
  59. volatile static TaskStruct g_task[MAX_TASK_NUM];

  60. /* 任務(wù)刪除,支持兩種方式(id及index) */
  61. DeleteResult TaskDelete(const u8 para, const DeleteType type)
  62. {
  63.     u8 i;
  64.     u8 temp = para;
  65.     DeleteResult ret;

  66.     /* 參數(shù)不合法 */
  67.     if ((type >= MAX_DEL_TYPE) || (para >= MAX_TASK_NUM)) {
  68.         return DEL_PARAERR;
  69.     }

  70.     if (type == DEL_INDEX) {
  71.         if(g_task[para].TaskPtr == 0) {
  72.             return DEL_FAIL;
  73.         }
  74.     } else {
  75.         for(i = 0; i < MAX_TASK_NUM, i++) {
  76.             if (g_task[i].TaskPtr) {
  77.                 temp = i;
  78.                 break;
  79.             }
  80.         }
  81.         if(i == MAX_TASK_NUM) {
  82.             return DEL_FAIL;
  83.         }
  84.     }

  85.     /* 真正的刪除動作,注意不可以使用memset(id不準清0) */
  86.     g_task[temp].actionDelay  = 0;
  87.     g_task[temp].actionPeriod = 0;
  88.     g_task[temp].readyFlg     = 0;
  89.     g_task[temp].TaskPtr      = 0;

  90.     return DEL_SUCCESS;
  91. }

  92. /* 任務(wù)創(chuàng)建 */
  93. AddResult AddTask( void (*TaskPtr)(), const u16 delay, const u16 period, const u8 id)
  94. {
  95.     u8 i = 0;
  96.     /* 判空 指向0地址會發(fā)生不可預(yù)測錯誤*/
  97.     if(TaskPtr == 0) {
  98.         return ADD_PARAERR;
  99.     }

  100.     while ((i < MAX_TASK_NUM) && g_task[i].TaskPtr) {
  101.         i++;
  102.     }
  103.     if (i == MAX_TASK_NUM) {
  104.         return ADD_FAIL;
  105.     }
  106.     /* 向表中空隙插入任務(wù)塊信息 */
  107.     if(delay == 0) {
  108.         /* 在調(diào)度函數(shù)中會立即執(zhí)行,不需要等待時標響應(yīng) */
  109.         g_task[i].readyFlg = 1;
  110.     } else {
  111.         g_task[i].readyFlg = 0;
  112.     }
  113.     g_task[i].actionDelay  = delay;
  114.     g_task[i].actionPeriod = period;
  115.     g_task[i].taskId       = id;
  116.     g_task[i].TaskPtr      = TaskPtr;
  117.     return ADD_SUCCESS;
  118. }

  119. /* 定時刷新任務(wù)狀態(tài)函數(shù),本函數(shù)應(yīng)在定時器中斷函數(shù)中調(diào)用 */
  120. void UpdataHandle(void)
  121. {
  122.     u8 i;
  123.     for (i = 0; i < MAX_TASK_NUM; i++) {
  124.         if(g_task[i].TaskPtr) {
  125.             if(g_task[i].actionDelay) {
  126.                 g_task[i].actionDelay--;
  127.             } else {
  128.                 /* 本分支為延遲時間已經(jīng)為0 */
  129.                 g_task[i].readyFlg = 1;
  130.                 /* 周期性任務(wù)重新設(shè)置延遲時標 單次任務(wù)刪除在調(diào)度函數(shù)中完成*/
  131.                 if(g_task[i].actionPeriod) {
  132.                     g_task[i].actionDelay = g_task[i].actionPeriod;
  133.                 }
  134.             }
  135.         }
  136.     }
  137. }

  138. /*調(diào)度器初始化*/
  139. void  ScheduInit(void)
  140. {
  141.     u8 i;
  142.     for(i = 0; i < MAX_TASK_NUM; i++) {
  143.         (void)TaskDelete(i, DEL_INDEX);
  144.     }
  145. }

  146. /* 調(diào)度執(zhí)行函數(shù) */
  147. void Scheduling(void)
  148. {
  149.     u8 index;
  150.     for(index = 0; index < MAX_TASK_NUM; index++) {
  151.         if (g_task[index].readyFlg) {
  152.             (g_task[index].TaskPtr)(); /* 執(zhí)行已就緒的任務(wù) */
  153.             g_task[index].readyFlg = 0;
  154.             /* 如果單次運行則刪除該任務(wù) */
  155.             if(g_task[index].actionPeriod == 0) {
  156.                 TaskDelte(index);
  157.             }
  158.         }
  159.     }
  160. #if (USE_LOW_POWER_MODE == 1)
  161.     McuEnterStandby(); /* 需要根據(jù)不同芯片及硬件適配低功耗函數(shù) */
  162. #endif
  163. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:420836 發(fā)表于 2020-11-8 08:23 | 只看該作者
感謝您分享您的代碼。 應(yīng)該會很有幫助!
回復(fù)

使用道具 舉報

板凳
ID:328014 發(fā)表于 2020-11-8 14:56 | 只看該作者
好東東啊,能應(yīng)用在哪些地方呢?
回復(fù)

使用道具 舉報

地板
ID:130230 發(fā)表于 2020-11-22 12:38 | 只看該作者
核心還是時間觸發(fā),不適合需要快速響應(yīng)的場合。因為不支持搶占式調(diào)度,就我的經(jīng)驗來說絕大多數(shù)單片機的應(yīng)用合作式調(diào)度足夠了。
回復(fù)

使用道具 舉報

5#
ID:258257 發(fā)表于 2020-11-30 15:20 | 只看該作者
牛人呀!這是自定義多任務(wù)系統(tǒng)的最佳啟蒙資料了。受教了!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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