FreeRTOS實(shí)時(shí)操作系統(tǒng)移植操作示例指南
1.添加FreeRTOS源碼
在基礎(chǔ)工程中新建一個(gè)名為 FreeRTOS 的文件夾,將 FreeRTOS 的源碼(source文件夾下的內(nèi)容)添加到這個(gè)文件夾中
portable文件夾中,只需留下 keil、MemMang 和 RVDS這三個(gè)文件夾,其他的都可以刪除掉。
2.向工程分組中添加文件
打開基礎(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中拷貝一份過來。本人已經(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)還沒運(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;//開啟SYSTICK中斷 SysTick->LOAD=reload; //每1/configTICK_RATE_HZ斷一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //開啟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í)間超過/等于要延遲的時(shí)間,則退出. } } } //延時(shí)nms,其實(shí)就是對(duì)會(huì)vTaskDelay的簡單封裝,會(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)無法提供這么小的延時(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í)間超過/等于要延遲的時(shí)間,則退出. } } }*/
以上就是FreeRTOS移植操作示例指南的詳細(xì)內(nèi)容,更多關(guān)于FreeRTOS移植的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- FreeRTOS實(shí)時(shí)操作系統(tǒng)在Cortex-M3上的移植過程
- FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南
- freertos實(shí)時(shí)操作系統(tǒng)臨界段保護(hù)開關(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)核配置說明
相關(guān)文章
FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS進(jìn)階內(nèi)存管理示例完全解析
這篇文章主要為大家介紹了FreeRTOS進(jìn)階內(nèi)存管理示例的完全解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS實(shí)時(shí)操作系統(tǒng)的列表與列表項(xiàng)操作示例
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的列表與列表項(xiàng)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南
這篇文章主要為大家介紹了FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)核控制示例解析
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)核控制示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04freertos實(shí)時(shí)操作系統(tǒng)空閑任務(wù)阻塞延時(shí)示例解析
這篇文章主要為大家介紹了freertos實(shí)時(shí)操作系統(tǒng)的空閑任務(wù)及阻塞延時(shí)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04FreeRTOS實(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-04FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)存管理分析
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)存管理的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04