網站首頁 編程語言 正文
1.添加FreeRTOS源碼
在基礎工程中新建一個名為 FreeRTOS 的文件夾,將 FreeRTOS 的源碼(source文件夾下的內容)添加到這個文件夾中
portable文件夾中,只需留下 keil、MemMang 和 RVDS這三個文件夾,其他的都可以刪除掉。
2.向工程分組中添加文件
打開基礎工程,新建分組 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向這兩個分組中添加文件
?port.c 是 RVDS 文件夾下的 ARM_CM4F 中的文件,因為 STM32F429 是 Cortex-M4 內核并且帶有 FPU,因此要選擇 ARM_CM4F 中的 port.c 文件。heap_4.c 是 MemMang 文件夾中的,MemMang 文件夾中的五個內存管理方案后面再講。
添加完 FreeRTOS 源碼中的 C 文件以后再添加 FreeRTOS 源碼的頭文件路徑。
編譯后發現,缺少“FreeRTOSConfig.h”這個文件,這可文件可以去FreeRTOS的官方Demo中拷貝一份過來。本人已經對其做了相應的修改,并注釋好,里面的內容我將在下一章貼上并對其進行相應的注解。
然后,由于FreeRTOS已經幫我們實現了PendSV_Handler()和SVC_Handler()函數,所以我們在stm32f4xx_it.c中注釋掉這兩個函數。而SysTickHandler()這個函數我們不需要FreeRTOS幫我們實現,而是我們自行在delay.c中實現,
附上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延時倍乘數 static u16 fac_ms=0; //ms延時倍乘數 void delay_init() { u32 reload; SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); fac_us=SystemCoreClock/1000000; //系統還沒運行,以Systick計時 reload=SystemCoreClock/configTICK_RATE_HZ; //configTICK_RATE_HZ=1000 fac_ms=1000/configTICK_RATE_HZ; //系統已經運行,這就是個節拍數,用于給系統提供的延遲函數 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//開啟SYSTICK中斷 SysTick->LOAD=reload; //每1/configTICK_RATE_HZ斷一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //開啟SYSTICK } //延遲us,不會引起任務切換 //注意: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; //需要的節拍數 told=SysTick->VAL; //剛進入時的計數器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow=ticks)break; //時間超過/等于要延遲的時間,則退出. } } } //延時nms,其實就是對會vTaskDelay的簡單封裝,會引起任務調度 //nms:要延時的ms數 //nms:0~65535 void delay_ms(u32 nms) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系統已經運行 { if(nms>=fac_ms) //延時的時間大于OS的最少時間周期 { vTaskDelay(nms); //FreeRTOS延時:vTaskDelay演示固定的時鐘節拍,由于前面設定了頻率為1000HZ,所以一個節拍就是1ms } nms%=fac_ms; //OS已經無法提供這么小的延時了,采用普通方式延時 } delay_us((u32)(nms*1000)); //普通方式延時 } //延時nms,不會引起任務切換 //nms:要延時的ms數 void delay_xms(u32 nms) { u32 i; for(i=0;i LOAD為24位寄存器 //對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; //需要的節拍數 told=SysTick->VAL; //剛進入時的計數器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow =ticks)break; //時間超過/等于要延遲的時間,則退出. } } }*/
原文鏈接:https://blog.csdn.net/qq_37634122/article/details/104285918
相關推薦
- 2022-06-07 Python必備技巧之函數的使用詳解_python
- 2023-05-21 C#?Replace替換的具體使用_C#教程
- 2022-04-23 pytorch實現圖像識別(實戰)_python
- 2022-06-26 oracle中dblink查看、創建、使用以及刪除實例代碼_oracle
- 2022-10-14 分布式系統Redis解決Session共享問題
- 2022-07-13 IO流詳解之字符流與File類
- 2023-01-21 VmWare安裝Centos后配置Net網絡SSH鏈接問題及解決_VMware
- 2023-02-17 Python?樹表查找(二叉排序樹、平衡二叉樹)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支