广告

Autosar Os入门介绍

2023-06-28 汽车电子与软件 阅读:
虽然说OS 是整个框架的灵魂,但是也有极少数的BSW 模块不与OS 直接交互。换句话说,其他BSW 模块在改动的时候,是需要考虑一下OS 对其的影响,和它对OS 的影响。

Autosar Os overview WHtednc

Autosar Os 在Autosar 框架中上至RTE 下至驱动,中间可以和BSW 基础模块进行交互。是整个autosar 框架下最重要的组成部分。WHtednc

其中Syser Services 为一些系统服务,不属于操作系统。下文仅对 Os 进行描述WHtednc

OS 与 BSW 各模块关系WHtednc

虽然说OS 是整个框架的灵魂,但是也有极少数的BSW 模块不与OS 直接交互。换句话说,其他BSW 模块在改动的时候,是需要考虑一下OS 对其的影响,和它对OS 的影响。WHtednc

这里可以看到除了cdd 都是无限制的与os交互。只有cdd 是有限制的和os 进行交互。WHtednc

OS 的类别与其功能WHtednc

AUTOSAR OS 和 OSEK OS 都是为汽车领域而开发的实时操作系统。虽然它们都致力于提供实时性能、可靠性和稳定性,但其设计理念和实现方式有所不同。AUTOSAR OS 旨在提供更高级的软件体系结构和更多的配置选项,以支持更复杂的汽车软件系统;而 OSEK OS 更加简单和轻量级,适用于较小规模的汽车电子系统。两者可以共存,也可以相互补充,以满足不同汽车应用的需求。WHtednc

TASKWHtednc

OS 的task 分为两种。WHtednc

-- 基本任务WHtednc

-- 扩展任务WHtednc

其主要的区别就是有无waiting状态。这里先表示一下基本状态,下面对其使用栈详细描述可以按需在实际架构中设计,使用。WHtednc

TASK - 抢占机制WHtednc

01WHtednc

非抢占WHtednc

这里可以看出,当任务被设定为非抢占的时候,当任务没有完成时,即使高优先级的任务到来,也无法将其抢占。WHtednc

一般情况下我们可以把初始化的任务,以及一些模式切换时候,必须进行的一些操作,这类任务设计成非抢占的任务。WHtednc

02WHtednc

抢占WHtednc

为了更好的利用OS 来压榨硬件资源,大部分的任务都会被设计成抢占式任务。一般的原则,重要的任务优先级高,需要运行时间较短的任务优先级高。WHtednc

03WHtednc

合作WHtednc

这里就很灵活,但是需要在代码过程中设计好什么时候让出CPU。但是处理得好的话,会拖慢CPU, 无法最大限度的压榨硬件,高优先级的任务被耽误。WHtednc

#include TASK(Cooperative){Function1();    Schedule();/* Allow preemption */    Function2();    Schedule();/* Allow preemption */    Function3();    Schedule();/* Allow preemption */    Function4();    TerminateTask();}

任务在配置过程中最重要的下面几个参数,需要注意。这里尤其要注意使用栈的大小。因为这个真的有可能会让软件运行奔溃。其他的参数最多是运行不正常。WHtednc

TASK - 栈的使用WHtednc

Autosar os的栈使用是单一栈策略。假设定义了32k的栈。那么所有的task都使用这一个大的栈空间。那就是说,当有任务抢占的时候,栈是叠加使用的。下面是WHtednc

抢占时候使用的栈情况WHtednc

这里可以看出来,当有高优先级的任务运行的时候,栈的使用空间是一直增大的。这时候就需要注意上面定义的32k 够不够用了。因为他们所有的task公用一个栈。WHtednc

下面是非抢占时候使用栈的情况。WHtednc

这里就相对简单多了,栈的使用就是和当前运行的task所需要的栈的情况是一样的。WHtednc

前面说到扩展任务的情况呢。WHtednc

这里操作系统会根据静态配置的任务使用的栈,进行预留。换句话说就是配置完扩展任务后,os 根据优先级比扩展任务优先级高的任务使用栈的最大总和,预留一下。把扩展任务的栈至于栈底 + 最大使用量。当扩展任务到running状态后,直接就在规定的栈地方运行。所以这里很考验前面的所有task的栈,如果是使用超了,这时候程序必然就崩了。WHtednc

中断WHtednc

Interrupt WHtednc

    Category 1 WHtednc

        •Os 无法给一类中断提供服务WHtednc

        •一类中断不与Os交互 WHtednc

        •一类中断优先级高于Os 以及所有的二类中断 WHtednc

        •可以通过Os 接口对一类中断进行enable/disable WHtednc

    Category 2 WHtednc

        •二类中断受到Os管控 WHtednc

        •硬件中断向量指向Os内部 WHtednc

     •有限制使用os 接口不允许 TerminateTask, WaitEvent, ClearEvent, Schedule, ChainTaskWHtednc

下图可以看出来一类中断时独立于os的,高于os的。根据不同的芯片是不同的,有的芯片的中断优先级是组类别,有的是独立的。也就是说中断是否可以嵌套。WHtednc

下面是当二类中断发生,这时候我们的os将会怎么处理呢。WHtednc

当硬件终端触发,并且ICU模块处理完成之后,到达了OS 。这时候OS 根据静态配置进行操作,对上下文进行切换与保存现场。    WHtednc

