技能的学习首先就要不求甚解,先用起来再学习原理。学习RTOS亦是如此,不能一开始就埋进源码中。这篇主要讲怎么快速在STM32系列单片机上用起来FreeRTOS,并顺带着说一下自学的方法及资料查找。
01
说在前面
RTOS为了提高任务调度效率一般都包含汇编程序,因此移植起来需要一些汇编知识,就算网上肯定有移植教程,初次搞起来还是挺费劲的。初学时对RTOS代码不熟悉,一开始就打击了积极性可不好。因此本篇不讲怎么移植,介绍使用ST“懒人神器”CubeMX来快速移植配置FreeRTOS。
02
RTOS介绍
目前嵌入式主流RTOS有uCOS、FreeRTOS,之所以很多第三方库都有在FreeRTOS上的应用Demo,是因为FreeRTOS免费。不要钱是真的厉害呀!然而说实话,论源码规范,我还是喜欢uCOS。FreeRTOS的匈牙利命名法真是让我难受呀~~~
03
配置CubeMX
设计实验:配置CubeMX移植FreeRTOS,建立两个任务,一个让LED0以500ms亮灭,一个让LED1以200ms亮灭。
比较本实验和前面《消除硬延时函数Delay》的编程方式,体会引入操作系统后软件编程架构的变化。
第一步
首先如1处勾选使用FreeRTOS的enable。然后将HAL库的1ms定时中断采用的定时器改为TIM1,因为Systick要用作FreeRTOS的时基定时。第三步配置IO口。忘记怎么配置的温故《STM32CubeMX入门教程(一)》。
第二步
配置FreeRTOS。点击FREERTOS按钮。
配置界面如下,通过配置界面可以实现操作系统的配置、任务的配置、队列、信号量及内存管理的配置。
ConfigParameters:配置操作系统功能,就像手动移植时修改Config文件一样,基本上可以按默认值。具体每个配置的功能,可以点击该条目,底部会有相关介绍。
IncludeParameters:配置操作系统API,一些API不常用可以不使能编译,减小系统大小。这个也对应与移植时的Config文件。例如删除任务函数vTaskDelete()是否使能就在此配置。具体如下图:
UserConstants:添加一些用户使用的常量,很少用。
TaskAndQueues:任务及队列的配置。首先说任务配置,点击ADD,弹出配置对话框。TaskName是任务名称,一个字符串而已。下面是优先级配置,再往下是任务堆栈大小。EntryFunction是任务函数名。CodeGenerationOption是选择自动生成代码是否声明成weak。Allocation是配置内存是否动态分配,此处CUbeMX默认动态分配不给更改。
之后再看一下队列的创建。如下图,点击ADD,弹出配置对话框。首先是队列名称。QueueSize是队列长度,即包含的队列项个数。ItemSIze是队列项类型。
TimersAndSemaphores:即软件定时器及信号量的配置,界面如下图。Timer处的ADD按钮不能点击,因为我们在配置时未使能软件定时器功能。从上到下依次是:软件定时器、互斥信号量、递归信号量、二值信号量、计数信号量。
最后看一下堆栈及内存管理。
FreeRTOS Heap Usage:界面如下,这里会根据前面配置显示出动态内存使用情况。用户可配置内存管理大小,但不能比已配置使用了的小。所谓操作系统的内存管理,就是它自己先定义一个超大的数组,把内存坑全占了。你在应用开发时要拉屎,你要用哪个坑你说的不算,你告诉操作系统,“我这边四个哥们,给我来四个坑”,操作系统会找到一个连续的四个坑,并把首地址以指针的方式告诉你,如果没坑了,就反馈申请内存失败。当然,拉完要释放内存~之所以用FreeRTOS内存管理,是因为该操作系统提供5种内存管理方案,有内存碎片回收功能,很强大。
04
编程
配置完后生成代码,打开freertos.c文件,编写任务函数代码。
osDelay()函数并不是FreeRTOS的原版API函数,而是加上了CMSIS-RTOS封装后的函数。
05
CMSIS-RTOS
我们知道,大多数RTOS的原理都差不多的,都是任务调度、延时函数、信号量、队列等等东西。Keil有自己的RTX操作系统。后来ARM收购了Keil。CMSIS-RTOS相当于将不同厂家的RTOS封装一下,形成了一个标准的API函数库。FreeRTOS的匈牙利命名法实在让我难受,我更喜欢用这个封装库。有时候想输入一个函数,知道是Task的API,就因为想不起来前面匈牙利缩写是什么,硬是敲不出来,编辑器也不提醒,因为函数开头就不知道是啥~~~~~
06
授之以鱼不如授之以渔
最后说一下自学方法。
通过本篇,你至少可以写出个非同步LED闪烁程序了吧。体验一下就好了。
然后,学习CMSIS-RTOS有哪些API,以及怎么用这些API。官网http://www.keil.com/pack/doc/cmsis/RTOS/html/index.html 。每个API函数,都有在线例程代码,看起来非常爽。当然你如果喜欢原版API,这步就算了。
最后,当用熟了之后再去学习源码。
最后的最后,有了操作系统,你就会知道项目怎么划分任务了?你就可以做到全局变量不满天飞了?你就能编写出好看的代码了?
领取专属 10元无门槛券
私享最新 技术干货