FreeRTOS移植到STM32F103
1.創建工程
?
2.將FreeRTOS源碼,拷貝到工程目錄
?
3.刪除其它架構和編譯器的代碼
查看portable文件夾發現
MemMang為內存管理相關文件需要保留
Commom里面有個mpu相關代碼,我們不使用mpu,可以刪除
我們的開發環境是keil,打開keil文件夾,提示我們參照RVDS,因此保留RVDS,其它刪除
打開RVDS文件夾
STM32F103的內核為CORTEX-M3,刪除其它架構相關文件
?
4.將FreeRTOS文件添加進工程
?
添加好之后,編譯出現錯誤,缺少FreeRTOSConfig.h文件
?
5.添加配置文件
從FreeRTOS的demo程序中,將FreeRTOSConfig.h文件拷貝過來
重新編譯,無錯誤無警告
?
6.修改異常向量入口
我們知道SVC用于產生系統函數的調用請求,需要立即得到響應。SysTick用于產生系統節拍。PendSV用于懸起延遲處理。
在FreeRTOS的port.c中定義了這個三個異常的處理入口,分別為vPortSVCHandler、xPortSysTickHandler、xPortPendSVHandler。
在stm32f10x_it.c中也定義了這個三個異常的處理入口,分別為SVC_Handler、PendSV_Handler、SysTick_Handler。
因此,我們需要將異常處理入口指向由原來的SVC_Handler、PendSV_Handler、SysTick_Handler改變為vPortSVCHandler、xPortSysTickHandler、xPortPendSVHandler。
注釋掉原來的異常處理入口函數
在FreeRTOSConfig.h中重新定義異常處理入口函數
?
7.測試移植是否成功,創建rcc.h、rcc.c、nvic.h、nvic.c、freertos.c五個文件。
/************************************** 文件名:rcc.h* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 配置時鐘源************************************/ #ifndef __RCC_H_ #define __RCC_H_/* 功能: RCC時鐘配置參數: 無返回值:無*/ void rcc_config(void);#endif /************************************** 文件名: rcc.c* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 配置時鐘源************************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h" #include "rcc.h"/* 功能: RCC時鐘配置參數: 無返回值:無*/ void rcc_config(void) { ErrorStatus HSEStartUpStatus;/* RCC寄存器設置為默認配置 */RCC_DeInit();/* 打開外部高速時鐘 */RCC_HSEConfig(RCC_HSE_ON);/* 等待外部高速時鐘穩定 */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) { /* 設置HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 設置PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* 設置PCLK1 = HCLK / 2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* 設置FLASH代碼延時 */FLASH_SetLatency(FLASH_Latency_2);/* 使能預取址緩存 */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* 設置PLL時鐘源為HSE倍頻9 72MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* 使能PLL */RCC_PLLCmd(ENABLE);/* 等待PLL穩定 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/* 設置PLL為系統時鐘源 */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待系統時鐘源切換到PLL */while(RCC_GetSYSCLKSource() != 0x08);/* 設置系統節拍器時鐘源為FCLK */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);} } /************************************** 文件名: nvic.h* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 設置中斷控制器************************************/ #ifndef __NVIC_H_ #define __NVIC_H_/* 功能: 中斷嵌套控制器配置參數: 無返回值:無*/ void nvic_config(void);#endif /************************************** 文件名: nvic.c* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 設置中斷控制器************************************/ #include "stm32f10x.h" #include "nvic.h"/* 功能: 中斷嵌套控制器配置參數: 無返回值:無*/ void nvic_config(void) {/* 選擇中斷分組4 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); } /************************************** 文件名: main.c* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 主文件************************************/ #include "stm32f10x.h" #include "rcc.h" #include "nvic.h" #include "FreeRTOS.h" #include "task.h"/* 硬件初始化 */ static void prvSetupHardware(void); /* freertos初始化 */ void freertos_init(void);/* 主函數 */ int main(void) {/* 硬件初始化 */prvSetupHardware();/* freertos初始化 */freertos_init();/* 啟動調度器 */vTaskStartScheduler(); }/* 硬件初始化 */ static void prvSetupHardware(void) {/* 時鐘配置 */rcc_config();/* 中斷嵌套控制器配置 */nvic_config(); } /************************************** 文件名: freertos.c* 作者: stone* 版本: V0.1* 日期: 2019-2-25* 描述: 系統對象創建************************************/ #include "FreeRTOS.h" #include "task.h"/* 測試任務1 */ void test1Task(void *argument); /* 測試任務2 */ void test2Task(void *argument);/* 功能: freertos初始化參數: 無返回值:無*/ void freertos_init(void) {/* 創建測試任務1 */xTaskCreate(test1Task, "test1", 128, NULL, 3, NULL );/* 創建測試任務2 */xTaskCreate(test2Task, "test2", 128, NULL, 3, NULL ); }/* 功能: 測試任務1參數: 創建時傳入返回值:無*/ void test1Task(void *argument) {/* 主循環 */for(;;){/* 延時1秒 */vTaskDelay(1000);} }/* 功能: 測試任務2參數: 創建時傳入返回值:無*/ void test2Task(void *argument) {/* 主循環 */for(;;){/* 延時1秒 */vTaskDelay(1000);} }使用j-link調試,在任務1和任務2中分別打上斷點,系統調度正常
移植成功。
總結
以上是生活随笔為你收集整理的FreeRTOS移植到STM32F103的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CANOpen数据存档文件
- 下一篇: Simulink之绝缘栅双极型晶体管(I