关注+
星标公众
号
,不错过精彩内容
作者 | strongerHuang
微信公众号 | strongerHuang
FreeRTOS中“FreeRTOSConfig.h”配置的内容随着版本(功能)的增加而增加,也就是说随着系统功能的增加,对应需要的配置信息也相应增加了。
但是系统为了兼容之前的代码,系统自身做了兼容处理。比如:configUSE_QUEUE_SETS是属于“FreeRTOSConfig.h”中定义的选项,如果用户没有定义,则在“FreeRTOS.h”中有类似如下定义。
#ifndef configUSE_QUEUE_SETS
#define configUSE_QUEUE_SETS 0
#endif
开始设计FreeRTOS系统时,工程师们肯定会想到,要尽量减少开发者的开发难度。我们初学移植FreeRTOS时,“FreeRTOSConfig.h”中的大部分配置都选择默认即可。只有后期熟悉了,开发需要使用较多功能的时候,里面各项的配置就必须要熟透。
对英文不反感的朋友建议参考官网的内容,毕竟官网的资料才是最权威的。
官网地址:
http://www.freertos.org/a00110.html
基础配置
是需要我们定义的一些配置,也是比较重要的配置。
FreeRTOSConfig.h配置文件牵涉到许多关于系统方面的名词,可能许多初学者不容易理解。比如:信号量、消息队列、互斥锁、事件组······等。
不过不用担心,先有个大概了解,我后期会再次有针对性的重点讲述。
由于我们要求实时响应,就配置为1,使用抢占式调度方式。否则就发挥不到
实时操作系统
的作用。
CPU时钟
,就是我们常说的主频。注意:单位是Hz。
#define configCPU_CLOCK_HZ (168000000)
系统滴答
,即系统每秒钟滴答的次数,可以说是系统的心跳,但需要和主频区分开来。系统滴答的值要根据CPU主频来看,一般主频越高,取值相对越大,一般在100至1000之间。
#define configTICK_RATE_HZ (
1000
)
vTaskDelay(
1000
),表示延时1S。
我们创建任务是,配置的优先级值不能超过这个最大值。
xTaskCreate(vAppTask1, "Task1", TASK1_STACK_SIZE, NULL,
TASK1_PRIORITY
, NULL);
a.系统优先级和中断优先级原理类似,高优先级的会抢在低优先级的前面,但需要区分系统和中断优先级的应用场景。
b.FreeRTOS中优先级
数值越大,优先级越高
。而UCOS则相反。
5.configMINIMAL_STACK_SIZE
在系统中,一般用于空闲、定时等一些系统任务中,当然,我们有些地方也可以使用这个定义的堆栈值。
我们需要根据需要使用的情况定义这个值。
不能定义太小,太小内存容易溢出;
也不能定义太大,有些芯片RAM本身就不大(有些就只有几K),如果太大我们就没法定义太多全局变量,或分配其他堆栈空间。
7.configMAX_TASK_NAME_LEN
xTaskCreate(vAppTask1, "
Task1
", TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);
配置为0:则使用32位的滴答计数值,一般在32位处理器中都是配置为0;
配置为1:则使用16位的滴答计数值,一般8位或者16位处理器中配置为1。
9.configIDLE_SHOULD_YIELD
也就是说在执行与空闲任务相同优先级的任务过程中,空闲任务是否具有抢占的机会。
提示
:
互斥锁也叫互斥信号量
,也就是说对资源“加锁”。
它的作用是实现多任务间
共享资源
的独占式处理
。简单的说,就是某个资源在某一时刻只允许一个任务处理,处理完之后才允许其他任务处理该资源。
比如
:A任务优先级高,B任务优先级低;AB任务都会使用一个串口发送指令数据,(即每次必须发送完成,不能发送到一半就被打断)。
当B任务正在发送数据时,A任务处于就绪状态(要打断B任务)。那么B任务就需要使用互斥锁占有该串口(加锁,占有该资源),等发送完指令,就释放该串口(开锁,释放该资源)。一旦释放了该资源,A任务就可以使用该串口(资源)了。
11.configUSE_RECURSIVE_MUTEXES
13.configQUEUE_REGISTRY_SIZE(*)
这个配置信息不好翻译,它主要结合vQueueAddToRegistry与vQueueUnregisterQueue这两个函数使用。
void vQueueAddToRegistry(QueueHandle_t xQueue, const char *pcQueueName);
void vQueueUnregisterQueue(QueueHandle_t xQueue);
从函数接口可以知道,一个函数是登记(已经创建的)队列的名称;一个函数是注销队列的名称;
其实,主要目的就是给(已经创建的)队列取名,方便调试查找。
提示
:很多初学者理解为“可创建队列的最大数”,这个配置参数与其完全不一样的概念。
14.configUSE_QUEUE_SETS(*)
提示:网上很多解释为:使能/禁止消息队列。这个理解太笼统,与消息队列配置相关的信息比较多,我个人觉得不正确。
15.configUSE_TIME_SLICING
这个参数结合上面第1各配置参数configUSE_PREEMPTION一起使用。
这个配置参数是在后面新版本增加的,好像在V7版本之前是没有这个配置参数。所以,在FreeRTOSConfig.h配置文件中默认是没有的,而是定义在FreeRTOS.h中。
#ifndef configUSE_TIME_SLICING
#define configUSE_TIME_SLICING 1
#endif
------------
END
------------
关注公众号
回复“
加群
”按规则加入技术交流群,回复“
1024
”查看更多内容。
点击“
阅读原文
”查看更多分享。