的FreeRTOS移植思路及過(guò)程)
一 、FreeRTOS 簡(jiǎn)介官網(wǎng)https://www.freertos.org/zh-cn-cmn-sFreeRTOS 是一款開(kāi)源的實(shí)時(shí)操作系統(tǒng)RTOS專為嵌入式系統(tǒng)設(shè)計(jì)。其核心特點(diǎn)包括輕量級(jí)、可移植性強(qiáng)、支持多任務(wù)調(diào)度適用于資源受限的硬件環(huán)境。FreeRTOS 遵循 MIT 開(kāi)源協(xié)議允許商業(yè)應(yīng)用無(wú)需支付授權(quán)費(fèi)用。核心功能多任務(wù)管理支持基于優(yōu)先級(jí)的搶占式調(diào)度允許任務(wù)動(dòng)態(tài)創(chuàng)建和刪除。內(nèi)存管理 提供多種內(nèi)存分配方案如 heap_1 至 heap_5適應(yīng)不同硬件資源需求。同步與通信包含隊(duì)列、信號(hào)量、互斥鎖等機(jī)制支持任務(wù)間高效通信。低功耗支持提供 Tickless 模式減少空閑任務(wù)時(shí)的 CPU 功耗。二 、rtos移植(1)、下載1、官網(wǎng)github下載官網(wǎng)下載地址https://www.freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/01-About-the-FreeRTOS-kernel/03-Download-freeRTOS/01-DownloadFreeRTOS進(jìn)入之后下拉可以找到不同的版本若需要之前的版本可以點(diǎn)擊下圖所示的位置進(jìn)行跳轉(zhuǎn)跳轉(zhuǎn)之后進(jìn)入到github頁(yè)面點(diǎn)擊tags進(jìn)入到這個(gè)頁(yè)面后可以看到不同的版本如果沒(méi)有我們需要的可以點(diǎn)擊最下面的 next按鈕本文需要的v10.2.1版本在后面第二頁(yè)或者第三頁(yè)的位置找到需要的版本后點(diǎn)擊跳轉(zhuǎn)到新頁(yè)面選擇要下載的壓縮方式點(diǎn)擊就會(huì)開(kāi)始下載下載完成后進(jìn)行解壓解壓位置自行決定使用完就可以刪除了2、代碼托管平臺(tái)下載代碼托管網(wǎng)站https://sourceforge.net/projects/freertos/files/FreeRTOS/進(jìn)入之后我們可以直接看到很多個(gè)版本我們選擇對(duì)應(yīng)的版本點(diǎn)擊后點(diǎn)擊對(duì)應(yīng)的壓縮包稍等片刻就會(huì)下載。(2)、文件移植結(jié)束后我們就會(huì)得到如下的一個(gè)文件夾進(jìn)入到下圖對(duì)應(yīng)的文件目錄下包括三個(gè)部分第一部分和第三部分包含的是FreeRTOS的通用的頭文件和C文件這兩部分的文件是通用的試用于各種編譯器和處理器。第二部分portable是與編譯器相關(guān)的文件夾在不同的編譯器中需要使用不同的支持文件。我們?cè)谧约旱墓こ涛募夸浵滦陆ㄒ粋€(gè)FreeRTOS文件夾在FreeRTOS文件夾下面新建如下圖所示的幾個(gè)文件夾。將上述的include文件夾和下面的文件復(fù)制到新建的文件夾下其中include存放的是上述第一部分include文件src存放的是上圖第三部分所有的.c文件我們點(diǎn)擊上述的第二部分portable文件夾進(jìn)入之后可以看到我們熟悉的keil但是這個(gè)文件夾是空的讓我們參考RVDS文件夾。打開(kāi)RVDS文件夾后可以看到不同內(nèi)核的文件夾我是以stm32f407為例子所以選擇的是m4內(nèi)核f407vet6帶有浮點(diǎn)運(yùn)算所以選擇紅色框內(nèi)的。如果是其他系列的點(diǎn)擊對(duì)應(yīng)的文件夾。例如stm32f103則選擇M3內(nèi)核的文件夾將其中的.c文件和.h文件復(fù)制到我們?cè)诠こ讨薪ǖ腇reeRTOS文件夾下port文件夾中即可。復(fù)制之后回到portable文件夾下面點(diǎn)擊MemMang可以看到有五種方式heap_1-- 最簡(jiǎn)單不允許釋放內(nèi)存。heap_2-- 允許釋放內(nèi)存但不會(huì)合并相鄰的空閑塊。heap_3-- 簡(jiǎn)單包裝了標(biāo)準(zhǔn) malloc() 和 free()以保證線程安全。heap_4-- 合并相鄰的空閑塊以避免碎片化。包含絕對(duì)地址放置選項(xiàng),heap_5-- 如同 heap_4能夠跨越多個(gè)不相鄰內(nèi)存區(qū)域的堆。這里我們選擇heap_4.c文件復(fù)制后放入到我們工程中port文件夾下此時(shí)port文件夾如下接著我們回到下圖對(duì)應(yīng)的文件目錄下找到對(duì)應(yīng)的stm32F407。如果是其他系列單片機(jī)在文件中找到對(duì)應(yīng)的文件夾點(diǎn)進(jìn)去即可下面操作步驟一樣點(diǎn)擊之后將下圖紅框的文件復(fù)制粘貼到我們工程下建的FreeRTOS文件夾下此時(shí)我們的文件已經(jīng)齊全了(3)、keil中配置打開(kāi)工程在三色盒子中創(chuàng)建兩個(gè)文件夾FreeRTOS/srcFreeRTOS/port。其中src包含所有的.c文件port包含如下圖所示文件完成點(diǎn)擊魔法棒按下圖所示包含.h文件我們?cè)倬幾g一下發(fā)現(xiàn)有以下錯(cuò)誤..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c(788): error: #20: identifier SystemCoreClock is undefined此時(shí)我們需要修改為如下圖所示#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)改完后有以下報(bào)錯(cuò)這個(gè)報(bào)錯(cuò)是因?yàn)樵趐ort.c 和stm32f4xx_it.c文件中出現(xiàn)重復(fù)定義的函數(shù)SVC_Handler、SysTick_Handler、 PendSV_Handler。..\OBJ\MALLOC.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o)...\OBJ\MALLOC.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o)...\OBJ\MALLOC.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32f4xx_it.o).我們將stm32f4xx_it.c中這三個(gè)函數(shù)直接注釋掉再編譯。其他系列單片機(jī)找到對(duì)應(yīng)的中斷.c文件即可內(nèi)容一樣接下來(lái)出現(xiàn)如下錯(cuò)誤。這是由于沒(méi)有定義這些函數(shù)而導(dǎo)致的這些未定義的函數(shù)它們都是Hook 結(jié)尾的這些函數(shù)有個(gè)共同的名稱:鉤子函數(shù)。將相應(yīng)的宏定義改為0即可。..\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o)...\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o)...\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o)...\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationMallocFailedHook (referred from heap_4.o).這里將下列宏定義為 0confiUSE IDLE HOOK、confgUSE TICK HOOKconfigCHECK FOR STACK OVERFLOWconfigUSE MALLOC FAILED HOOK最后編譯一下應(yīng)該就沒(méi)有錯(cuò)誤了圖片中我已經(jīng)修改了部分參數(shù)但不影響觀看(4)、編寫任務(wù)測(cè)試運(yùn)行移植過(guò)程如果還有錯(cuò)誤的話可以自行根據(jù)錯(cuò)誤類型處理也可以評(píng)論區(qū)進(jìn)行討論一下。博主看到會(huì)及時(shí)回復(fù)后續(xù)有什么錯(cuò)誤我會(huì)及時(shí)更新。