Autosar Os 一文入门

admin 2023年6月28日10:00:41评论34 views字数 4254阅读14分10秒阅读模式

Autosar Os 一文入门

Autosar Os overview 

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

Autosar Os 一文入门

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

Autosar Os 一文入门

OS 与 BSW 各模块关系

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

Autosar Os 一文入门

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

Autosar Os 一文入门

OS 的类别与其功能

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

Autosar Os 一文入门

Autosar Os 一文入门

TASK

OS 的task 分为两种。

-- 基本任务

-- 扩展任务

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

Autosar Os 一文入门
Autosar Os 一文入门

TASK - 抢占机制

01

非抢占

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

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

Autosar Os 一文入门

02

抢占

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

Autosar Os 一文入门

03

合作

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

Autosar Os 一文入门
#include <Os.h>TASK(Cooperative){Function1();    Schedule();/* Allow preemption */    Function2();    Schedule();/* Allow preemption */    Function3();    Schedule();/* Allow preemption */    Function4();    TerminateTask();}

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

Autosar Os 一文入门
Autosar Os 一文入门

TASK - 栈的使用

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

 

抢占时候使用的栈情况

Autosar Os 一文入门

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

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

Autosar Os 一文入门

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

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

Autosar Os 一文入门

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

Autosar Os 一文入门

中断

Interrupt 

    Category 1 

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

        •一类中断不与Os交互

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

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

    Category 2 

        •二类中断受到Os管控

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

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

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

Autosar Os 一文入门

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

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

Autosar Os 一文入门

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

Autosar Os 一文入门

如何有效率的使用中断。

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

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

Autosar Os 一文入门

resource 

Resource 基础介绍 

    •Standard resource 标准的二进制状态

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

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

Autosar Os 一文入门

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

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

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

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

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

#include <Os.h>GetResource(Resource1);     GetResource(Resource2);         GetResource(Resource3);         ReleaseResource(Resource3);     ReleaseResource(Resource2);ReleaseResource(Resource1);}

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

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

举个例子错误使用

#include <Os.h>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.

Autosar Os 一文入门

Schedule table 

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

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

Autosar Os 一文入门

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

•Start absolute point

Autosar Os 一文入门

•Start relative point

Autosar Os 一文入门

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

配置

Autosar Os 一文入门

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

Autosar Os 一文入门

stack monitor 栈监控

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

Autosar Os 一文入门
Autosar Os 一文入门

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

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

Autosar Os 一文入门

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

Autosar Os 一文入门

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

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

Autosar Os 一文入门

time protection 时间保护

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

Autosar Os 一文入门

这是什么意思呢。

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

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

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

下面有个例子。

Autosar Os 一文入门

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

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

关于配置方面也很简单。

Autosar Os 一文入门

Autosar Os 一文入门

memory protection 内存保护

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

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

Autosar Os 一文入门

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

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

Autosar Os 一文入门

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

原文始发于微信公众号(谈思实验室):Autosar Os 一文入门

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月28日10:00:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Autosar Os 一文入门https://cn-sec.com/archives/1841018.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息