1、FreeRTOS的學(xué)習(xí)
1.1、FreeRTOS的源碼下載
學(xué)習(xí)一個(gè)操作系統(tǒng)前,首先要下載對(duì)應(yīng)的源碼,用于研究和學(xué)習(xí)。FreeRTOS的源碼下載鏈接如下:
https://sourceforge.net/projects/freertos/files/FreeRTOS/
頁面圖示如下:
下載之后的文件為:FreeRTOSv202012.00-LTS.exe.qbl
1.2、FreeRTOS在線API指南
FreeRTOS提供了在線的API接口的指南,這對(duì)于開發(fā)和學(xué)習(xí)都是非常的友好的,在線API指南的網(wǎng)址為:
http://web.ist.utl.pt/~ist11993/FRTOS-API/index.html
在線指南的示意圖如下:
1.3、在線應(yīng)用指南
除了在線的API應(yīng)用指南之外,還有一個(gè)在線的開發(fā)指導(dǎo)手冊(cè),是非常好用的一份手冊(cè):
https://www.freertos.org/RTOS.html
圖示如下:
2、FreeRTOS移植到MCU上
0.基于STM32F103的移植,其它系列MCU類似。
硬件平臺(tái): STM32F103ZET6 ;
軟件平臺(tái):MDK529
FreeTROS版本:FreeRTOS Kernel V10.4.3
1.在工程目錄下新建FreeRTOS文件夾,該文件夾用于存放FreeRTOS相關(guān)的文件。
2.在FreeRTOSv10.2.1FreeRTOSSource路徑下找到FreeRTOS的源碼,將其拷貝到工程中的FreeRTOS文件夾中。
其中頭文件和源碼源文件是全部要用到的,不做任何刪除。
portable文件夾是和硬件平臺(tái),軟件開發(fā)環(huán)境相關(guān)的文件。FreeRTOS為了讓用戶移植簡(jiǎn)單,幫用戶做了很多工作。打開portable文件夾如下:
3.打開工程,在工程中添加一個(gè)專用來存放FreeRTOS的Group
將FreeRTOS的源文件,內(nèi)存管理文件,硬件接口文件統(tǒng)統(tǒng)添加到這個(gè)FreeRTOS這個(gè)Group中
內(nèi)存管理文件在FreeRTOSportableMemMang文件夾下,F(xiàn)reeRTOS提供了五種內(nèi)存管理方案,對(duì)于移植來說,隨便選一種方案都是可以的。但是heap_4有內(nèi)存碎片管理的功能,對(duì)內(nèi)存碎片可以自動(dòng)監(jiān)控和收集,所以選擇這個(gè)內(nèi)存管理會(huì)更好。
port.c文件在FreeRTOSportableRVDS路徑下找到與自己使用的MCU內(nèi)核的文件夾:
4.添加頭文件路徑,需要添加兩個(gè)路徑。
5.編譯
便已完成之后,提示打不開FreeRTOSConfig.h這個(gè)文件。這是因?yàn)镕reeRTOS源碼中并沒有提供這個(gè)文件。
這種情況下有兩種辦法:
第一、自己動(dòng)手寫一個(gè)(哈哈,個(gè)人覺得這個(gè)對(duì)一般人來說不現(xiàn)實(shí));
第二、找一個(gè)可以直接用的。
仔細(xì)找找會(huì)發(fā)現(xiàn),其實(shí)官方在很多平臺(tái)下都移植了FreeRTOS。去官方的demo中找,F(xiàn)reeRTOSv10.2.1FreeRTOSDemo路徑下存放的全是官方移植的demo。在此路徑下找到CORTEX_STM32F103_Keil文件夾,此文件夾是官方基于STM32F103和MDK平臺(tái)移植的demo。(其他平臺(tái)參考該方式類似的查找)
在此文件夾下找到FreeRTOSConfig.h文件。
將其拷貝到源碼的頭文件中。重新進(jìn)行編譯。
這種情況下,只要使能一個(gè)有關(guān)的宏定義為1即可以,在FreeRTOSConfig.h文件中將宏INCLUDE_xTaskGetCurrentTaskHandle定義為1,使能該函數(shù),重新編譯一下,應(yīng)該就不會(huì)報(bào)錯(cuò)了。
6.添加三個(gè)宏定義
首先我們需要對(duì)FreeRTOS的幾個(gè)很重要的問題要有一個(gè)認(rèn)識(shí):
<1> FreeRTOS觸發(fā)第一個(gè)任務(wù)是在SVC_Handler中斷中進(jìn)行的;
<2> 切換任務(wù)是在PendSV_Handler中斷中進(jìn)行的;
<3> 系統(tǒng)節(jié)拍中斷是在SysTick_Handler中進(jìn)行的。
在我們自己移植的項(xiàng)目中,官方的文件中對(duì)3個(gè)函數(shù)的定義是沒有的,需要我們自己進(jìn)行一些修改。
在官方的提供的文件中,實(shí)現(xiàn)了另外3個(gè)相關(guān)的函數(shù),名字分別是:
vPortSVCHandler
xPortPendSVHandler
xPortSysTickHandler。
所以,我們只需要根據(jù)自己所用的MCU環(huán)境進(jìn)行相應(yīng)的替換即可以對(duì)應(yīng)上了。在FreeRTOSConfig.h頭文件中做一下宏定義就可以了。注意要將自己的原來3個(gè)空函數(shù)注釋掉。
這三個(gè)宏定義非常重要!!!
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
其中,xPortSysTickHandler是系統(tǒng)滴答定時(shí)器中斷,用于給FreeRTOS提供運(yùn)行的心跳節(jié)拍的,代碼示意如下:
void xPortSysTickHandler( void )
{
/* The SysTick runs at the lowest interrupt priority, so when this interrupt
* executes all interrupts must be unmasked. There is therefore no need to
* save and then restore the interrupt mask value as its value is already
* known - therefore the slightly faster vPortRaiseBASEPRI() function is used
* in place of portSET_INTERRUPT_MASK_FROM_ISR(). */
vPortRaiseBASEPRI();
{
/* Increment the RTOS tick. */
if( xTaskIncrementTick() != pdFALSE )
{
/* A context switch is required. Context switching is performed in
* the PendSV interrupt. Pend the PendSV interrupt. */
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
}
}
vPortClearBASEPRIFromISR();
}
-
移植
+關(guān)注
關(guān)注
1文章
375瀏覽量
28072 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61849 -
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
168瀏覽量
14106
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論