本教程基本参照[野火]《FreeRTOS内核实现与应用开发实战指南》,本人相当推荐此教程,尤其是第一部分从0开始写内核,虽然比较晦涩,但是学完之后对FreeRTOS的运行原理还有框架的认识会有一个很大的提高。
首先获取FreeRTOS的源码
我们从官网下载9.0版本的压缩包
解压后
Plus中包含付费的应用程序,不予使用
打开FreeRTOS文件夹
license是许可协议,非商用不需要考虑。
Demo中有FreeRTOS官方对许多平台写的例程,我们到时候裁剪和设置就需要参考这里面的demo
Source中就有我们最需要的源码了
由于我们是使用官方做的移植,而不是我们从源码开始写API,所以我们使用官方写好的对应芯片的源码,所以我们创建一个可以直接使用的RTOS文件夹
1.创建RTOS文件夹,内部如下
1.打开Source
将Source中的游离文件放入创建的src
将官方的include文件夹内容放入我们RTOS文件夹的include文件夹中
将portable中RVDS(keil与RVDS相同)放入我们创建的port文件夹(也可以选择具体内核)中,再将memmang(内存管理)放入port文件夹中,实际使用选择其中一个heap文件
然后我们将制作好的RTOS文件放入一个简单的裸机例程中
再在keil中为这个裸机例程添加两个组,如下。
将src中.c文件添加进FreeRTOS/src组中,将port中memmang还有RVDS中ARM_CM3中的.c文件添加进FreeRTOS/port组中
添加头文件路径
将FreeRTOS支持文件都导入后,对中断进行修改,因为FreeRTOS中无论是任务启动或者任务切换调度还是时间片的切换,都是在中断(SVC、PendSV,还有systick)中进行,当然FreeRTOS官方很贴心已经重写PendSV_Handler()与 SVC_Handler(),,滴答中断也在port.c中实现了xPortSysTickHandler()。所以我们要注释掉stm32f10x_it.c中的PendSV_Handler()还有 SVC_Handler(),对systick进行重写在里面加入xPortSysTickHandler()(内部实现了按任务延时列表来切换任务)
重写部分
在重写前在stm32f10x_it.c加入FreeRTOS.h与task.h头文件(顺序不能错)
修改完中断之后我们打开官方Demo文件中stm32f103的demo,将其中的conf文件添加进裸机程序中(里面的内容详解以后有时间再做,当然也可以用野火的conf文件,里面已经加了中文注释,结合野火教程中的第一章内容就能看懂),然后加上#include "stm32f10x.h"头文件
注意:FreeRTOS.h头文件一定要在我们添加的freertos相关的头文件之前
否则会报如上等错误
最后编译烧录进开发板中
成功烧录,目前还未创建任务,所以没有现象