本篇文章将主要以介绍性为主,只是方便大家了解,来介绍Autosar操作系统。希望阅读本篇文章达到的目的是大家可以了解Autosar操作系统中包含的一些基本内容。
我会主要从以下几个方面,让大家快速了解AutosarOS:
1.为什么需要嵌入式操作系统
2.AutosarOs的基本内容
2.1AutosarOs中所有对象的关系
2.2Core
2.3Application
2.4Counter
2.5调度表
2.6Alarm
2.7Task
2.8Interrupt
2.9Event
2.10Resource
2.11Spinlock
2.12IOC
1.为什么需要嵌入式操作系统早前,在比较简单的嵌入式软件中,一般是不需要操作系统的,相信很多嵌入式开发的小伙伴都了解,在Main函数中,写一个超循环(While),然后加一个定时器,分时间片的方式,定时去执行代码,就完成了简单的调度功能。然而当嵌入式软件变得越来越复杂时,这种简单粗暴的调度方式就无法满足要求了,举个例子,假如有个这样的需求,软件中需要调度的有1ms,2.5ms,3ms,7ms,9ms,11ms,73ms等等不同周期要求的任务时,这个时候,用超循环去执行,你会发现分时间片的方式几乎无法实现(太难了),再举个例子,如果有多个core,多个core之间还有通信的要求,这个时候就需要一个专门的软件来管理了,因此就需要这么一个叫操作系统的软件,来管理这些调度。
上面核心是想引出,所谓操作系统,就是管理系统调度的一个软件组件,以满足复杂一点的调度。下面我会尽可能地通俗简单的,针对OS中每个对象元素进行说明。
2.AutosarOs的基本内容2.1AutosarOs中所有对象的关系(不画图了,上传有点麻烦,建议大家在草纸上自己画一个,方便理解)
说明1:Task、Interrupt、Alarm、调度表/scheduleTable、Resource、Event我们称他们叫对象(Object)
说明2:【OS包含1~N个Core】--【1个Core包含1~N个Application】--【1个Application包含0~N个Object】
举个小例子,方便大家记住:
OS是一【片】水塘,Core是其中一【个】水塘,Application是水塘里面一个【水箱】,Object就是水箱里面各种鱼。
其实,就这么简单,他们之间主要的包含关系就这样啦,但是水塘-水箱-以及鱼之间的关系咱在下面掰扯掰扯啦。
2.2CoreCore就是我们所说的水塘了,我们都听过我们的手机是什么8core-16core(贼牛逼了),Core其实并不神秘,他就是指向我们的代码,然后一行一行地执行,(这里说说芯片内核)它里面的东西一般有个指令获取单元、指令执行单元以及地址寄存器和数据寄存器,代码在Core上执行过程就是把代码抓过来--翻译一下--计算一下(逻辑运算)--存一下,然后下一条。我们简单总结一下,所谓的Core,其实就是一个可以独立执行代码的单元。
2.3ApplicationApplication就是我们所说的水箱,其实从字面意思理解,它是一个应用,准确点说,它是一个进程。它部署到某一个Core上,它主要的作用就是管理放到其中的对象(也就是管理水箱里面的鱼),为啥要有这玩意呢?鱼直接放到水塘不就可以吗?举个不恰当的例子,假如一条鱼(一个对象)生病了,完啦完啦,还是传染病,那么整个水塘的鱼都遭殃了,如果有个水箱圈起来,那么顶多也就那个水箱的鱼遭殃。再举个例子,假如你手机里面淘宝不能用了,整个手机都变砖头,你会作何感想?所以,Application其实就是一个独立管理一部分OS对象的单元,它可以独立启动,关闭,或重启。那么AutosarOs中,对它还有一个重要的作用,就是功能安全上的应用,这个如果想进一步了解可以留言咨询。
2.4Counter好吧,水塘水箱的例子,在后面不太适用了,这里我把Counter比作心脏吧,或者对于芯片来说,它就是晶振了,因此它在操作系统的作用就是计时或者计数,一般Counter与芯片的Timer结合起来,Counter的精度决定了操作系统能计时的准确度。
2.5调度表或ScheduleTable字面意思理解,你可以认为它就是包含了很多调度点的一个表,AutosarOs中一般这么用调度表,比如有1ms2ms3ms三个周期需要调度的任务,那么它会根据公约数,生成一个表,这个表在1ms处调度1ms任务,2ms处调度1ms和2ms任务,3ms处调度1ms和3ms任务,4ms处调度1ms和2ms任务,5ms处调度1ms任务,6ms处调度1ms,2ms,3ms任务,然后按照这样的关系循环,这就是所谓的调度表,目前有部分主流的Autosar开发商使用这种方式进行任务的调度。
插句话:此外,这种ScheduleTable有自己的状态机,这里不做详细介绍,个人认为,相对Alarm的调度方式,ScheduleTable调度方式最大的好处在于调度上可以同步。
2.6Alarm字面意思理解,警报器,其实它就像我们上课的铃声,到点它就响应。其实操作系统用它来也是做一些定时的事情,比如定时激活一个Task。前面我们讲到ScheduleTable也可以激活Task,那么Alarm和它还是有些区别的,Alarm一般只做一个定时任务,如果有1ms,2ms,3ms的调度任务的话,一般会对应三个Alarm,一个Alarm做1ms定时,定时到了就去激活1ms的任务,然后进行1ms任务的调度,2ms,3ms的任务以此类推进行调度。
2.7Task其实Task应该是大家都比较熟悉的,AutosarOs中它有些自己的性质,下面说说它都有哪些性质。
Task类型:
BasicTask:包含状态ReadyRunningSusp
ExtTask:包含状态ReadyRunningSusp+Waiting
所谓的扩展task,就是多了一个Waiting状态,因此它一般就是等待一个Event的到来。
符合类:
BCC1:基本Task,不可被重复激活(激活1次,在Ready和Running下不可再激活)
BCC2:基本Task,可被重复激活
ECC1:扩展Task,不可被重复激活
ECC2:扩展Task,可被重复激活
此外Task的调度分为可抢占以及不可抢占,对于可抢占的Task,OS会根据Task的优先级进行排序调度,优先级高的可以抢占优先级低的。
Task就是OS中的一个调度单元,OS的很多内容都是围绕它进行管理的。比如上文提到的AlarmScheduleTable都是用作定时去激活Task,此外下文还是提到Event,其也和Task关联起来用。
2.8Interrupt中断的概念,对于嵌入式开发的小伙伴来说,应该都比较熟悉,下面我仅仅说明一下在OS中中断的特殊概念。
AutosarOS中将中断分为Cat1和Cat2,即所谓的1类中断和2类中断,所谓的2类中断其实就是完全被OS接管的中断,这类中断的上下文切换,堆栈管理全部由OS管理;而1类中断则不被OS接管,因此它的上下文由自己管理。另外AutosarOs中要求Cat1的中断的最低优先级高于Cat2的最高优先级,也就是说Cat1的中断优先级更高。所以Cat1的中断一般用于时间要求更紧急的场合。
2.9EventTask
{
A_Function();
B_Function();
C_Function();/*关闭窗口*/
}
还有三章小节,但对AutosarOs已经有个基本了解了,就说到这里吧,想进一步深入了解的,可以看看OsekOsVDX这类文档,或者也可以进行交流