基于stm32代碼講解 本文 第一部分:涉及移植后stm32工程中delay.c,usart.c,sys.c 3個(gè)源文件中重要的函數(shù)說明 第二部分:講解ucos任務(wù)管理的基本概念和相關(guān)代碼幫助理解,包括-1.任務(wù)的組成部分 2.系統(tǒng)任務(wù) 3.任務(wù)狀態(tài) 4.任務(wù)狀態(tài)的切換 第三部分:進(jìn)行總結(jié)歸納和反思
1-delay.c
采用滴答定時(shí)器(硬件定時(shí)器)作為UCOS的基準(zhǔn)時(shí)間 |
在m3,m4中代碼完全一樣。在m4權(quán)威指南中NVIC和中斷一章中Systick有詳細(xì)講解滴答定時(shí)器 void SysTick_Handler(void)
{
if(delay_osrunning==1) //操作系統(tǒng)正常運(yùn)行后執(zhí)行
{
OSIntEnter(); //進(jìn)入中斷
OSTimeTick(); //調(diào)用ucos中斷服務(wù)函數(shù)
OSIntExit(); //觸發(fā)任務(wù)切換軟中斷(進(jìn)入就緒態(tài))
}
}
- delay_init,初始化了ucos的時(shí)鐘節(jié)拍
- delay_ms在<=最小周期的時(shí)候使用原本的函數(shù)-不會(huì)引起任務(wù)調(diào)度,在大于的時(shí)候使用ucos自帶的函數(shù)-會(huì)引起任務(wù)調(diào)度
- delay_us不會(huì)引起任務(wù)調(diào)度
2-usart.c
- 在中斷中要使用ucos特定的中斷進(jìn)入和退出函數(shù)
void USART1_IRQHandler(void)
{
u8 Res;
#if SYSTEM_SUPPORT_OS
OSIntEnter(); //使用ucos操作系統(tǒng)
#endif
....................//自定義的中斷處理
#if SYSTEM_SUPPORT_OS
OSIntExit(); //退出中斷(調(diào)度優(yōu)先級(jí)最高的任務(wù))
#endif
}
3-sys.c 完全不變
1-任務(wù)的組成
- 任務(wù)堆棧:上下文切換用于保存任務(wù)當(dāng)前環(huán)境。也就是stm32內(nèi)部寄存器的值。
- 任務(wù)控制塊:保存任務(wù)的各個(gè)屬性
- 任務(wù)函數(shù):完成指定功能
1-1三大組成使用部分代碼講解
如下定義了3個(gè)組成部分,進(jìn)行相關(guān)定義后即可以作為參數(shù)調(diào)用OSTaskCreate(…)開啟相應(yīng)任務(wù) |
//任務(wù)優(yōu)先級(jí)
#define TASK1_TASK_PRIO 4
//任務(wù)堆棧大小
#define TASK1_STK_SIZE 128
//任務(wù)控制塊
OS_TCB Task1_TaskTCB;
//任務(wù)函數(shù)
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);
某個(gè)任務(wù)代碼,調(diào)用OSTimeDlyHMSM是使用任務(wù)切換的關(guān)鍵 |
void XXX_task(void *p_arg)
{
while(1)
{
...//任務(wù)處理過程
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延時(shí)一秒
}
}
//創(chuàng)建task1任務(wù)
OSTaskCreate((OS_TCB * )&Task1_TaskTCB, //任務(wù)控制塊
(CPU_CHAR * )"Task1 task",
(OS_TASK_PTR )task1_task, //使用任務(wù)函數(shù)
(void * )0,
(OS_PRIO )TASK1_TASK_PRIO, //任務(wù)優(yōu)先級(jí)
(CPU_STK * )&TASK1_TASK_STK[0],//任務(wù)堆棧
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
2-系統(tǒng)任務(wù)
UCOSIII默認(rèn)有5個(gè)系統(tǒng)任務(wù): |
1、空閑任務(wù):UCOSIII創(chuàng)建的第一個(gè)任務(wù),UCOSIII必須創(chuàng)建的任務(wù),此任務(wù)有UCOSIII自動(dòng)創(chuàng)建,不需要用戶手動(dòng)創(chuàng)建。 2、時(shí)鐘節(jié)拍任務(wù):此任務(wù)也是必須創(chuàng)建的任務(wù)。 3、統(tǒng)計(jì)任務(wù):可選任務(wù),用來統(tǒng)計(jì)CPU使用率和各個(gè)任務(wù)的堆棧使用量。此任務(wù)是可選任務(wù),由宏OS_CFG_STAT_TASK_EN控制是否使用此任務(wù)。 4、定時(shí)任務(wù):用來向用戶提供定時(shí)服務(wù),也是可選任務(wù),由宏OS_CFG_TMR_EN控制是否使用此任務(wù)。 5、中斷服務(wù)管理任務(wù):可選任務(wù),由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任務(wù)。
3-任務(wù)狀態(tài)
從用戶的角度看,UCOSIII的任務(wù)一共有5種狀態(tài): |
1、休眠態(tài):任務(wù)已經(jīng)在CPU的flash中了,但是還不受UCOSIII管理。 2、就緒態(tài):系統(tǒng)為任務(wù)分配了任務(wù)控制塊,并且任務(wù)已經(jīng)在就緒表中登記,這時(shí)這個(gè)任務(wù)就具有了運(yùn)行的條件,此時(shí)任務(wù)的狀態(tài)就是就緒態(tài)。 3、運(yùn)行態(tài):任務(wù)獲得CPU的使用權(quán),正在運(yùn)行。 4、等待態(tài):正在運(yùn)行的任務(wù)需要等待一段時(shí)間,或者等待某個(gè)事件,這個(gè)任務(wù)就進(jìn)入了等待態(tài),此時(shí)系統(tǒng)就會(huì)把CPU使用權(quán)轉(zhuǎn)交給別的任務(wù)。 5、中斷服務(wù)態(tài):當(dāng)發(fā)送中斷,當(dāng)前正在運(yùn)行的任務(wù)會(huì)被掛起,CPU轉(zhuǎn)而去執(zhí)行中斷服務(wù)函數(shù),此時(shí)任務(wù)的任務(wù)狀態(tài)叫做中斷服務(wù)態(tài)。
1-delay,usart中需要注意的地方?
- delay.c中選取了滴答定時(shí)器作為ucosIII的時(shí)間基準(zhǔn)
- usart中中斷服務(wù)函數(shù)需要ucos進(jìn)入和退出中斷函數(shù)
2-任務(wù)的三大組成是什么?
3-系統(tǒng)任務(wù)有哪些?
3-任務(wù)狀態(tài)有幾種?
|