一、移植環境
系統:WIN7
MDK:keil v5.26
開發板:GD32F303C-EVAL
固件庫:V1.0.2
FreeRTOS版本:V10.4.0
二、複製FreeRTOS到工程文件中
1> FreeRTOS簡要介紹
FreeRTSO下載連結:https://www.freertos.org/a00104.html
將下載的文件解壓,內容如下:FreeRTOS就是我們需要移植用到的,裡面包含了官方移植的demo和內核文件,FreeRTOS-Plus裡面包含了一些第三方的組件。
將下載的文件解壓,內容如下:FreeRTOS就是我們需要移植用到的,裡面包含了官方移植的demo和內核文件,FreeRTOS-Plus裡面包含了一些第三方的組件。
FreeRTOS文件夾內容如下:Demo文件夾下是官方在開發板移植好的demo,可以參考,Source文件夾下就是我們需要移植的內核文件。
Source文件夾內容如下:
2> 在準備好的工程下創建一個FreeRTOS文件夾下,將1>提到的Source文件中所有的內容複製到這個文件夾下:
刪除上圖中紅框中的內容,如下:
在當前目錄下新建一個文件夾src,將紅框中的內容剪切到src文件夾下,如下圖:
進入到portable文件夾下,只保留下圖三個文件夾,其餘全部刪除,如下圖:
其中keil文件夾下沒有可以用的內容,MemMang下是官方給的5種內存管理的方法,沒有好壞之分,都有優缺點,根據需要選一種方式即可。
三、添加FreeRTOS文件到工程
1> 添加src下的文件到工程
2> 添加portable/MemMang/heap_4文件到工程
3> 添加portable/RVDS/ARM_CM4F/port文件到工程,因為GD32F303內核是Cortex-M4F內核。
4> 添加相應的頭文件路徑
5>編譯一下,提示如下錯誤
缺少FreeRTOSConfig.h這個頭文件,我們在FreeRTOS源碼中複製一個將這個路徑下的(FreeRTOS\FreeRTOS\Demo\CORTEX_STM32F103_Keil)FreeRTOSConfig.h文件複製到工程中,並且添加到工程中,如下圖:
6>再次編譯,提示如下錯誤:
其實就是缺少一個宏定義,這裡可以在FreeRTOSConfig.h中定義一個
再次編譯發現沒有錯誤了。
7>寫一個簡單的LED任務測試一下,如下圖:
下載到開發板,發現並沒有LED運行,仿真調試發現,MCU進入了硬體中斷,如下圖:
這裡我們仔細看一下,FreeRTOSConfig.h這個文件的配置,源碼如下:
由上面代碼可以看出,這裡系統時鐘是需要更改的,configCPU_CLOCK_HZ這個是系統時鐘,GD32F303是120Mhz的主頻;configTOTAL_HEAP_SIZE設置堆得大小,這裡設置了17KB的大小,而在啟動代碼裡,堆設置了1KB,棧的大小也是設置的1KB,***注意:這三者的總和不能超過MCU自身的RAM大小。***如下圖:
這裡,我們將啟動文件裡的堆改成0x00000200(0.5KB),configTOTAL_HEAP_SIZE也更改成20KB,更改如下:
接下來編譯進行下載,發現依舊會進入硬體中斷,這就可能讓人很崩潰了,這裡需要了解一下FreeRTOS在Cortex內核中如何實現任務切換的機制,這裡可以參考SVC & PendSV這篇博客,總的來說,既然想實現任務切換,就需要重新寫這兩個函數,之後在查看一下內核文件port.c,發現這裡已經幫我們寫好了,那就簡單了,我們將gd32f30x_it.c文件裡這兩個中斷函數給刪掉,如下:
這裡再次進行仿真下載調試,本以為可以萬事大吉了,卻還是被顯示狠狠打臉了,仿真發現,程序死在了下面的循環中:
如上圖,程序死在了SVC_Handler中斷這,而我們上一步是把這個函數給刪了,因為在上一步操作時,我們分析,內核文件port.c中幫我們重新寫了這個函數,我們找到這個對應的函數如下:
呵呵,這就尷尬了,官方寫的這個函數名稱和啟動文件中的中斷入口函數名稱不一致,既然如此,只能讓這兩個函數名聯繫到一起才行,我們在FreeRTOS.h中添加如下代碼:
這下總應該可以了吧,下載編譯,發現燈點亮了,心裡那個開心啊,可是下一秒哭的心都有了,創建的任務是燈閃爍,現在燈只是點亮了並沒有閃爍。仿真調試,發現如下:
看到這個現象,心情放鬆了一下,和之前現象類似,那我們接著去port.c文件去找一下,果真被我找到了:如下:
那仿照之前的操作,在FreeRTOSConfig.h中添加:
LED終於亮了,至此,FreeRTOS最基本的移植完成。【本文參考CSDN:笙歌君獨憂】