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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

  8. /* 基本類型轉義(與平臺相關注意修改) */
  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.     /* 依次在此處添加任務枚舉作為唯一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. /* 任務數據結構定義 */
  36. typedef struct {
  37.     void (*TaskPtr)(void); /* 待運行的任務函數指針 */
  38.     u16  actionDelay;      /* 運行延遲,以時標為單位,為0代表立即執行 */
  39.     u16  actionPeriod;     /* 運行間隔為0代表單次運行 */
  40.     u8   readyFlg;         /* 就緒標志 */
  41.     u8   taskId;           /* 任務標識 非優先級 */
  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. 說明:精簡合作式調度器實現
  51. 作者:jizhongbiao
  52. 微信:mcu6666(項目承接)
  53. 版本:tt001.0
  54. 備注:1,需要硬件提供一個定時中斷
  55.       2,當前版本不支持搶占式調度
  56. */
  57. #include "core.h"

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

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

  66.     /* 參數不合法 */
  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. /* 任務創建 */
  93. AddResult AddTask( void (*TaskPtr)(), const u16 delay, const u16 period, const u8 id)
  94. {
  95.     u8 i = 0;
  96.     /* 判空 指向0地址會發生不可預測錯誤*/
  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.     /* 向表中空隙插入任務塊信息 */
  107.     if(delay == 0) {
  108.         /* 在調度函數中會立即執行,不需要等待時標響應 */
  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. /* 定時刷新任務狀態函數,本函數應在定時器中斷函數中調用 */
  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.                 /* 本分支為延遲時間已經為0 */
  129.                 g_task[i].readyFlg = 1;
  130.                 /* 周期性任務重新設置延遲時標 單次任務刪除在調度函數中完成*/
  131.                 if(g_task[i].actionPeriod) {
  132.                     g_task[i].actionDelay = g_task[i].actionPeriod;
  133.                 }
  134.             }
  135.         }
  136.     }
  137. }

  138. /*調度器初始化*/
  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. /* 調度執行函數 */
  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)(); /* 執行已就緒的任務 */
  153.             g_task[index].readyFlg = 0;
  154.             /* 如果單次運行則刪除該任務 */
  155.             if(g_task[index].actionPeriod == 0) {
  156.                 TaskDelte(index);
  157.             }
  158.         }
  159.     }
  160. #if (USE_LOW_POWER_MODE == 1)
  161.     McuEnterStandby(); /* 需要根據不同芯片及硬件適配低功耗函數 */
  162. #endif
  163. }
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线小视频 | 日本在线你懂的 | 亚洲国产高清高潮精品美女 | 特一级毛片 | 日本超碰| 在线观看精品视频网站 | 99精品国产一区二区三区 | 一区二区三区在线观看视频 | av免费网址 | 人人九九精 | 成人一区二区视频 | 欧美日韩亚洲国产 | 国产在线中文字幕 | av网站在线看 | 亚洲一区中文字幕 | 免费毛片网站 | 中文字幕av网站 | www.日本国产 | 欧美8一10sex性hd | 精品国产一区二区三区久久久蜜月 | 日韩免费高清视频 | 日韩区 | av毛片| 国产福利资源 | 一区二区三区av | 精品一区二区在线观看 | 久久综合久久久 | 成人在线国产 | 欧美做暖暖视频 | 欧美中文字幕一区 | 99久久婷婷国产亚洲终合精品 | 91精品91久久久 | av手机免费在线观看 | 最新伦理片 | 久久精品国产亚洲一区二区 | 另类视频在线 | 神马影院一区二区三区 | 亚洲精品久久久一区二区三区 | 亚洲视频在线播放 | 亚洲精品一区二区网址 | 国产精品久久久久久亚洲调教 |