学RTOS从配置文件开始!

嵌入式电子 2023-12-30 10:48
最近有小伙伴问:学RTOS从哪里开始?

这个问题说简单也简单,说难也难,因为每个人掌握的基础不同,自然,从哪里开始学起也各有不同。

我认为,首先你要去了解 RTOS 相关的一些基础知识,然后再下载源码实践运行,跑起来!接下来真正入门的第一步,我觉得还得从“配置”文件开始,这里的配置,可以理解为大家说的“裁剪系统”及相关的一些配置。

比如 FreeRTOS 中“FreeRTOSConfig.h”配置文件:

当然,配置文件是你已经具备一定基础知识,上手源码第一步要掌握的内容。不仅仅是 FreeRTOS,其他μCOS、RT-Thread,甚至Linux都是从配置开启第一步的。

可能会有老铁说,使用STM32CubeMX配置FreeRTOS,就不用修改(配置)FreeRTOSConfig.h文件?

这么说吧,第三方工具图形化配置,也会牵涉到配置文件,而且,仅仅是基础的配置,你要做项目,还是会修改配置文件。

通过第三方配置工具,你不会真正掌握RTOS底层原理,后期做项目你会发现很困难。

FreeRTOS配置文件常见内容

本文结合流程的FreeRTOS给大家讲讲其中配置文件的内容。


FreeRTOS配置文件看起来有点多,但它都有分类,多了解一下,你会发现理解起来也不是很难。


官网地址:
http://www.freertos.org/a00110.html

现在官网做了一定的“汉化”,相比以前更适合国人学习了。

1
通用配置


通用配置基本配置,就是需要我们定义的一些配置,也是比较重要的配置。   

1.configUSE_PREEMPTION

调度模式配置

配置为0:合作式调度,即时间片轮流执行;

配置为1:抢占式调度,即优先级高的任务抢先执行;

由于我们要求实时响应,就配置为1,使用抢占式调度方式。否则就发挥不到实时操作系统的作用。


2.configCPU_CLOCK_HZ

CPU时钟,就是我们常说的主频。注意:单位是Hz。

如:STM32F407主频为168M:

#define configCPU_CLOCK_HZ      (168000000)



3.configTICK_RATE_HZ

系统滴答,即系统每秒钟滴答的次数,可以说是系统的心跳,但需要和主频区分开来。系统滴答的值要根据CPU主频来看,一般主频越高,取值相对越大,一般在100至1000之间。


简单举例:系统滴答决定vTaskDelay。

比如:

#define configTICK_RATE_HZ    (1000)


则:

vTaskDelay(1000),表示延时1S。


4.configMAX_PRIORITIES

系统最大优先级值

我们创建任务是,配置的优先级值不能超过这个最大值。

xTaskCreate(vAppTask1, "Task1", TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);


提示:

a.系统优先级和中断优先级原理类似,高优先级的会抢在低优先级的前面,但需要区分系统和中断优先级的应用场景。

b.FreeRTOS中优先级数值越大,优先级越高。而UCOS则相反。


5.configMINIMAL_STACK_SIZE

最小堆栈值

在系统中,一般用于空闲、定时等一些系统任务中,当然,我们有些地方也可以使用这个定义的堆栈值。


注意数值的单位,一般在ARM中为4个字节。


6.configTOTAL_HEAP_SIZE

系统总共堆(栈)大小

我们需要根据需要使用的情况定义这个值。不能定义太小,太小内存容易溢出;也不能定义太大,有些芯片RAM本身就不大(有些就只有几K),如果太大我们就没法定义太多全局变量,或分配其他堆栈空间。


7.configMAX_TASK_NAME_LEN

任务名称最大长度

也就是创建任务定义任务名称的字符串长度

xTaskCreate(vAppTask1, "Task1", TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);


提示:结束符 '\0'也包含在内。


8.configUSE_16_BIT_TICKS

是否使用16位滴答计数值

配置为0:则使用32位的滴答计数值,一般在32位处理器中都是配置为0;

配置为1:则使用16位的滴答计数值,一般8位或者16位处理器中配置为1。


9.configIDLE_SHOULD_YIELD

