官术网_书友最值得收藏!

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、任務函數聯系在一起。

主站蜘蛛池模板: 凤城市| 壤塘县| 荥经县| 舟山市| 驻马店市| 甘德县| 宿松县| 阳城县| 方山县| 包头市| 忻州市| 积石山| 石渠县| 长丰县| 游戏| 抚远县| 磐安县| 梅河口市| 武清区| 高唐县| 黑河市| 绥滨县| 大城县| 靖远县| 桑日县| 平昌县| 柳河县| 山丹县| 修水县| 山丹县| 吕梁市| 莱芜市| 延川县| 甘南县| 长丰县| 饶平县| 旺苍县| 电白县| 册亨县| 加查县| 合作市|