- μC/OS-III內核實現與應用開發實戰指南:基于STM32
- 劉火良 楊森編著
- 1043字
- 2019-08-01 11:35:59
5.1 實現空閑任務
5.1.1 定義空閑任務棧
空閑任務棧在os_cfg_app.c(第一次使用os_cfg_app.c時需要自行在文件夾μC/OS-III\Source中新建并添加到工程的μC/OS-III Source組)文件中定義,具體參見代碼清單5-1。
代碼清單5-1 os_cfg_app.c文件
1 /* 2 ******************************************************************* 3 * 數據域 4 ******************************************************************* 5 */ 6 7 CPU_STK OSCfg_IdleTaskStk[OS_CFG_IDLE_TASK_STK_SIZE];(1) 8 9 10 11 /* 12 ******************************************************************* 13 * 常量 14 ******************************************************************* 15 */ 16 17 /* 空閑任務棧起始地址 */ 18 CPU_STK * const OSCfg_IdleTaskStkBasePtr = \(2) 19 (CPU_STK *)&OSCfg_IdleTaskStk[0]; 20 /* 空閑任務棧大小 */ 21 CPU_STK_SIZE const OSCfg_IdleTaskStkSize = \ 22 (CPU_STK_SIZE)OS_CFG_IDLE_TASK_STK_SIZE;
代碼清單5-1(1):空閑任務棧是一個定義好的數組,大小由OS_CFG_IDLE_TASK_STK_SIZE這個宏控制。OS_CFG_IDLE_TASK_STK_SIZE在os_cfg_app.h頭文件中定義,大小為128,具體參見代碼清單5-2。
代碼清單5-2 os_cfg_app.h文件
1 #ifndef OS_CFG_APP_H 2 #define OS_CFG_APP_H 3 4 /* 5 ******************************************************************* 6 * 常量 7 ******************************************************************* 8 */ 9 10 /* 空閑任務棧大小 */ 11 #define OS_CFG_IDLE_TASK_STK_SIZE 128u 12 13 #endif/* OS_CFG_APP_H */
代碼清單5-1(2):空閑任務棧的起始地址和大小均被定義成一個常量,不能被修改。變量OSCfg_IdleTaskStkBasePtr和OSCfg_IdleTaskStkSize還在os.h中聲明,這樣就具有全局屬性,可以在其他文件中調用,具體聲明參見代碼清單5-3。
代碼清單5-3 OSCfg_IdleTaskStkBasePtr和OSCfg_IdleTaskStkSize聲明
1 /* 空閑任務棧起始地址 */ 2 extern CPU_STK * const OSCfg_IdleTaskStkBasePtr; 3 /* 空閑任務棧大小 */ 4 extern CPU_STK_SIZE const OSCfg_IdleTaskStkSize;
5.1.2 定義空閑任務的任務控制塊
任務控制塊(TCB)是每一個任務必需的,空閑任務的TCB在os.h中定義,是一個全局變量,具體參見代碼清單5-4。
代碼清單5-4 定義空閑任務的TCB
/* 空閑任務的TCB */ 1 OS_EXT OS_TCB OSIdleTaskTCB;
5.1.3 定義空閑任務函數
空閑任務正如其名,空閑,任務體中只是對全局變量執行OSIdleTaskCtr ++操作,具體實現參見代碼清單5-5。
代碼清單5-5 空閑任務函數
1 /* 空閑任務 */ 2 void OS_IdleTask (void *p_arg) 3 { 4 p_arg = p_arg; 5 6 /* 空閑任務什么都不做,只對全局變量執行OSIdleTaskCtr++ 操作 */ 7 for (;;) { 8 OSIdleTaskCtr++; 9 } 10 }
代碼清單5-5中的全局變量OSIdleTaskCtr在os.h中定義,具體參見代碼清單5-6。
代碼清單5-6 OSIdleTaskCtr定義
/* 空閑任務計數變量 */ 1 OS_EXT OS_IDLE_CTR OSIdleTaskCtr;
代碼清單5-6中的OS_IDLE_CTR是在os_type.h中重新定義的數據類型,具體參見代碼清單5-7。
代碼清單5-7 OS_IDLE_CTR定義
/* 空閑任務計數變量定義 */ 1 typedef CPU_INT32U OS_IDLE_CTR;
5.1.4 空閑任務初始化
空閑任務的初始化用OSInit()函數完成,這意味著在系統還沒有啟動之前空閑任務就已經創建好,具體在os_core.c中定義,具體代碼參見代碼清單5-8。
代碼清單5-8 空閑任務初始化函數
1 void OSInit (OS_ERR *p_err) 2 { 3 /* 配置操作系統初始狀態為停止態 */ 4 OSRunning = OS_STATE_OS_STOPPED; 5 6 /* 初始化兩個全局TCB,這兩個TCB用于任務切換 */ 7 OSTCBCurPtr = (OS_TCB *)0; 8 OSTCBHighRdyPtr = (OS_TCB *)0; 9 10 /* 初始化就緒列表 */ 11 OS_RdyListInit(); 12 13 /* 初始化空閑任務 */ 14 OS_IdleTaskInit(p_err);(1) 15 if (*p_err != OS_ERR_NONE) { 16 return; 17 } 18 } 19 20 /* 空閑任務初始化 */ 21 void OS_IdleTaskInit(OS_ERR *p_err) 22 { 23 /* 初始化空閑任務計數器 */ 24 OSIdleTaskCtr = (OS_IDLE_CTR)0;(2) 25 26 /* 創建空閑任務 */ 27 OSTaskCreate( (OS_TCB *)&OSIdleTaskTCB,(3) 28 (OS_TASK_PTR )OS_IdleTask, 29 (void *)0, 30 (CPU_STK *)OSCfg_IdleTaskStkBasePtr, 31 (CPU_STK_SIZE)OSCfg_IdleTaskStkSize, 32 (OS_ERR *)p_err ); 33 }
代碼清單5-8(1):空閑任務初始化函數在OSInit()中調用,在系統還沒有啟動之前就被創建。
代碼清單5-8(2):初始化空閑任務計數器,這是預先在os.h中定義好的全局變量。
代碼清單5-8(3):創建空閑任務,把棧、TCB、任務函數聯系在一起。