是否让空闲任务“放弃”抢占

也就是说在执行与空闲任务相同优先级的任务过程中,空闲任务是否具有抢占的机会。


配置为0:不放弃抢占;

配置为1:放弃抢占;


10.configUSE_MUTEXES

是否使用互斥锁


配置为0:不使用

配置为1:使用


提示互斥锁也叫互斥信号量,也就是说对资源“加锁”。它的作用是实现多任务间共享资源的独占式处理。简单的说,就是某个资源在某一时刻只允许一个任务处理,处理完之后才允许其他任务处理该资源。


比如:A任务优先级高,B任务优先级低;AB任务都会使用一个串口发送指令数据,(即每次必须发送完成,不能发送到一半就被打断)。


当B任务正在发送数据时,A任务处于就绪状态(要打断B任务)。那么B任务就需要使用互斥锁占有该串口(加锁,占有该资源),等发送完指令,就释放该串口(开锁,释放该资源)。一旦释放了该资源,A任务就可以使用该串口(资源)了。


11.configUSE_RECURSIVE_MUTEXES

是否使用递归互斥锁


配置为0:不使用

配置为1:使用


13.configQUEUE_REGISTRY_SIZE(*)

可添加(或登记)队列名的数量


这个配置信息不好翻译,它主要结合vQueueAddToRegistry与vQueueUnregisterQueue这两个函数使用。


直接上函数接口:

void vQueueAddToRegistry(QueueHandle_t xQueue, const char *pcQueueName);
void vQueueUnregisterQueue(QueueHandle_t xQueue);



从函数接口可以知道,一个函数是登记(已经创建的)队列的名称;一个函数是注销队列的名称;


其实,主要目的就是给(已经创建的)队列取名,方便调试查找。


提示:很多初学者理解为“可创建队列的最大数”,这个配置参数与其完全不一样的概念。


14.configUSE_QUEUE_SETS(*)

是否使用消息队列“SET”功能


配置为0:不使用

配置为1:使用


这个配置信息也相对较难理解。

提示:网上很多解释为:使能/禁止消息队列。这个理解太笼统,与消息队列配置相关的信息比较多,我个人觉得不正确。


15.configUSE_TIME_SLICING

是否使用时间片进行调度


这个参数结合上面第1各配置参数configUSE_PREEMPTION一起使用。


这个配置参数是在后面新版本增加的,好像在V7版本之前是没有这个配置参数。所以,在FreeRTOSConfig.h配置文件中默认是没有的,而是定义在FreeRTOS.h中。

#ifndef configUSE_TIME_SLICING
#define configUSE_TIME_SLICING 1
#endif


2
HOOK配置


HOOK也叫钩子,初学者可以暂时只做了解。

1.configUSE_IDLE_HOOK
是否定义IDLE空闲任务HOOK函数

配置为0:不定义
配置为1:定义

configUSE_IDLE_HOOK是系统设计之初就有的,必须在“FreeRTOSConfig.h”中宏定义。不像有些宏定义可以不在“FreeRTOSConfig.h”中定义,因为它们在“FreeRTOS.h”有判断是否定义了,如果没有定义,会有一个默认的定义。

比如:上一篇文章说的“configUSE_MUTEXES”,可以不在“FreeRTOSConfig.h”中定义,而在“FreeRTOS.h”中可以看到如下一段代码:
#ifndef configUSE_MUTEXES#define configUSE_MUTEXES 0#endif
也就是说,如果没有定义,它会默认给你定义。

回来说configUSE_IDLE_HOOK,在task.c文件中,有如下一段代码:
#if (configUSE_IDLE_HOOK == 1){  extern void vApplicationIdleHook(void);  vApplicationIdleHook();}#endif
意思是说:如果你配置configUSE_IDLE_HOOK为1,那么你就必须要实现“vApplicationIdleHook()”这个函数,否则编译会出错。初学者默认不定义该函数。


2.configUSE_TICK_HOOK
是否定义TICK滴答HOOK函数

配置为0:不定义
配置为1:定义

