FreeRTOS应用开发笔记之一:FreeRTOS在STM32的移植
FreeRTOS是如今在小型嵌入式領(lǐng)域應(yīng)用比較廣泛的一種實時操作系統(tǒng)。它是一種開源且免費的操作系統(tǒng),而且移植和使用都非常的簡單。在這里我們將學習并移植FreeRTOS。
1、必要的準備
工欲善其事,必先利其器,在開始學習和移植之前,相應(yīng)的準備工作必不可少。所以在開始我們需要有必要的準備:
- 下載FreeRTOS源碼,可以從官網(wǎng)下載源碼,最新版本為V10.0.1,官網(wǎng)地址:https://www.freertos.org/a00104.html
- 下載學習資料,FreeRTOS官方提供入門手冊和參考手冊,可以在線查看,也可以下載pdf版本的電子書。下載網(wǎng)址:https://www.freertos.org/Documentation/RTOS_book.html
- 準備實驗平臺,此次我們將在STM32F407平臺上移植和測試FreeRTOS系統(tǒng)
下載的FreeRTOS源碼是一個自解壓的文件,解壓后包含的內(nèi)容比較豐富,不過目錄結(jié)構(gòu)很清晰,主要包含兩個子目錄:FreeRTOS和FreeRTOS-Plus。如下所示:
- FreeRTOS-Plus?????? 包含F(xiàn)reeRTOS+組件和演示例程;
- FreeRTOS??????????????? 包含F(xiàn)reeRTOS實時內(nèi)核源文件和演示例程。
我們學習的FreeRTOS內(nèi)核部分在FreeRTOS目錄之下,打開FreeRTOS文件夾它又被分成兩個主要的子目錄,如下所示:
- Demo???????? 包含演示例程工程;
- License????? 包含授權(quán)文件
- Source?????? 包含實時內(nèi)核源文件。
RTOS代碼的核心包含在三個文件中:tasks.c、queue.c、list.c。這三個文件位于FreeRTOS/Source目錄。在該目錄下還包含三個可選的文件:timers.c、event_groups.c、croutine.c,分別實現(xiàn)軟件定時、事件組和協(xié)程功能。打開Source文件夾,FreeRTOS/Source目錄結(jié)構(gòu)如下所示:
應(yīng)用平臺的不同,所以每個支持的處理器架構(gòu)都有一段與處理器架構(gòu)相關(guān)的RTOS代碼。這個是RTOS移植層,它位于FreeRTOS/Source/Portable/[相應(yīng)編譯器]/[相應(yīng)CPU架構(gòu)]子目錄。
對于FreeRTOS,堆棧設(shè)計也屬于移植層。FreeRTOS/Source/portable/MemMang目錄下heap_x.c文件給出了多種堆棧方案,在后續(xù)的移植中,會詳細說明。
2、簡單的移植
前面我們簡要說明了移植的準備工作,接下來我們開始最主要的移植。本次移植我們將在IAR平臺上進行,首先要創(chuàng)建一個IAR項目。我們在IAR下創(chuàng)建一個名為pfreertos的項目,并添加Application、Drivers和Middlewares幾個組。并在Application下添加EWARM和User組;在Drivers下添加CMSIS和STM32F4xx_HAL_Driver組;在Middlewares下添加FreeRTOS組,具體如下:
至于具體文件的物理路徑并沒有特別要求,但為了便于管理,我們強烈建議放到一起。并將相關(guān)的FreeRTOS源碼拷貝到該項目目錄下。
將\FreeRTOSv10.0.1\FreeRTOS\Source目錄下的源文件及include文件夾復(fù)制到新建項目的文件夾中。
將\FreeRTOSv10.0.1\FreeRTOS\Source\portable\IAR\ARM_CM4F目錄下的三個文件也復(fù)制到新建項目的文件夾。
將\FreeRTOSv10.0.1\FreeRTOS\Source\portable\MemMang目錄下的heap_4.c文件復(fù)制到新建項目的文件夾。
將\FreeRTOSv10.0.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK目錄下的FreeRTOSConfig.h文件復(fù)制到新建項目的文件夾。
同時將這下文件添加到我們前面創(chuàng)建的pfreertos項目中,其它如ST驅(qū)動及用戶應(yīng)用也添加到項目中。并將相關(guān)的引用目錄添加到項目屬性中。需要說一下的是在Assembler中的Preprocessor標簽下添加也需要添加FreeRTOSConfig.h的引用路徑,因為在匯編文件中有對FreeRTOSConfig.h文件的引用。
在FreeRTOSConfig.h 配置文件中,有如下3個宏定義:
#define vPortSVCHandler????????? SVC_Handler
#define xPortPendSVHandler???? PendSV_Handler
#define xPortSysTickHandler???? SysTick_Handler
需要在stm32f4xx_it.c文件中,將對應(yīng)的三個空的函數(shù)定義注釋掉。至此,其實編譯就已不會有錯,移植工作已經(jīng)完成。當然在有些其他的基礎(chǔ)庫也需要使用SysTick時,我們也可以在中斷中調(diào)用xPortSysTickHandler()函數(shù)來實現(xiàn)我們的需求。
3、移植測試
前面我們已經(jīng)移植了FreeRTOS,接下來我們創(chuàng)建多個任務(wù)測試一下它。
在main.c文件中添加相應(yīng)的代碼,聲明如下函數(shù)及代碼(我計劃4個任務(wù)):
/*************************************************************************** 函數(shù)聲明 ***************************************************************************/ static void vTask1(void *pvParameters); static void vTask2(void *pvParameters); static void vTask3(void *pvParameters); static void vTask4(void *pvParameters); static void AppTaskCreate (void);/*************************************************************************** 變量聲明 ***************************************************************************/ static TaskHandle_t xHandleTask1 = NULL; static TaskHandle_t xHandleTask2 = NULL; static TaskHandle_t xHandleTask3 = NULL; static TaskHandle_t xHandleTask4 = NULL;任務(wù)創(chuàng)建函數(shù)如下:
static void AppTaskCreate (void) {xTaskCreate( vTask1, "vTask1",512, NULL,1, &xHandleTask1);xTaskCreate( vTask2, "vTask2",512, NULL,1, &xHandleTask2);xTaskCreate( vTask3, "vTask3",512, NULL,1, &xHandleTask3);xTaskCreate( vTask4, "vTask4",512, NULL,1, &xHandleTask4); }主函數(shù)如下:
int main(void) {/* 創(chuàng)建任務(wù) */AppTaskCreate();/* 啟動任務(wù)調(diào)度,開始執(zhí)行任務(wù) */vTaskStartScheduler(); }編譯無錯誤4個任務(wù)同時運行。移植初步測試成功。
4、幾點說明
在FreeRTOS中定義了多種內(nèi)存管理方式,對應(yīng)的文件有5個,那么每個文件實現(xiàn)了什么?怎么選用呢?我們對于內(nèi)存管理的幾個文件的大致內(nèi)容描述如下:
- heap_1.c:這是所有實現(xiàn)中最簡單的一個。一旦分配內(nèi)存之后,它甚至不允許釋放分配的內(nèi)存。
- heap_2.c:和heap_1不同,這個方案使用一個最佳匹配算法,它允許釋放之前分配的內(nèi)存塊。它不會把相鄰的空閑塊合成一個更大的塊,可能會造成內(nèi)存碎片。
- heap_3.c:簡單的包裝了標準庫中的malloc()和free()函數(shù),包裝后的malloc()和free()函數(shù)具備線程保護。
- heap_4.c:這個方案使用一個最佳匹配算法,但不像方案2那樣。它會將相鄰的空閑內(nèi)存塊合并成一個更大的塊。
- heap_5.c:這個方案同樣實現(xiàn)了heap_4.c中的合并算法,并且允許堆棧跨越多個非連續(xù)的內(nèi)存區(qū)。
在前面說過FreeRTOSConfig.h 配置文件中,有如下3個宏定義。該宏定義避免了修改啟動文件,但有一個地方需要注意一下。就是第3個宏定義“#define xPortSysTickHandler?????? SysTick_Handler”。如果采用的是ST的標準庫沒有問題,但如果采用的是HAL庫,由于HAL庫需要SysTick中斷才能穩(wěn)定運行,所以不能采用宏定義,而是在stm32f4xx_it.c文件中的SysTick中斷響應(yīng)函數(shù)中調(diào)用xPortSysTickHandler函數(shù)。
歡迎關(guān)注:
?
總結(jié)
以上是生活随笔為你收集整理的FreeRTOS应用开发笔记之一:FreeRTOS在STM32的移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows平台下的反调试技术
- 下一篇: CodeTank iOS App Tec