电竞比分网-中国电竞赛事及体育赛事平台

分享

STM32+cubeMX+FreeRTOS學習(1)

 奔跑的瓦力 2019-01-28

背景:

最近項目要在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ù)在不停的切換。

 

 

 

 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多