在task.c文件中的xTaskIncrementTick函数下可以看见如下代码:
#if (configUSE_TICK_HOOK == 1){  if(uxPendedTicks == (UBaseType_t) 0U)  {    vApplicationTickHook();  }  else  {    mtCOVERAGE_TEST_MARKER();  }}#endif

提示:xTaskIncrementTick函数是在PendSV_Handler中断函数中被调用的。因此,vApplicationTickHook()函数执行的时间必须很短才行。

3.configCHECK_FOR_STACK_OVERFLOW
是否定义栈溢出HOOK函数

配置为0:不定义
配置为1:定义

这个配置比较关键和重要,特别对于复杂的系统设计,代码量比较大那种工程,使用该功能,可以帮你分析是否有内存越界的情况。

4.configUSE_MALLOC_FAILED_HOOK
是否定义内存分配失败HOOK函数

配置为0:不定义
配置为1:定义

我们创建任务、信号量、队列等都需要耗费系统堆栈,如果我们对系统总共分配堆栈不够多,在创建多个任务或队列时容易分配失败,这个时候就起到一个提示作用。

5.configUSE_DAEMON_TASK_STARTUP_HOOK
是否定义守护进程HOOK函数

配置为0:不定义
配置为1:定义

通过分析软件源代码可以发现,这个HOOK函数是在TIMER任务下面实现的,所以需要配置configUSE_TIMERS为1。


3
TIMERS配置


TIMER即定时器,在RTOS中的TIMER属于软件定时。FreeRTOS的定时器精度不高,会随着定时的增加而改变,特别是TIMER任务优先级较低,高优先级占用资源的情况下。

若要使用高精度的定时,还是最后使用硬件的定时器(现在处理器一般都有多个硬件TIMER)


1.configUSE_TIMERS

是否使用软件定时器


配置为0:不使用

配置为1:使用


其他许多相关的功能都需要结合该配置才能使用,使用时需要注意是否关联。


2.configTIMER_TASK_PRIORITY

软件定时器任务优先级


软件定时器其实也是需要创建一个任务,创建方式和我们常规的一样,只是它是有系统内核完成,不用我们自己写创建任务代码。

这里的这个优先级就是定时器任务的优先级。


3.configTIMER_QUEUE_LENGTH

软件定时器命令队列长度


关于TIMER的命令队列牵涉的知识相对复杂点,后期进一步讲述,可看下图:


4.configTIMER_TASK_STACK_DEPTH

分配给软件定时器的堆栈空间


4
CO_ROUTINES配置


CO_ROUTINES这个不好翻译,网上都叫协同程序,或者合作程序,理解为协同一起使用的程序,后期结合应用讲述。

1.configUSE_CO_ROUTINES
是否使用CO_ROUTINES

配置为0:不使用
配置为1:使用

2.configMAX_CO_ROUTINE_PRIORITIES
CO_ROUTINE优先级


5
MEMORY配置


内存分配相关的配置,这里的配置与heap_x.c有关,后面会再次进行讲述。


1.configSUPPORT_STATIC_ALLOCATION

是否支持静态分配


配置为0:不支持

配置为1:支持


2.configSUPPORT_DYNAMIC_ALLOCATION

是否支持动态分配


配置为0:不支持

配置为1:支持


3.configTOTAL_HEAP_SIZE

分配给系统的堆栈


创建任务,堆栈,静态、动态都分配的内存都来自这里。


4.configAPPLICATION_ALLOCATED_HEAP

APP使用哪里分配的堆


配置为0:使用系统分配的堆

配置为1:使用外部分配的堆


默认使用系统分配的堆,见下面定义:

#if(configAPPLICATION_ALLOCATED_HEAP == 1 )
extern uint8_t ucHeap[configTOTAL_HEAP_SIZE];
#else
static uint8_t ucHeap[configTOTAL_HEAP_SIZE];
#endif



6
RUN_TIME_STATS配置


运行时信息统计配置


1.configGENERATE_RUN_TIME_STATS

是否生成统计信息


配置为0:否

配置为1:是


2.configUSE_TRACE_FACILITY

是否协助执行可视化和跟踪


配置为0:否

配置为1:是


这里会添加额外的结构体来实现。


