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

4.4 main()函數

此處main()函數與第3章中區別不大,僅僅是加入了SysTick相關的內容,具體參見代碼清單4-5。

代碼清單4-5 main()函數和任務代碼

1 int main(void)
 2 {
 3     OS_ERR err;
 4 
 5     /* 關閉中斷 */
 6     CPU_IntDis();(1)
 7 
 8     /* 配置SysTick 10ms 中斷一次 */
 9     OS_CPU_SysTickInit (10);(2)
10 
11     /* 初始化相關的全局變量 */
12     OSInit(&err);
13 
14     /* 創建任務 */
15     OSTaskCreate ((OS_TCB*)      &Task1TCB,
16                   (OS_TASK_PTR ) Task1,
17                   (void *)       0,
18                   (CPU_STK*)     &Task1Stk[0],
19                   (CPU_STK_SIZE) TASK1_STK_SIZE,
20                   (OS_ERR *)     &err);
21 
22     OSTaskCreate ((OS_TCB*)      &Task2TCB,
23                   (OS_TASK_PTR ) Task2,
24                   (void *)       0,
25                   (CPU_STK*)     &Task2Stk[0],
26                   (CPU_STK_SIZE) TASK2_STK_SIZE,
27                   (OS_ERR *)     &err);
28 
29     /* 將任務加入就緒列表 */
30     OSRdyList[0].HeadPtr = &Task1TCB;
31     OSRdyList[1].HeadPtr = &Task2TCB;
32 
33     /* 啟動操作系統,將不再返回 */
34     OSStart(&err);
35 }
36 
37 
38 
39 /* 任務1 */
40 void Task1( void *p_arg )
41 {
42     for ( ;; ) {
43         flag1 = 1;
44         delay( 100 );
45         flag1 = 0;
46         delay( 100 );
47 
48         /* 任務切換,這里是手動切換 */
49         //OSSched();(3)
50     }
51 }
52 
53 /* 任務2 */
54 void Task2( void *p_arg )
55 {
56     for ( ;; ) {
57         flag2 = 1;
58         delay( 100 );
59         flag2 = 0;
60         delay( 100 );
61 
62         /* 任務切換,這里是手動切換 */
63         //OSSched();(4)
64     }
65 }

代碼清單4-5(1):關閉中斷。因為在操作系統初始化之前啟用了SysTick定時器產生10ms的中斷,在中斷中觸發任務調度,如果一開始不關閉中斷,就會在操作系統還未啟動之前就進入SysTick中斷,然后發生任務調度。既然操作系統都還未啟動,那么調度是不允許發生的,所以應先關閉中斷。操作系統啟動后,中斷由OSStart()函數中的OSStartHighRdy()重啟。

代碼清單4-5(2):配置SysTick為10ms中斷一次。任務的調度是在SysTick的中斷服務函數中完成的,中斷的頻率越高意味著操作系統的調度越高,系統的負荷就越重,一直在不斷地進入中斷,則執行任務的時間就會減少。選擇合適的SysTick中斷頻率會提高系統的運行效率,μC/OS-III官方推薦為10ms,也可設置得再高一些。

代碼清單4-5(3)(4):任務調度將不再在各自的任務中實現,而是放到了SysTick中斷服務函數中,從而實現每個任務都運行相同的時間片,平等地享有CPU。

主站蜘蛛池模板: 重庆市| 辉县市| 竹北市| 济南市| 河源市| 隆昌县| 阳春市| 景泰县| 墨竹工卡县| 通州市| 周宁县| 金平| 漳浦县| 阳高县| 修水县| 东兴市| 漳州市| 晋宁县| 克什克腾旗| 漳平市| 文山县| 大足县| 启东市| 黑山县| 玛曲县| 余庆县| 称多县| 永清县| 明星| 永靖县| 新丰县| 澄城县| 山阴县| 黄平县| 吉木萨尔县| 泸溪县| 乌兰浩特市| 广宁县| 碌曲县| 土默特右旗| 晋城|