廢話不說,直接上單片機程序。
=========================================================================================
- /*
- 說明:精簡調度器實現
- 作者:jizhongbiao
- 微信:mcu6666
- */
- #ifndef CORE_H
- #define CORE_H
- /* 基本類型轉義(與平臺相關注意修改) */
- typedef (unsigned char) u8;
- typedef (char) i8;
- typedef (unsigned short) u16;
- typedef (short) i16;
- #define USE_LOW_POWER_MODE 0 /* 需要低功耗則打開這個宏 */
- enum {
- /* 依次在此處添加任務枚舉作為唯一ID */
- MAX_TASK_NUM
- };
- typedef enum {
- DEL_INDEX,
- DEL_ID,
- MAX_DEL_TYPE,
- }DeleteType;
- typedef enum {
- DEL_PARAERR,
- DEL_SUCCESS,
- DEL_FAIL,
- MAX_DEL,
- } DeleteResult;
- typedef enum {
- ADD_PARAERR,
- ADD_SUCCESS,
- ADD_FAIL,
- MAX_ADD,
- }AddResult;
- /* 任務數據結構定義 */
- typedef struct {
- void (*TaskPtr)(void); /* 待運行的任務函數指針 */
- u16 actionDelay; /* 運行延遲,以時標為單位,為0代表立即執行 */
- u16 actionPeriod; /* 運行間隔為0代表單次運行 */
- u8 readyFlg; /* 就緒標志 */
- u8 taskId; /* 任務標識 非優先級 */
- }TaskStruct;
- void Scheduling(void);
- DeleteResult TaskDelete(const u8 para, const DeleteType type);
- void UpdataHandle(void);
- AddResult AddTask( void (*TaskPtr)(), const u16 delay, const u16 period, const u8 id);
- #endif
- ==========================================================================================
- /*
- 說明:精簡合作式調度器實現
- 作者:jizhongbiao
- 微信:mcu6666(項目承接)
- 版本:tt001.0
- 備注:1,需要硬件提供一個定時中斷
- 2,當前版本不支持搶占式調度
- */
- #include "core.h"
- /* 任務隊列 */
- volatile static TaskStruct g_task[MAX_TASK_NUM];
- /* 任務刪除,支持兩種方式(id及index) */
- DeleteResult TaskDelete(const u8 para, const DeleteType type)
- {
- u8 i;
- u8 temp = para;
- DeleteResult ret;
- /* 參數不合法 */
- if ((type >= MAX_DEL_TYPE) || (para >= MAX_TASK_NUM)) {
- return DEL_PARAERR;
- }
- if (type == DEL_INDEX) {
- if(g_task[para].TaskPtr == 0) {
- return DEL_FAIL;
- }
- } else {
- for(i = 0; i < MAX_TASK_NUM, i++) {
- if (g_task[i].TaskPtr) {
- temp = i;
- break;
- }
- }
- if(i == MAX_TASK_NUM) {
- return DEL_FAIL;
- }
- }
- /* 真正的刪除動作,注意不可以使用memset(id不準清0) */
- g_task[temp].actionDelay = 0;
- g_task[temp].actionPeriod = 0;
- g_task[temp].readyFlg = 0;
- g_task[temp].TaskPtr = 0;
- return DEL_SUCCESS;
- }
- /* 任務創建 */
- AddResult AddTask( void (*TaskPtr)(), const u16 delay, const u16 period, const u8 id)
- {
- u8 i = 0;
- /* 判空 指向0地址會發生不可預測錯誤*/
- if(TaskPtr == 0) {
- return ADD_PARAERR;
- }
- while ((i < MAX_TASK_NUM) && g_task[i].TaskPtr) {
- i++;
- }
- if (i == MAX_TASK_NUM) {
- return ADD_FAIL;
- }
- /* 向表中空隙插入任務塊信息 */
- if(delay == 0) {
- /* 在調度函數中會立即執行,不需要等待時標響應 */
- g_task[i].readyFlg = 1;
- } else {
- g_task[i].readyFlg = 0;
- }
- g_task[i].actionDelay = delay;
- g_task[i].actionPeriod = period;
- g_task[i].taskId = id;
- g_task[i].TaskPtr = TaskPtr;
- return ADD_SUCCESS;
- }
- /* 定時刷新任務狀態函數,本函數應在定時器中斷函數中調用 */
- void UpdataHandle(void)
- {
- u8 i;
- for (i = 0; i < MAX_TASK_NUM; i++) {
- if(g_task[i].TaskPtr) {
- if(g_task[i].actionDelay) {
- g_task[i].actionDelay--;
- } else {
- /* 本分支為延遲時間已經為0 */
- g_task[i].readyFlg = 1;
- /* 周期性任務重新設置延遲時標 單次任務刪除在調度函數中完成*/
- if(g_task[i].actionPeriod) {
- g_task[i].actionDelay = g_task[i].actionPeriod;
- }
- }
- }
- }
- }
- /*調度器初始化*/
- void ScheduInit(void)
- {
- u8 i;
- for(i = 0; i < MAX_TASK_NUM; i++) {
- (void)TaskDelete(i, DEL_INDEX);
- }
- }
- /* 調度執行函數 */
- void Scheduling(void)
- {
- u8 index;
- for(index = 0; index < MAX_TASK_NUM; index++) {
- if (g_task[index].readyFlg) {
- (g_task[index].TaskPtr)(); /* 執行已就緒的任務 */
- g_task[index].readyFlg = 0;
- /* 如果單次運行則刪除該任務 */
- if(g_task[index].actionPeriod == 0) {
- TaskDelte(index);
- }
- }
- }
- #if (USE_LOW_POWER_MODE == 1)
- McuEnterStandby(); /* 需要根據不同芯片及硬件適配低功耗函數 */
- #endif
- }
復制代碼
|