接触freeRTOS没多长时间,决定重0开始 移植 freeRTOS到 老项目中。其实本来项目也没多复杂, 希望项目源码简介些, 有条理些, 正好不太忙,于是参考原子例程移植。
首先去freeRTOS官网 下载 源码下载工具 FreeRTOSv10.2.1.exe。下载后运行, 选择好目录就可以等待下载完成了。下载好的目录内容比较简洁,FreeRTOS-Plus目录中有FAT,TCP,UDP等中间件支持,暂时用不到,so 直接进入FreeRTOS目录, 把Source目录复制到 自己的工程文件夹下。 然后在keil工程下 新建 rtosCore 和 rtosPort 两个组, Core中添加 list.c queue.c task.c 最少3个文件,Port下添加 内存管理heap_4.c 处理器接口port.c 两个文件, 其中heap_4.c 在MemMang 目录下,port.c在portable\RVDS目录下, 到这里还差一个配置文件FreeRTOSConfig.h, 这个文件在下载的FreeRTOS\Demo\CORTEX_STM32F103_Keil 路径下, 这里其实就是已经移植好的, 配置好的文件。 然后配置下工程 头文件包含目录。 最后重要的一步是 3个中断函数(SysTick_Handler, SVC_Handler , PendSV_Handler),这里要把它们和 freeRTOS的 连接起来, 方法有很多种, 我直接把 启动文件 startup_stm32f10x_hd.s 修改了,如图, 只是因为用到了原子的delay函数, 所以 SysTick_Handler没修改, 函数定义在delay.c 中。
中间有个小插曲, 我使用了原子的delay.c 文件, 但是上图部分,SysTick_Handler 也替换成 xPortSysTickHandler了, 结果老是进 hardFault, 调试了下,发现还没创建任务呢就 进 hardFault了, 猜测可能是 提前进调度中断函数了, 因为SysTick 被原子哥初始化在 delay.c中了, 并且直接开启了, 而我也是创建任务前就调用delay初始化了, 造成直接进切换任务去了,结果只能是 hardFault了,原子哥的SysTick_Handler 函数是判断 freeRTOS运行才允许调用 的。好啦, 就改成这样吧。
最后简单总结一下过程,注意事项:
// 移植过程
// 1 下载复制 freeRTOS源代码,内存管理heap_4.c , 处理器接口port.c ,FreeRTOSConfig.h, \
工程添加文件, 配置头文件目录
// 2 根据需要配置 FreeRTOSConfig.h 文件, 这一步可以放到后面需要某功能的时候做
// 3 编写 ( 创建任务, 调用vTaskStartScheduler()函数, systic启用在这个函数中)
// 4 需要中断向量重定向 (systick, pendsvc,PendSV_Handler。。。),这里使用 修改启动文件 startup_stm32f10x_hd.s 中的函数的方法
// note 初始化时 不要忘记初始化 中断优先级分组, 如果使用原子哥的 延时函数, 注意不要越过 delay.c 中定义的 SysTick_Handler 而直接使用 xPortSysTickHandler函数 。