STM32F103--移植FreeRTOS完整教程
最近按照正點原子教程開始學習FreeRTOS,發現其手冊的移植教程中有些地方可能不是那么詳細,在此基于正點原子做一期最完整的FreeRTOS移植教程給大家。
小b將本次教程整理的資料放在網盤,以下鏈接供各位小伙伴下載和學習:
鏈接:https://pan.baidu.com/s/1z74dzFtQ198XLJwYhOVWlw
提取碼:rson
打開FreeRTOS.exe文件,等待些許時間獲取FreeRTOS源碼
拷貝庫函數一個最簡單的跑馬燈實驗工程作為待移植工程文件,并在基礎工程中新建一個名為 FreeRTOS 的文件夾
創建FreeRTOS文件夾之后將步驟1獲取到的FreeRTOS文件下的FreeRTOSv9.0.0->FreeRTOS->Source中的全部文件全部拷貝到創建文件夾下
其中為了工程輕簡,protable文件夾下只留下以下三個文件夾:
用keil打開工程文件,點擊所示圖標新建兩個分組FreeRTOS_CORE 和 FreeRTOS_PORTABLE
創建成功后左邊工程欄出現對應兩個分組,雙擊添加對應的文件如下圖所示,其中FreeRTOS_CORE中的文件為源碼直接打開可看到的.c文件,FreeRTOS_PORTABLE中的文件為port.c 是 RVDS 文件 夾下的 ARM_CM3 中的文件,因為 STM32F103 是 Cortex-M3 內核的,因此要選擇 ARM_CM3 中的 port.c 文件,heap_4.c 是 MemMang 文件夾中的,因為heap_4 提供了一個最優的匹配算法,選擇heap_4相關API進行內存管理。
添加完FreeRTOS源碼中的.c文件,接下來添加相應頭文件的路徑。點擊如下圖標進行設置:
編譯,發現缺少FreeRTOSConfig.h,他是FreeRTOS 的配置文件,一般的操作系統都有裁剪、配置功能,而這些裁剪及配置都是通過一個文件來完成的,基本都是通過宏定 義來完成對系統的配置和裁剪的。可以到FreeRTOS的demo里面相關的,但是不同硬件和環境配置不同,本操作采用正點原子的板子,直接拷貝一份正點原子STM32的FreeRTOSConfig.h到FreeRTOS的include目錄下,再次進行編譯
編譯結果有錯誤,打開USER的system_stm32f0x_it.c,將以下報錯兩個函數屏蔽掉,編譯成功
修改sys.h文件
在 sys.h 文件里面用宏 SYSTEM_SUPPORT_OS 來定義是否使用 OS, 我們使用了 FreeRTOS,所以應該將宏 SYSTEM_SUPPORT_OS 改為 1。
更改delay.c
delay.c需要修改比較多地方
函數 SysTick_Handler():
delay_init()函數:
//初始化延遲函數 //SYSTICK的時鐘固定為AHB時鐘,基礎例程里面SYSTICK時鐘頻率為AHB/8 //這里為了兼容FreeRTOS,所以將SYSTICK的時鐘頻率改為AHB的頻率! //SYSCLK:系統時鐘頻率 void delay_init() {u32 reload;SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//選擇外部時鐘 HCLKfac_us=SystemCoreClock/1000000; //不論是否使用OS,fac_us都需要使用reload=SystemCoreClock/1000000; //每秒鐘的計數次數 單位為M reload*=1000000/configTICK_RATE_HZ; //根據configTICK_RATE_HZ設定溢出時間//reload為24位寄存器,最大值:16777216,在72M下,約合0.233s左右 fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延時的最少單位 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //開啟SYSTICK中斷SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中斷一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //開啟SYSTICK }剩下三個函數都是延時函數:
//延時nus //nus:要延時的us數. //nus:0~204522252(最大值即2^32/fac_us@fac_us=168) void delay_us(u32 nus) { u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD; //LOAD的值 ticks=nus*fac_us; //需要的節拍數 told=SysTick->VAL; //剛進入時的計數器值while(1){tnow=SysTick->VAL; if(tnow!=told){ if(tnow<told)tcnt+=told-tnow; //這里注意一下SYSTICK是一個遞減的計數器就可以了.else tcnt+=reload-tnow+told; told=tnow;if(tcnt>=ticks)break; //時間超過/等于要延遲的時間,則退出.} }; } //延時nms //nms:要延時的ms數 //nms:0~65535 void delay_ms(u32 nms) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系統已經運行{ if(nms>=fac_ms) //延時的時間大于OS的最少時間周期 { vTaskDelay(nms/fac_ms); //FreeRTOS延時}nms%=fac_ms; //OS已經無法提供這么小的延時了,采用普通方式延時 }delay_us((u32)(nms*1000)); //普通方式延時 }//延時nms,不會引起任務調度 //nms:要延時的ms數 void delay_xms(u32 nms) {u32 i;for(i=0;i<nms;i++) delay_us(1000); }注意:delay_ms函數改完之后和頭文件聲明的不對應,需要到頭文件delay.h更改下u16改成u32
最后,不要忘記將”includes.h”換成頭文件”FreeRTOS.h”,并添加其他頭文件如下圖所示
其他無關的程序如:
都可以刪掉了。
usart.c 文件有兩部分要修改,一個是添加 FreeRTOS.h 頭文件, 默認是添加的 UCOS 中的 includes.h 頭文件,修改以后如下:
另外一個就是 USART1 的中斷服務函數,在使用 UCOS 的時候進出中斷的時候需要添加 OSIntEnter()和 OSIntExit(),使用 FreeRTOS 的話就不需要了,所以將這兩行代碼刪除掉,修改 以后如下:
學完有收獲的小伙伴不妨點個贊支持一下小b呀~
總結
以上是生活随笔為你收集整理的STM32F103--移植FreeRTOS完整教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最全面的Linux命令大全出炉了
- 下一篇: 数值计算方法第一章—数值计算引论