极海APM32F107V6 移植FreeRTOS+CMSIS-RTOS V2
一、FreeRTOS:嵌入式开发的利器
在当今嵌入式系统日益复杂的背景下,实时操作系统(RTOS)已成为许多项目的必备选择。FreeRTOS作为当前全球应用最广泛的嵌入式实时操作系统之一,其价值和必要性体现在多个方面:
1 、多任务管理的必要性
传统的裸机编程采用前后台系统(超级循环)方式,当系统功能复杂度增加时,会出现如下问题:
任务响应不及时:高优先级任务无法立即得到处理
程序结构混乱:各种功能耦合在一起,维护困难
资源利用率低:CPU时间被浪费在空等待上
FreeRTOS通过抢占式调度机制完美解决了这些问题,允许开发者将应用拆分为多个独立任务,每个任务具有明确的优先级,系统会自动根据优先级分配CPU时间,确保关键任务及时响应。
2、 FreeRTOS的独特优势
完全免费:商业使用无需支付版权费用,降低了项目成本
资源占用小:内核仅占用4-9KB ROM和相当少的RAM,适合资源受限的MCU
可移植性强:支持40多种处理器架构,包括极海APM32F107采用的Cortex-M3内核
生态丰富:拥有庞大的用户社区和丰富的第三方组件支持
可靠性高:经过多年市场验证,在各种严苛环境下稳定运行
二、CMSIS-RTOS V2接口
CMSIS-RTOS是ARM制定的嵌入式操作系统通用接口标准,其第二版(V2)相比直接使用FreeRTOS原生API具有显著优势:
-
硬件无关性:使用CMSIS-RTOS V2 API编写的代码可以在不同RTOS之间移植,降低了厂商锁定风险
-
代码标准化:统一的操作接口使项目代码更加规范,便于团队协作和维护
-
功能扩展:提供了比FreeRTOS原生API更丰富的高级特性,如线程标志、事件记录等
AI帮我做的对比图:
三、极海SDK例程
然后有一个安装包
因为我不想在他这个sdk的文件夹操作,所以还是用回我之前改的工程吧
具体可以看:
极海APM32F107V6 gpio模拟串口-CSDN博客
四、FreeRTOS
1、路径添加
我这里一开始是用的sdk给的那个版本,后来我发现stm32cubemx生成的是v10的,我就替换成v10的了
2、添加相关文件
然后创建FreeRTOS文件夹,将这几个.c加进去
include文件加入FreeRTOSConfig.h,在例程那里有得复制
3、遇到注意项
编译版本要选version5的,我这电脑新装的v5.4.2的mdk,只有version6的,会报很多个portFORCE_INLINE的错误。
然后再编译,有几个重复定义的在apm32f10x_int.c和freertos文件中的port.c,把apm32f10x_int.c注释掉,保留port.c的就好
再编译就没有错误了。
五、使用CMSIS-RTOS V2
1、移植
之前用st的时候都是用的CMSIS-RTOS V2库,但是我搜了半天都找不到怎么获取CMSIS_RTOS_V2,所以我尝试了一下用stm32cubemx生成了一个stm32F107带freertos的工程,然后将工程目录下Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2直接复制到极海的工程里。
这里version要用 v1.8.5,不然cmsis_os2.c中引用的头文件会报错
rte勾选CMSIS CORE
添加路径
2、注意项
然后编译报错的话,FreeRTOSConfig.h中,对比一下stm32cubemx生成的工程里FreeRTOSConfig.h有什么要添加的,添加过去就好。
注意要加下边这个
六、程序编写
然后在main.c文件就可以用CMSIS-RTOS V2的方式来创建freertos的任务句柄
这里我加了一个测试任务
在main函数开启任务
任务函数:
七、验证
这里就是跑2个任务简单验证一下。
看着是可以的
注意注意!
我就是单纯的将stm32cubemx的CMSIS-RTOS V2复制过来,而且验证也就是跑了2个简单的任务,模仿有风险!
完全应用的话,我觉得需要对FreeRTOS和CMSIS-RTOS V2都很熟悉的人才行,但很遗憾我并不是。。还在努力中
后边我也继续沿用这个工程,看有什么问题。