背景:
最近項目要在STM32L152上移植FreeRTOS輕量級系統(tǒng),本文將從FreeRTOS的入門知識講起,記錄FreeRTOS的一些基本知識點和學習心得。
硬件平臺:STM32L152 ,備注:PA12連接LED1,PA11連接LED2;
軟件平臺:keil v5和 cubeMx。
內(nèi)容:
1.FreeRTOS簡介
FreeRTOS是一種輕量級實時操作系統(tǒng)。RTOS:Real Time OperatingSystem實時操作系統(tǒng)。FreeRTOS可拆分為Free + RTOS,前面Free代表一種操作系統(tǒng)類型的名稱,后面RTOS代表實時操作系統(tǒng)。
近幾年,F(xiàn)reeRTOS的排名在嵌入式操作系統(tǒng)的排名中還是比較高的,且有不斷上升趨勢。

2. cubeMX中FreeRTOS的生成及任務(wù)創(chuàng)建
首先,打開CUBEMX軟件,點擊NEW Project,選擇芯片STM32L152RC;

2,配置RCC時鐘

3,設(shè)置PA12和PA11為GPIO_OUTPUT;

4,使能FREERTOS;

5,設(shè)置時鐘樹,本例外部晶振8M,8倍頻,2分頻,得到32M;

6,配置FREERTOS,創(chuàng)建兩個任務(wù);



7,生成基于Keil V5的代碼。

8,添加LED點亮和熄滅程序;

編譯運行,可以看到LED1和LED2 分別以不同的頻率閃爍。
下面重點分析生成的代碼:

下面分析MX_FREERTOS_Init()函數(shù);
void MX_FREERTOS_Init(void)
{
osThreadDef(Task_LED1, Func_LED1, osPriorityNormal, 0, 128);//宏定義,定義了一個名為os_thread_def_Task_LED1的osThreadDef_t類型結(jié)構(gòu)體,并賦值給各個成員變量。
Task_LED0Handle = osThreadCreate(osThread(Task_LED1), NULL);//創(chuàng)建了LED1任務(wù)
osThreadDef(Task_LED2, Func_LED2, osPriorityNormal, 0, 128);//宏定義,定義了一個名為os_thread_def_Task_LED2的osThreadDef_t類型結(jié)構(gòu)體,并賦值給各個成員變量。
Task_LED1Handle = osThreadCreate(osThread(Task_LED2), NULL);//創(chuàng)建了LED2任務(wù)
}
go to definition of osThreadDef,該宏定義如下
#define osThreadDef(name, thread, priority, instances, stacksz) \
const osThreadDef_t os_thread_def_##name = \
{ #name, (thread), (priority), (instances), (stacksz)}
#endif
上訴宏定義中出現(xiàn)了##和# 符號,其中
##是一個連接符號,用于把參數(shù)連在一起;
#是“字符串化”的意思。出現(xiàn)在宏定義中的#是把跟在后面的參數(shù)轉(zhuǎn)換成一個字符串。
例如:
#define paster( n ) printf( "token" #n" = %d\n ", token##n )
所以paster(9);就是相當于 printf("token 9 = %d\n",token9);
那么osThreadDef(Task_LED1, Func_LED1, osPriorityNormal, 0, 128);等價于下面的定義
#defineosThreadDef(Task_LED1, Func_LED1, osPriorityNormal, 0, 128) \
const osThreadDef_t os_thread_def_Task_LED1 = { Task_LED1,Func_LED1,osPriorityNormal, 0, 128}
#endif
總結(jié):
本例中的兩個任務(wù)函數(shù)Func_LED1和Func_LED2,他們實際占用CPU的時間很少,在調(diào)用osDelay()函數(shù)之后,它們就進入阻塞狀態(tài)了,它們在等待“定時時間到”事件。在用戶任務(wù)都進入阻塞狀態(tài)時,運行的是空閑任務(wù)??臻e任務(wù)是啟動調(diào)度器時自動創(chuàng)建的。
在調(diào)試過程中,嘗試把兩個任務(wù)函數(shù)的osDelay都改成500后,觀察現(xiàn)象是LED1和LED2同時同頻率的閃爍,但這和FreeRTOS中的某一任意時刻,只會有一個任務(wù)在運行,不會有同時兩個任務(wù)在運行的理論相悖。之后分析發(fā)現(xiàn),在調(diào)用osDelay()函數(shù)之后,它們就進入阻塞狀態(tài)了,當500ms到時,LED1先切換至運行態(tài),之后LED2切換至運行態(tài),然后進入組態(tài)等待下一個500ms。LED1運行和切換到LED2這個時間非常短,以至于表面上看lED1和LED2同時運行,實際上依然是2個任務(wù)在不停的切換。
|