【STM32】将 FreeRTOS移植到STM32F103RCT6 详细流程
这篇文章是将 FreeRTOS移植到STM32F103RCT6 详细流程。
-
创建用于移植的根文件夹,如 FreeRTOS-F103。也可以命名为别的名称。
-
进入 FreeRTOS-F103 文件夹,在其内创建以下几个子文件夹:
apps
,doc
,drivers
,FreeRTOS
,libs
,project
。用于存放项目文件。
- 从
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
中复制以下四个文件到apps
文件夹:main.c
,stm32f10x_conf.h
,stm32f10x_it.c
,stm32f10x_it.h
。
-
在
doc
文件夹下创建新文件readme.txt
,用于项目说明。
-
在
drivers
文件夹下创建两个子文件夹inc
和src
。用于存放项目的驱动头文件和源文件。
-
复制
FreeRTOSv9.0.0\FreeRTOS\Source
下的全部文件和文件夹到 FreeRTOS 中。其中portable
文件夹中只保留keil
、MemMang
和RVDS
三个文件夹,其余都删除。
-
复制
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries
下的全部两个文件夹到libs
文件夹下。
-
打开
Keil
,新建新项目demo
,保存到project
文件夹下。
-
选择设备为 STM32F103RC。
-
将默认目标 Target1 更改为
demo
,并对demo
目标进行分组,并为各组添加文件。
添加 FreeRTOS-F103\FreeRTOS\portable\MemMang\heap_4.c
到 FreeRTOS_PORT
组。
- 添加全局宏:
STM32F10X_HD,USE_STDPERIPH_DRIVER
。添加头文件路径:
..\apps;..\drivers\inc;..\FreeRTOS\include;..\FreeRTOS\portable\RVDS\ARM_CM3;..\libs\CMSIS\CM3\CoreSupport;..\libs\CMSIS\CM3\DeviceSupport\ST\STM32F10x;..\libs\STM32F10x_StdPeriph_Driver\inc。
- 打开
main.c
文件,删除以下这些行:24行,27~ 37行,45~ 69行,73行,76~ 82行,100~ 159行,170~186行。这些行是项目模板中与验证板相关的代码,用不着,删除它们。
删除后的样子:
- 编译。报错:
..\FreeRTOS\include\FreeRTOS.h(98): error: #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory
这是缺少FreeRTOSConfig.h
头文件。从FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil
下复制FreeRTOSConfig.h
头文件到FreeRTOS-F103\FreeRTOS\include
下。
-
再次编译,通过。
-
另外还得更改三个中断处理函数名称。
port.c
中定义了三个中断处理函数,它们与默认的一一对应,为了在产生这三个中断时能执行port.c
中定义的中断处理函数,需要对启动文件startup_stm32f10x_hd.s
中的三个中断处理函数进行对应更改:
SVC_Handler
改为vPortSVCHandler
PendSV_Handler
改为xPortPendSVHandler
SysTick_Handler
改为xPortSysTickHandler
- 再次编译,通过。至此,移植 FreeRTOS 到 STM32F103RC 完成。
- 测试移植的 FreeRTOS 系统。测试代码通过在启动任务中创建一个LED_R 灯闪烁任务,一个蜂鸣器间断鸣叫任务,来测试系统移植后能否正常工作。首先更改
main.c
。
-
在
drivers/src
中添加led.c
、beep.c
,在drivers/inc
中添加led.h
、beep.h
,在apps
下添加test_task.c
、test_task.h
。这些文件见附件。
-
将
led.c
和beep.c
添加到drivers
组,将test_task.c
添加到apps
组。
- 编译,通过。烧录后能看到
LED_R
灯闪烁,蜂鸣器间断鸣叫,说明系统能正常运行。