FreeRTOS入门-概念介绍

张开发
2026/4/14 21:58:54 15 分钟阅读

分享文章

FreeRTOS入门-概念介绍
FreeRTOS入门-概念介绍开始前先抛出一个问题**我们为什么需要操作系统**比如你使用计算器进行加减乘除等运算人按键输入最后计算器液晶屏显示结果这只是一个单任务的操作并且人的速度很慢计算器大部分时间都在**空闲等人**。如果一个计算器连出来10个键盘让10个人同时使用这个时候就需要一个操作系统来协调这么看来操作系统首先需要一个**调度器**如上图这样多个任务就可以同时运行了其次还需要对各个任务需要的硬件资源进行管理比如**硬盘**、**内存**、**网卡**另外还需要支持**任务间的****通信**。如下图传统操作系统的五大模块1. 操作系统分类操作系统一般可分为三种基本类型即批处理系统、分时系统和实时系统。另外其他扩展的网络操作系统、分布式操作系统、嵌入式操作系统等。1.1批处理操作系统就是把任务**汇总**到一块按顺序排好然后让计算机一个一个处理这样计算机**一次处理一批任务**空闲的时间就比较少了。其实就是把调度的工作让人干了汇总任务是需要人工做的没有调度这感觉不是操作系统这现在已经不存在了在计算机发展的早期还有。1.2分时操作系统所谓分时技术就是把处理器的运行时间分成很短的**时间片**按时间片轮流把处理器分配给各联机作业使用。若某个作业在分配给它的时间片内不能完成其计算则该作业暂时停止运行把处理器让给其他作业使用等待下一轮再继续运行。由于计算机速度很快作业运行轮转得很快给每个**用户的感觉好像是自己独占一台计算机**。例如个人电脑里面的Windows、Linux手机里面的安卓等都是分时操作系统也是我们说的普通操作系统。1.3实时操作系统实时操作系统(RealTimeOperatingSystem**RTOS**)是指使计算机能**及时**响应外部事件的请求在规定的严格时间内完成对该事件的处理并控制所有实时设备和实时任务协调一致地工作的操作系统。实时操作系统从**调度器算法**到**中****断响应系统**到**消息传递机制**等所有的核心算法时间复杂度都是O1它表示系统的响应速度不依赖于系统任务的多少负载的轻重而只依赖于优先级的设计就算当前系统满负荷运行优先级高的事件发生后系统还将会在指定的时间内立即响应事件。 这里的时间限制可以分为两种情况如果某个动作必须绝对地在规定的时刻或规定的时间范围发生则称为**硬实时系统**。例如飞行器的飞行自动控制系统这类系统必须提供绝对保证让某个特定的动作在规定的时间内完成。如果能够接受偶尔违反时间规定并且不会引起任何永久性的损害则称为**软实时系统**如飞机订票系统、银行管理系统。 我们**AUTOSAR** **CP**里面的RTOS就需要硬实时的操作系统。因为对于汽车的控制是需要及时的不然可能造成事故正所谓**人命关天**。1.4其他操作系统随着计算机体系结构的发展又出现了许多种操作系统它们是嵌人式操作系统、个人操作系统、网络操作系统和分布式操作系统。网络操作系统把计算机网络中的各台计算机有机地结合起来提供一种统一、经济而有效的使用各台计算机的方法实现各个计算机之间的互相传送数据。分布式计算机系统是由多台计算机组成并满足下列条件的系统系统中任意两台计算机通过通信方式交换信息系统中的每一台计算机都具有同等的地位即没有主机也没有从机每台计算机上的资源为所有用户共享系统中的任意若千台计算机都可以构成一个子系统并且还能重构任何工作都可以分布在几台计算机上由它们并行工作、协同完成。最后汇总一个图2. OSEK OSOSEK OS是一个为满足汽车电子**可靠性、实时性、成本敏感性**等需求而打造的实时单核操作系统(RTAOS)。具备以下基本特性以及基本系统服务AUTOSAR OS是基于OSEK OS继承发展而来所以上述的OSEK OS的基本特点在AUTOSAR OS都能够得到满足所以AUTOSAR OS是向后兼容的也就意味着在OSEK OS上能够运行的应用程序同样也可以在AUTOSAR OS上运行。AUTOSAR OS继承OSEK OS在OSEK OS的基础上又特别明确了AUTOSAR OS至少需要提供的系统服务如下基于优先级的调度及时的中断处理的能力中断优先级必定高于task通过StartOS 与StartOSHook来创建启动接口通过ShutdownOS() 与ShutdownOSHook来创建关机接口能够在OSEK OS中跑的APP自然也能够在AUTOSAR OS运行但同时Autosar os也同时限制了OSEK OS的一些基本使用3. AUTOSAR OS3.1 AUTOSAR OS基本对象AUTOSAR OS总共包含以下6大基本对象**CounterAlarmSchedule TableTaskISRsResource**。这6个基本对象必须归属于一个OS **Application**可以简单理解为OS Application是上述6大基本对象的容器而归属于同一OS Application的基本对象则可以互相访问来自其他OS Application的基本对象则需要通过配置来限制性访问。3.2 Task大家在面试的时候被经常问到的一个问题就是**进程和线程的区别**最典型的回答就是**进程是系统资源分配的最小单位**比如分配了内存地址空间、寄存器、独占的虚拟CPU等**线程是CPU调度的最小单位**线程享用父进程的系统资源但是自己又可以异步的去执行。 可惜在RTOS里面由于要求实时性这种异步执行需要等待的机制需要被砍掉首先没有了线程的概念。那么**进程**就是对应RTOS里面的**Application**并且这个Application的**资源都是独占的**不进程一样跟其他进程共享的。例如独占一个真实的CPU这里也叫做MCU因为性能没那么强悍但是很稳定。有例如独占一块真实的内存区域也就是说其资源是启动前就**静态分配好的**不跟其他Application共享的这里就是**静态系统**的概念。 而传统操作系统里面的进程就是**动态系统**动态系统资源共享降低了实时性和安全性来提升资源利用率在**AUTOSAR AP**中的**微内核OS**中会用到主要支持一些对安全实时性要求不高的应用。 接下来说本章节的**TASK**可以理解为一个**for循环**顺序一遍一遍的去执行的列表中的任务。这些任务组成了一个Application。AUTOSAR OS中存在两种任务基本任务(Basic Task)和扩展任务Extended Task。基本任务则存在以下三种状态运行状态(Running)处于运行状态的任务可能被高优先级任务或者中断抢占从而进入就绪状态且同一Core中任何时刻只会存在一个任务处于运行状态任务运行结束后则将自己挂起进入阻塞状态就绪状态(Ready):处于就绪状态的任务由调度器决定是否启动进入运行状态且该状态时任务切换至运行状态的前提阻塞状态(Suspend):处于阻塞状态的任务是被动的可以由API函数或Alarm激活进入就绪状态扩展任务与之相比则多了一个等待状态(Waiting),解释如下等待状态(Waiting)当任务的运行需要等待某一或某些事件被置位时任务进入就绪状态。基本任务与扩展任务的状态机切换如下图所示基本任务的代码示例如下#include“OS.h”TASK(BasicTask){.../*User Code*/...TerminateTask();}扩展任务的代码示例如下#include“OS.h”TASK(ExtendedTask){for(;;){WaitEvent(Event1);/*Perform some actions in specific condition*/ClearEvent(Event1);}}Task调度策略AUTOSAR OS可根据各个任务的可抢占属性配置来提供不同的调度策略调度策略可分为以下三种完全抢占式OS所有任务均是可抢占类型非抢占式OS中所有任务均是不可抢占的混合抢占式OS部分任务是可抢占类型部分任务是不可抢占类型3.3 CounterCounter概念的引入是为了实现对**硬件计数器**以及**软件计数器**的管理为Alarm与Schedule table提供支持。即多个Alarm可以共用一个Counter一个Schedule Table只能由一个Counter来驱动。Counter按照AUTOSAR定义可分为以下两种Hardware Counter:该Counter的增加由硬件外设驱动如Gpt或者timer等Software Counter该Counter的增加通过调用API函数IncrementCounter来实现且每次只能增加1基本原则优先使用Hardware Counter因为可以根据Task的激活状况来减少无意义的时钟中断3.4 Alarm在计数器的基础上AUTOSAR OS为应用软件提供了**闹钟机制**多个闹钟可以连接一个Counter当到达Alarm所对应的计数器设定值时则可以**激活一个任务设定一个event**调用callback或者增加计数器等功能但只能是一对一。不能像Schedule Table那样能够在Expiry point同时设定多个Task或者多个Event这也是为什么引入Schedule Table的原因。一个软件Counter 多个Alarm队列就可以实现静态定义的任务激活机制。 但随着Schedule Table的引入因此一般建议能用Schedule Table就不要用Alarm。3.5 Schedule Table如上Alarm所述当计数器的计数值依次达到各个Alarm设定的计数值时各个Alarm被触发但很难保证各个Alarm有特定的时间间隔且每个Alarm只能激活一个Task或者Event所以需要多个Alarm来协作实现在同一时刻触发多个Task或者Event因此Schedule Table应运而生Schedule Table会定义一系列终结点(Expiry Point)且每个调度表都有一个以Tick为单位的持续时间(Duration)。每个终结点则是以Tick为单位的距离起始点的偏移量(Offset)在每个终结点可以实现多个Task或者Event的设置。与报警器类似一个调度表只能由一个Counter驱动同时调度表存在以下两种调度方式单次执行(Single-Shot): 调度表启动之后 只运行一次到达调度表终点则终止即每个终结点只运行一次循环执行(Repeating): 调度表启动后可反复执行到达调度表终点后重头开始执行则每个终结点会被周期性的执行一般情况下激活任务采用此模式。如下图10所示较为清晰了描述了调度表中Expiry Point与TaskEvent激活之间的时序关系。如下图所示则较为清晰的表现了CounterSchedule Table以及Alarm三者之间的关系。3.6 ISRs在AUTOSAR中定义了两类中断服务程序(Interrupt Service Routine)为一类中断(Category I)与二类中断(Category)。两者之间的区别定义如下Categoty I此类中断服务程序不能够使用OS提供的系统服务当中断执行完成之后则会重新跳转至产生中断的地方继续执行不会影响到任务的执行因此占用系统资源较少。Category II该类中断则可以调用OS系统服务如激活任务或者设置事件等。在AUTOSAR OS中中断的优先级始终高于任务的优先级即最低优先级的中断都可以打断最高优先级的任务即使该任务不可抢占也不例外。因此中断服务子程序的执行时间不宜过长否则会影响到整个系统的实时性。3.7 Resource ManagementResouce作为OS调度过程中一个十分重要的对象Resource管理就显得尤为重要。资源管理就是为了协调具有不同优先级的多个任务或者中断对共享内存如内存或者硬件等的并发访问。 不过幸运的是AUTOSAR OS采用上述的**优先级**天花板模式来避免任务优先级反转以及死锁问题的发生即资源的上限优先级必须高于所有该资源的任务以及中断的优先级但是应低于不访问该资源的任务的最低优先级。 其中为了保护共享资源而提出的锁机制-**自旋锁**(Spin Lock)。该自旋锁一般用于多核操作系统解决资源互斥的问题。当内核控制必须访问共享数据结构或进入临界区是如果自旋锁已经被别的执行单元保持调用者就一直循环在那里看是否该自旋所的保持者已经释放了该锁从而达到某共享资源的互斥作用。4. AS代码中的RTOSAS代码https://github.com/thatway1989/as里面是有RTOS的是作者自己写的一个叫做**askar**同时里面还有**FreeRTOS**等十个左右的RTOS下次文章再介绍。一些关于AUTOSAR的资料公众号留言autosar资料即可获取链接。后记最比较忙近停更了一段时间但是公众号的事一直在心里。9月是开学季也是学习的好时节接下来再接再厉先写一系列**OS入门**的文章直接介绍五六种OS的入门资料绝对够猛够有料敬请期待。参考资料1.https://blog.csdn.net/daaikuaichuan/article/details/829576552.https://blog.csdn.net/WZJwzj123456/article/details/1083510693.https://zhuanlan.zhihu.com/p/420352010“那路谈OS与SoC嵌入式软件”欢迎关注个人文章汇总https://thatway1989.github.io

更多文章