FreeRTOS實(shí)時(shí)操作系統(tǒng)移植操作示例指南
1.添加FreeRTOS源碼
在基礎(chǔ)工程中新建一個(gè)名為 FreeRTOS 的文件夾,將 FreeRTOS 的源碼(source文件夾下的內(nèi)容)添加到這個(gè)文件夾中

portable文件夾中,只需留下 keil、MemMang 和 RVDS這三個(gè)文件夾,其他的都可以刪除掉。
2.向工程分組中添加文件
打開(kāi)基礎(chǔ)工程,新建分組 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向這兩個(gè)分組中添加文件

port.c 是 RVDS 文件夾下的 ARM_CM4F 中的文件,因?yàn)?STM32F429 是 Cortex-M4 內(nèi)核并且?guī)в?FPU,因此要選擇 ARM_CM4F 中的 port.c 文件。heap_4.c 是 MemMang 文件夾中的,MemMang 文件夾中的五個(gè)內(nèi)存管理方案后面再講。
添加完 FreeRTOS 源碼中的 C 文件以后再添加 FreeRTOS 源碼的頭文件路徑。

編譯后發(fā)現(xiàn),缺少“FreeRTOSConfig.h”這個(gè)文件,這可文件可以去FreeRTOS的官方Demo中拷貝一份過(guò)來(lái)。本人已經(jīng)對(duì)其做了相應(yīng)的修改,并注釋好,里面的內(nèi)容我將在下一章貼上并對(duì)其進(jìn)行相應(yīng)的注解。
然后,由于FreeRTOS已經(jīng)幫我們實(shí)現(xiàn)了PendSV_Handler()和SVC_Handler()函數(shù),所以我們?cè)趕tm32f4xx_it.c中注釋掉這兩個(gè)函數(shù)。而SysTickHandler()這個(gè)函數(shù)我們不需要FreeRTOS幫我們實(shí)現(xiàn),而是我們自行在delay.c中實(shí)現(xiàn),
附上delay.c和delay.h的代碼
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
}
static u8 fac_us=0; //us延時(shí)倍乘數(shù)
static u16 fac_ms=0; //ms延時(shí)倍乘數(shù)
void delay_init()
{
u32 reload;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
fac_us=SystemCoreClock/1000000; //系統(tǒng)還沒(méi)運(yùn)行,以Systick計(jì)時(shí)
reload=SystemCoreClock/configTICK_RATE_HZ; //configTICK_RATE_HZ=1000
fac_ms=1000/configTICK_RATE_HZ; //系統(tǒng)已經(jīng)運(yùn)行,這就是個(gè)節(jié)拍數(shù),用于給系統(tǒng)提供的延遲函數(shù)
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//開(kāi)啟SYSTICK中斷
SysTick->LOAD=reload; //每1/configTICK_RATE_HZ斷一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //開(kāi)啟SYSTICK
}
//延遲us,不會(huì)引起任務(wù)切換
//注意:nus的值,不要大于23860929us(最大值即2^32/fac_us@fac_us=180)
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的節(jié)拍數(shù)
told=SysTick->VAL; //剛進(jìn)入時(shí)的計(jì)數(shù)器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //這里注意一下SYSTICK是一個(gè)遞減的計(jì)數(shù)器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //時(shí)間超過(guò)/等于要延遲的時(shí)間,則退出.
}
}
}
//延時(shí)nms,其實(shí)就是對(duì)會(huì)vTaskDelay的簡(jiǎn)單封裝,會(huì)引起任務(wù)調(diào)度
//nms:要延時(shí)的ms數(shù)
//nms:0~65535
void delay_ms(u32 nms)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系統(tǒng)已經(jīng)運(yùn)行
{
if(nms>=fac_ms) //延時(shí)的時(shí)間大于OS的最少時(shí)間周期
{
vTaskDelay(nms); //FreeRTOS延時(shí):vTaskDelay演示固定的時(shí)鐘節(jié)拍,由于前面設(shè)定了頻率為1000HZ,所以一個(gè)節(jié)拍就是1ms
}
nms%=fac_ms; //OS已經(jīng)無(wú)法提供這么小的延時(shí)了,采用普通方式延時(shí)
}
delay_us((u32)(nms*1000)); //普通方式延時(shí)
}
//延時(shí)nms,不會(huì)引起任務(wù)切換
//nms:要延時(shí)的ms數(shù)
void delay_xms(u32 nms)
{
u32 i;
for(i=0;i<nms;i++) delay_us(1000);
}
//延時(shí)ms:不會(huì)引起任務(wù)切換
//注意nms的范圍
//SysTick->LOAD為24位寄存器
//對(duì)180M條件下,nms<=23860ms (最大值即2^32/fac_ms@fac_ms=180*1000)
/*void delay_ms(u16 nms)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nms*fac_ms; //需要的節(jié)拍數(shù)
told=SysTick->VAL; //剛進(jìn)入時(shí)的計(jì)數(shù)器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //這里注意一下SYSTICK是一個(gè)遞減的計(jì)數(shù)器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //時(shí)間超過(guò)/等于要延遲的時(shí)間,則退出.
}
}
}*/以上就是FreeRTOS移植操作示例指南的詳細(xì)內(nèi)容,更多關(guān)于FreeRTOS移植的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- FreeRTOS實(shí)時(shí)操作系統(tǒng)在Cortex-M3上的移植過(guò)程
- FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南
- freertos實(shí)時(shí)操作系統(tǒng)臨界段保護(hù)開(kāi)關(guān)中斷及進(jìn)入退出
- FreeRTOS實(shí)時(shí)操作系統(tǒng)多任務(wù)管理基礎(chǔ)知識(shí)
- FreeRTOS操作系統(tǒng)的配置示例解析
- FreeRTOS實(shí)時(shí)操作系統(tǒng)臨界段保護(hù)場(chǎng)合示例
- FreeRTOS實(shí)時(shí)操作系統(tǒng)結(jié)構(gòu)示例
- FreeRTOS實(shí)時(shí)操作系統(tǒng)特點(diǎn)介紹
- freertos實(shí)時(shí)操作系統(tǒng)空閑任務(wù)阻塞延時(shí)示例解析
- FreeRTOS實(shí)時(shí)操作系統(tǒng)內(nèi)核配置說(shuō)明
相關(guān)文章
FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS進(jìn)階內(nèi)存管理示例完全解析
這篇文章主要為大家介紹了FreeRTOS進(jìn)階內(nèi)存管理示例的完全解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)的列表與列表項(xiàng)操作示例
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的列表與列表項(xiàng)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南
這篇文章主要為大家介紹了FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)核控制示例解析
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)核控制示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
freertos實(shí)時(shí)操作系統(tǒng)空閑任務(wù)阻塞延時(shí)示例解析
這篇文章主要為大家介紹了freertos實(shí)時(shí)操作系統(tǒng)的空閑任務(wù)及阻塞延時(shí)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級(jí)實(shí)現(xiàn)
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級(jí)實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)存管理分析
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)存管理的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04

