CubeMX配置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亮灭。

第一步

 

首先如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,就因为想不起来前面匈牙利缩写是什么,硬是敲不出来,编辑器也不提醒,因为函数开头就不知道是啥~~~~~

你可能感兴趣的:(CubeMX)