在配置过程中很简单,但是对于实际的操作我们需要注意优先级,一般情况我们都会使用二类中断。这样会减少os的影响。减少系统的不可控性。WHtednc

如何有效率的使用中断。WHtednc

#include ISR(InefficientHandler) {/* Long handler code. */}#include ISR(EfficientHandler) {ActivateTask(Task1);}TASK(Task1) {/* Long handler code. */TerminateTask();}#include ISR(Interrupt1) {/* Dismiss the interrupt where required *//* Rest of the handler */}

异步处理,不将中断的回调一直处理完。而是激活一个task,进行处理,当然这也是要根据实际场景进行设计。WHtednc

resource WHtednc

Resource 基础介绍 WHtednc

    •Standard resource 标准的二进制状态  WHtednc

    •Linked resource   可以嵌套的二进制状态 WHtednc

    •Internal resource 以任务为基础的二进制状态WHtednc

Standard resource 标准的二进制状态 具体使用  WHtednc

    WHtednc

#include TASK(Task1) {...GetResource(Resource1);/* Critical section. */ReleaseResource(Resource1);...TerminateTask();}

代码片段:可切换语言,无法单独设置文字格式WHtednc

可以看出这类是最简单的,一个get 一个 release. 中间的 就是会被锁住的资源。其他地方无法进行访问。需要这个release之后才可以。WHtednc

Linked resource   可以嵌套的二进制状态WHtednc

#include GetResource(Resource1);     GetResource(Resource2);         GetResource(Resource3);         ReleaseResource(Resource3);     ReleaseResource(Resource2);ReleaseResource(Resource1);}

代码片段:可切换语言,无法单独设置文字格式WHtednc

和上面很相似,不过必须是一个对应一个。一个解开一个。WHtednc

举个例子错误使用WHtednc

#include TASK(Write){ /* Highest priority .*/ WriteBuffer(); GetResource(Guard); BufferNotEmpty = True; ReleaseResource(Guard); ChainTask(Read);}TASK(Read){/* Lowest priority. */ ReadBuffer(); GetResource(Guard); if( BufferNotEmpty ) { ReleaseResource(Guard); ChainTask(Read); } else { ReleaseResource(Guard); TerminateTask(); }}

tips: 任务结束前,没有release.WHtednc

Schedule table WHtednc

区别于rtos, 这里有调度表,属于静态配置的调度器。可以说是一系列的event的组合。WHtednc

下面也给了schedule table 和 event的对比。用起来相当的方便。WHtednc

这里简单介绍两个schedule table 的apiWHtednc

•Start absolute point WHtednc

•Start relative pointWHtednc

一般情况下我们系统里只需要一条schedule table即可。所以这些api 在外部用的也很少。这里只需要直到,如果当架构设计需要多条schedule table的时候,我们可以通过一系列条件,手动的调度起来。让这上面的point 内部的task 以此运行。WHtednc

配置WHtednc

配置也相对比较简单。也基本不需要配置,因为在左外SWC 设计,完成RTE 的配置之后。这个table的属性就已经被定义好了。只是通过OS 将其生成代码。WHtednc

stack monitor 栈监控WHtednc

最上面提到task的一个配置参数,栈的使用。WHtednc

这里面就是可以激活OS 对栈使用的监控。os将会自动monitorWHtednc

下面截取一段代码,解释了一下os如何获取栈的使用情况。在使用过程中,我们用户可以利用这个api进行一些自己的monitor.WHtednc

当然实现方式千千万,我们还是要了解一下实际的原理。WHtednc

下图可以看出来。不同地方调用 GetStackUsage结果可能是不同的。WHtednc

所以一般来说,我们可以选择高优先级的任务进行执行该api. 进而获取WHtednc

time protection 时间保护WHtednc

对于时间保护我们一般采类似于下面的时间约束。WHtednc

这是什么意思呢。WHtednc

1ms的任务 如果在5ms内 没有被执行完,则认为有问题。WHtednc

3ms的任务 如果在10ms内没有被执行完,则认为有问题。WHtednc

5ms的任务 如果在15ms内没有被执行完,则认为有问题。WHtednc

下面有个例子。WHtednc

看似是C 没有执行完。确实os 报错 应该报的是C 任务没有规定时间内完成。WHtednc

但是原因缺失上面的A 和 B。所以实际情况,还是需要根据调度关系进行分析。问题不一定处在报错的任务。WHtednc

关于配置方面也很简单。WHtednc

memory protection 内存保护WHtednc

内存保护的机制通过os-application 的 trust 和 non-trust 进行隔离开。WHtednc

对读写的限制,对运行的隔离。WHtednc

当其中一个os-application 发生故障,可以独立的关闭其中一个os-application ,其他的os-application 不受影响。WHtednc

对外设的访问,对内存特殊区域的访问的约束。可以通过trust non-trust 来约束。WHtednc

这样可以一定程度上减少 让os崩溃的可能发生WHtednc

ENDWHtednc

 
责编:Ricardo
文章来源及版权属于汽车电子与软件,EDN电子技术设计仅作转载分享,对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。如有疑问,请联系Demi.xia@aspencore.com
汽车电子与软件
汽车电子与软件
  • 微信扫一扫
    一键转发
  • 最前沿的电子设计资讯
    请关注“电子技术设计微信公众号”
广告
广告
热门推荐
广告
广告
EE直播间
在线研讨会
广告
面包芯语
广告
向右滑动:上一篇 向左滑动:下一篇 我知道了