FreeRTOS概览

  • 简介

FreeRTOS是一个以MIT许可协议开源的嵌入式实时操作系统,它的核心是多任务调度,内存占用量极低,提供了任务优先级抢占、任务间通信和同步的机制、堆内存分配与保护等基本功能。FreeRTOS可以运行在资源受限的微控制器上,支持非常多的处理器平台,是一个可配置可裁剪的嵌入式操作系统内核。FreeRTOS有很完善的文档及学习资料,而且现在由亚马逊旗下一个项目组在维护。但FreeRTOS只是一个操作系统内核,只提供了最基本的功能,诸如网络通信、图形显示、文件系统这些一个完整操作系统应该具备的功能,需要接入第三方库或者自已去实现。

  • 基本术语

多任务系统:从整体上看,能够实现多个任务并行运行的系统就叫作多任务系统。对于单核cpu来说只是操作系统以极短的时间来切换不同的任务执行,看起来像是多个任务并行运行一样。但对于多核cpu来说,可以真正做到任一时刻都可以在不同的线程运行不同的任务。

任务:任务和桌面操作系统的线程很类似,每个任务实现一个具体的功能,它是FreeRTOS最小的代码执行单元,是实现多任务轮流执行的最小粒度。

中断:中断是响应外设信号的处理程序,当一个外设产生了输入输出信号触发了中断,cpu就会执行对应的中断服务例程(ISR),ISR要尽可能的短小且不能有阻塞,以提高系统的响应速度。

任务优先级:每个任务都会被分派一个执行优先级,内核会根据这个优先级决定任务的运行次序。

优先级抢占:如果系统配置为允许任务抢占,那么当高优先级的任务准备就绪时,系统就会暂停当前低优先级的任务运行,切换为就绪的高优先级运行,以保证实时性。

优先级反转:在某些特定的条件下,会发生高优先级的任务等待低优先级任务运行结束的情况,就叫作优先级反转。比如当高优级任务访问一个被低优先级任务同步占用的资源时。

优先级继承:当高优先级任务访问一个被低优先级任务占用的使用mutex保护的资源时,内核会把该低优先级的任务临时提升优先级别,尽可能地让该任务得到更多的时间运行,从而尽快释放资源,以保证等待资源的高优先级任务在最短时间内能够执行。

调度:内核根据一定的算法协调分配各个任务的运行时间与次序,以实现多任务同时运行以及实时性的目的。每个任务都有一个TCB块和栈内存,当发生任务切换时,内核会先保存当前任务的上下文环境,然后切换回要运行的任务之前的上下文环境。

  • 通信与同步

FreeRTOS实现任务间以及任务与中断间的通信与同步的方式有很多种,各有各的优缺点以及应用场景,包括队列、信号灯、互斥量、任务通知等。

队列:队列是任务间通信的基本方式。一个任务从队列读数据,另一个从队列写数据,当读空队列或者写满队列时,对应的任务会被阻塞。可以直接把小数据写入队列,也可以把大数据的地址写入队列,队列的内存是由内核负责分配的。

信号灯:信号灯分为二进制信号灯与计数信号灯。区别是前者控制资源任一时刻只能有一个占用者,后者允许资源可以同时被特定数量的访问者占用。对于二进制信号灯,当信号灯为1时表示信号灯可被获取,为0时表示信号灯也经被其他任务获取,当前任务需要等待或放弃。对于计数信号灯来说,可以同步事件与资源两种,如果同步的是事件,当事件发生时计数加1,当事件被处理后,计数减1,信号灯的初始数量是0。如果同步的是资源,当资源被占用时计数减1,当资源释放时计数加1,信号灯的初始数量为资源最大数量。

互斥量:基本和二进制信号灯功能一样,只是多了个优先级继承的功能。对于使用互斥量同步的资源,在特定情况下会临时提升相应任务的优先级。

任务通知:每一个任务都有一个32位的通知值,一个任务可以等待接收通知,另一个任务可以发送通知以唤醒等待的任务,实现同步。可以使用任务通知实现一些轻量级的信号灯、事件组等功能。任务通知不需要占用额外的内核资源与内存,比二进制信号灯解锁任务快45%。但任务通知只能用在一对一的情况下,比如说,一个任务不能同时通知多个任务,但信号灯与互斥量就可以。当用任务通知实现信号灯时,任务的通知值就做为信号灯的计数值。

  • 调度算法

FreeRTOS的调度算法大概分为三类,可以在FreeRTOSConfig.h中配置使用什么样的调度算法。

时间分片的优先级抢占算法:高优先级任务会抢占低优先级任务执行,相同优先级任务会轮流执行特定时间片的时间。

不带时间分片的优先级抢占算法:高优先级任务会抢占低优先级任务执行,当前任务只有在进入等待或阻塞状态,或者被其他高优先级任务抢占后,其他任务才有机会执行。

协作调度算法:当前任务如果没有进入等待或阻塞状态,其他任务没有机会执行。当发生任务切换时,高优先级的任务优先被调度。

  • 内存分配

FreeRTOS支持静态分配与动态分配内存两种。

静态分配内存:内核提供了特定的api可以对一些内核对象静态分配内存,静态分配内存有下面一些好处:链接时就能确定对象的大小及内存地址和最大的内存占用量;应用程序编写者不用关心内存分配失败的情况;适用于不允行任务动态内存分配的情况。

动态分配内存:内核预置了5种动态分配内存方法,分别位于heap_1.c到heap_5.c文件中,也支持开发者编写针对自己平台的内存分配函数,但必须保留至少一种预置方法,因为内核api分配内存时要用到。

FreeRTOS对特定平台也提供了内存访问保护机制,比如特定内存只读或者可执行等。FreeRTOS也提供了一些栈溢出的检测手段,比如栈指针是否超出了有效区,栈内存特定字节是否被覆盖等,但因为增加了开销,所以栈溢出检测尽量用在开发和测试中。

  • 软定时器与HOOK函数

FreeRTOS在内核启动时会运行一个软定时器守护任务,该任务负责接收定时器的控制消息,比如创建、删除、重置定时器,同时负责在定时器超时时调用定时器回调函数。该守护任务还保证只有在定时器回调函数实际执行时才占用cpu时间,其他时候都处于阻塞状态。定时器的回调函数要写的尽量简短,不能有阻塞,以免造成其他定时器回调不能按时执行。

FreeRTOS也提供了很多的hook函数方便实现一些功能:

Idle Hook函数:当最低优先级的空闲任务运行时,就会调用这个回调,可以在这里把cpu设为深度睡眠状态以节能。

Tick Hook函数:可以实现定时功能。

Malloc Failed Hook函数:当内存分配失败时调用。

Stack Overflow Hook函数:栈溢出时调用。

Daemon Task Hook函数:软定时器守护任务调用的回调函数。

  • 编码标准与命名规范

FreeRTOS遵从MISRA的编码标准,有一套自己的命名规范,可以参考对应文档。FreeRTOS为了最大化各平台的兼容性,没有采用C99标准以后新引入的C特性。

  • 优势与劣势

优势:免费、开源、资源占用小、实时多任务、内核可移植可裁剪、资料完整学习成本低、官方提供支持、使用群体庞大开源社区活跃。

劣势:只提供最基本内核,如果想搭建完整的操作系统,需要整合第三方的库,比如网络通信、文件系统、图形系统等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值