3.configUSE_STATS_FORMATTING_FUNCTIONS

是否统计相关的功能


配置为0:否

配置为1:是


设置宏configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS为1会编译vTaskList()和vTaskGetRunTimeStats()函数。如果将这两个宏任意一个设置为0,上述两个函数不会被编译。


7
其他配置


这里简单综合讲述一下各项配置


1.configASSERT

断言配置


2.Interrupt相关

  • configKERNEL_INTERRUPT_PRIORITY:内核中断优先级

  • configMAX_SYSCALL_INTERRUPT_PRIORITY:系统调用最大的优先级

  • configMAX_API_CALL_INTERRUPT_PRIORITY:API调用的最大优先级


这一节与(Cortex)内核硬件中断有关。


3.INCLUDE配置

#define INCLUDE_vTaskPrioritySet   1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1


这里给大家分享了常见的一些配置内容,要深入理解并掌握,还是需要自己多动手修改代码验证才行。


关注公众号,加星标,回复1024获取学习资料,每天进步一点点。


声明:

本号原创、转载的文章、图片等版权归原作者所有,如有侵权,请联系删除。

关注、点赞、在看、转发,支持优质内容! 

评论
  • Snyk 是一家为开发人员提供安全平台的公司,致力于协助他们构建安全的应用程序,并为安全团队提供应对数字世界挑战的工具。以下为 Snyk 如何通过 CircleCI 实现其“交付”使命的案例分析。一、Snyk 的挑战随着客户对安全工具需求的不断增长,Snyk 的开发团队面临多重挑战:加速交付的需求:Snyk 的核心目标是为开发者提供更快、更可靠的安全解决方案,但他们的现有 CI/CD 工具(TravisCI)运行缓慢,无法满足快速开发和部署的要求。扩展能力不足:随着团队规模和代码库的不断扩大,S
    艾体宝IT 2025-01-10 15:52 162浏览
  • 说到福特,就要从亨利·福特(Henry Ford)这个人物说起。在发明大王爱迪生的电气工厂担任工程师的福特下班后,总是在自家仓库里努力研究和开发汽车。1896年,福特终于成功制造出一辆三轮车,开启了福特汽车的传奇。最初几年,福特都是独自制造汽车并同时进行销售。 (今天很多人都知道的精益管理中的5S方法,或多或少地受到了福特 CANDO方法的影响。)1903年,福特从牧师、律师、银行家、会计师等十一位股东那里筹集了十万美元,并在自家庭院成立了美国第五百零三家汽车公司——福特汽车公司(Fo
    优思学院 2025-01-10 11:21 51浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 466浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 462浏览
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 97浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 319浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 455浏览
  • 电动汽车(EV)正在改变交通运输,为传统内燃机提供更清洁、更高效的替代方案。这种转变的核心是电力电子和能源管理方面的创新,而光耦合器在其中发挥着关键作用。这些不起眼的组件可实现可靠的通信、增强安全性并优化电动汽车系统的性能,使其成为正在进行的革命中不可或缺的一部分。光耦合器,也称为光隔离器,是一种使用光传输电信号的设备。通过隔离高压和低压电路,光耦合器可确保安全性、减少干扰并保持信号完整性。这些特性对于电动汽车至关重要,因为精确控制和安全性至关重要。 光耦合器在电动汽车中的作用1.电池
    腾恩科技-彭工 2025-01-10 16:14 72浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 97浏览
  • LVGL(Light and Versatile Graphics Library)是一个免费的开源图形库,旨在为各种微控制器(MCU)和微处理器(MPU)创建美观的用户界面(UI)。LVGL可以在占用很少资源的前提下,实现丝滑的动画效果和平滑滚动的高级图形,具有轻量化、跨平台可用性、易于移植、操作友好以及免费使用等诸多优势。近期,飞凌嵌入式为OK3506J-S开发板移植了最新9.2版本的LVGL,支持多种屏幕构件以及鼠标、键盘、触摸等多种输入方式, 能够带来更加友好的操作界面;同时,启动速度也
    飞凌嵌入式 2025-01-10 10:57 48浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 496浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 487浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 165浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 433浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 447浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