【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解

news2025/2/26 7:36:30

目录

前言

正文

7.报警Alarms

7.1配置Alarms

7.1.1激活一个任务

7.1.2 设置一个事件

7.1.3报警回调Alarm Callback

7.1.4 增加计数器值

7.2设置Alarms

7.2.1 绝对Alarms

7.2.2 相对Alarm

7.3自启动Alarms

7.4 删除Alarms

7.5确认何时会发生Alarm

7.6非周期Alarms

7.7 小结


前言

本系列文章将以RTA-OS为例详细介绍AUTOSAR OS标准及概念,并分享实际使用的一些案例,本文为符合AUTOSAR标准的RTA-OS--Alarm介绍。

OS相关文章

4.1 【OS基础】符合AUTOSAR标准的RTA-OS-功能简介

4.2 【OS基础】符合AUTOSAR标准的RTA-OS-Task详解

4.3 【OS基础】符合AUTOSAR标准的RTA-OS-Interrupts详解

4.4 【OS基础】符合AUTOSAR标准的RTA-OS-Resources详解

4.5 【OS基础】符合AUTOSAR标准的RTA-OS-Event详解

4.6 【OS基础】符合AUTOSAR标准的RTA-OS-Counters详解

2.1 【OS】AUTOSAR架构下的OS错误处理

2.2 【OS】AUTOSAR架构下QM Application如何访问ASIL Application

2.3 【OS】AUTOSAR架构下多核启动

2.4 【OS】AUTOSAR架构下多核Shutdown

2.5 【OS】AUTOSAR架构下多核通信

2.6 【OS】RH850U2A芯片平台Spinlock的底层实现

2.7 【OS】AUTOSAR架构下MCAL Modules软件分区问题分析

2.8 【OS】AUTOSAR架构下的中断和异常向量表

2.9 【OS】AUTOSAR Os是如何启动第一个Task的

2.10 【OS】AUTOSAR OS系统调用产生Trap的过程详解

2.11 【OS】AUTOSAR OS如何实现Task抢占

2.12 【OS】AUTOSAR OS调度器实现原理


注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

7.报警Alarms

可以使用ISR构建以不同速率激活任务的系统。然而,对于复杂的系统,这可能会变得低效和不切实际。警报器(Alarms)提供了一种更方便、更便携的调度系统方式。

该报警机构由以下两部分组成:

1.一个计数器counter.

2.一个或多个报警器连接到计数器上。

报警(Alarm)指定在达到特定计数器值时要执行的操作。系统中的每个计数器都可以附加任意数量的报警(Alarm)。

当计数器的值等于附加到计数器的警报的值时,就说警报已经过期。在到期时,RTA-OS将执行与告警相关联的操作。该操作可以是激活任务(OsAlarmActiveTask)、执行警报回调例程(OsAlarmCallback)、设置事件(OsAlarmSetEvent)或增加计数器值(OsAlarmIncrementCounter)。

报警到期值可以相对于实际计数器值或定义为绝对值。如果报警失效定义为相对于实际计数器,则称为相对报警(Relative alarm)。如果将其定义为绝对值,则称为绝对警报(Absolute Alarm)。

警报可以配置为过期一次。一旦过期的警报被称为单次警报(Single-shot Alarm)。

还可以将警报指定为定期过期。这种类型的警报被称为循环警报(cyclic alarm)。您可以在第7.2节中找到更多关于循环警报的信息。

7.1配置Alarms

一个Alarm需要配置三个配置项:

1.名字 - 系统中的每个报警都需要分配一个唯一的名称。对于其他操作系统对象,这是将代码中在运行时引用警报的名称。

2.关联的计数器counter - 报警在配置时静态绑定到计数器。警报的任何设置都是根据相关计数器的滴答(ticks)数来完成的。

3.报警到期后的动作。

创建的每个报警最多包含4个动作:

1.激活一个任务

Figure 7.1: Activating a Task with an Alarm

2.触发一个事件(event)。

3.执行一个callback函数。

4.增加一个计数器(counter)的值。

如果需要激活多个任务、设置多个事件、进行多个回调或在到期时增加多个计数器,则需要具有相同到期值的多个警报。(调度表提供了一种替代机制,允许同时激活多个任务和/或设置多个事件。后面将在在调度表章节中阅读关于调度表的内容)。

7.1.1激活一个任务

警报最常见的动作是激活一个任务。这是构建具有定期激活任务的系统的基础——可以为每个任务创建一个警报,然后通过软件代码将警报设置为在所需的时间段内发生。图7.1显示了如何配置告警以激活任务。

7.1.2 设置一个事件

报警可以为指定的任务设置一个事件。当事件设置为警报时,它具有与使用SetEvent() API调用设置时相同的属性。这意味着用户需要同时指定事件和要为其设置事件的任务。图7.2显示了如何为告警设置事件操作。

Figure 7.2: Setting an Event for a Task with an Alarm

7.1.3报警回调Alarm Callback

每个报警都可以有一个关联的回调函数。回调只是一个C函数,在告警到期时被调用。

集成指导:根据AUTOSAR操作系统标准,报警回调只允许在可伸缩性级别1(Scalability Class 1)中进行。这是因为这些回调在操作系统级别上运行,因此可能会干扰定时保护,并在内存保护方案中出现一个漏洞。

Portability Note: RTA-OS允许放松这个限制,允许在General➔Optimizations➔RTA-OS中使用配置选项在所有可伸缩性类中允许警报回调。

图7.3显示了如何为报警配置回调函数。

Figure 7.3: Configuring a Callback Routine for an Alarm

每个回调函数都必须使用ALARMCALLBACK() 宏来编写,如示例7.1所示。

ALARMCALLBACK(UserProvidedAlarmCallback) {
/* Callback code. */
}

集成指导:回调例程在操作系统级别运行,这意味着2类中断被禁用。因此,应该是尽可能保持回调例程的精简,以最小化任务和ISR在运行时遭受的阻塞量。

用户可以在回调中进行的唯一使用的RTA-OS API调用是SuspendAllInterrupts() and ResumeAllInterrupts().

7.1.4 增加计数器值

警报增加软件计数器允许您从单个ISR级联多个计数器。由Alarm驱动(Ticked)的计数器Counter继承了警报的周期。所以,如果你有一个每5毫秒发生一次的警报,你可以使用警报来驱动一个秒级的Counter, 这个Counter的一个tick是5ms. 图7.4显示了在RTA-OS中是如何配置的。

Figure 7.4: Cascading counter increments from an alarm

示例7.2显示了如何从中断中驱动1毫秒计数器。在1毫秒计数器上注册的每五次中断将导致告警过期,并增加级联计数器5秒:

#include <Os.h>
ISR(MillisecondInterrupt){
  CLEAR_PENDING_INTERRUPT();
  Os_IncrementCounter(Counter1ms);
/* Every 5th call internally performs Os_IncrementCounter(Counter5ms) */
}

Example 7.2: Cascading Counters

级联计数器的滴答率(tick rate)必须是驱动报警的计数器的整数倍。用户可以使用多级级别的级联来配置系统。但是,如果您试在级联中配置一个循环系统或尝试增加硬件计数器,RTA-OS将生成错误。

集成指导:级联计数器的定时特性是相对于级联中第一个计数器的定时特性来定义的。因此,级联中最早的计数器决定了定义所有其他计数器的基本滴答率。如果您更改了最早计数器的标记率,则应用程序的整个计时行为将相应地缩放。

7.2设置Alarms

OS提供两个API用来设置Alarms:

SetAbsAlarm(AlarmID, start, cycle);

将报警设置为在计数器值下次到达时开始时失效。如果底层计数器在调用SetAbsAlarm时已经开始,那么在本次计数器周期内不会发生警报。

SetRelAlarm(AlarmID, increment, cycle);

增量式Alarm,即设置该Alarm后计数满足就执行该Alarm.

在这两个API调用中,周期值设置为0表示警报是单次触发警报,这意味着它在被取消之前只会过期一次。循环值大于零定义循环报警。这意味着在第一次到期后,它将继续使每个周期过期。设置非零周期值可以轻松地配置具有周期变化周期的周期性警报。

参数选着

如果被激活的任务是BCC1或ECC1/2,则将不会有排队的激活。这意味着,如果开始值或增量值非常短,或者开始值非常接近当前的计数器值,那么这可能会导致不希望产生的副作用。当先前激活的实例仍在执行时,警报将尝试激活该任务。激活将会丢失,并将引发一个E_OS_LIMIT错误。必须确保有足够的时间完成任务,然后才能导致任务重新触发任务。

7.2.1 绝对Alarms

单次触发

绝对报警指定报警失效的底层计数器的绝对值。单次触发绝对警报用于监控预定义的阈值非常有用——警报可以配置为在超过阈值时过期。用户可能希望计算在运行时获取的数据采样中发生的错误数量,然后在错误数量达到危险级别时触发恢复操作。这一点如示例7.3所示。

/* Expire when counter value reaches 42. */
SetAbsAlarm(DangerLevelReached, 42, 0);

Example 7.3: Absolute single shot alarm

示例7.3如图7.5所示。

Figure 7.5: Illustration of an Absolute Single Shot Alarm

当我们需要设置一个超时,然后等待一个固定的超时时间,然后在超时发生时采取动作时,单次触发报警很有用。

循环触发

如果绝对告报警指定了一个非零周期值,则它将首先在指定的起始点终止,然后在此后的每个周期终止。这一点如示例7.4所示。

Figure 7.6: Illustration of the Absolute Cyclic Alarm

/* Expire when counter value reaches 10 and then every 20 ticks thereafter
*/
SetAbsAlarm(Alarm1, 10, 20);

Example 7.4: Absolute cyclic alarm

对于绝对告警,零刻度的绝对起始值与任何其他值相同——这意味着当计数器达到零值时告警失效。

例如,如果当前计数器值为零,则将不会看到警报过期,直到计数器值的最大值+1数量发生。另一方面,如果计数器的值已经处于最大等值,那么就会看到警报在计数器的下一个tick上过期。

设置Alarm为过去值

设置为过去式Alarm时,需要等待MAXALLOWEDVALUE+1个Tick后才能到期。

注意:一个常见的错误是设置绝对Alarm在OS 起动后Counter为0时发生,这样的Alarm不会发生,因为0已经是过去发生的。

Figure 7.7: Setting an alarm in the past

将绝对循环Alarm同步到计数器包装

将Alarm设置为在已知的同步点定期发生对于实时系统非常重要。但是,在AUTOSAR操作系统中,不可能将绝对Alarm设置为每次基线计数器环绕时定期发生。

如果需要此类功能,则必须提供每次Alarm过期时重置绝对单次Alarm的代码。例如,如果Task1连接到Alarm1,则Task1的主体将需要在激活任务时重置Alarm,如下示例所示。

TASK(Task1) {
  /* Single-shot alarm reset at top dead center = 0 = 360 degrees. */
  SetAbsAlarm(Alarm1, 0, 0);
  /* User code. */
  TerminateTask();
}

Example 7.5: Resetting an Alarm when a Task is Activated

7.2.2 相对Alarm

单次触发

相对报警指定报警失效的底层计数器的绝对值。当用户想在运行时超时某些活动时,单次触发相对报警很有用。例如,用户可能希望等待一个外部事件,然后在该事件未发生时激活该任务。

Figure 7.8: Illustration of a Relative Single Shot Alarm

示例7.6显示了如何设置绝对单枪报警。

/* Timeout 42 ticks from now */
SetRelAlarm(Timeout, 42, 0);

Example 7.6: Relative single shot alarm

当用户需要设置一个超时,等待一个固定的超时时间,然后在超时发生时采取行动时,单次触发报警我们很有用。

在AUTOSAR操作系统中,禁止在SetRelAlarm()中使用零作为增量。如果您使用零作为增量,则将返回一个E_OS_VALUE错误。

循环触发

示例7.7显示了一个相对警报,在10次响后响一次,然后每20次响一次。

/* Expire after 10 ticks, then every 20 ticks. */
SetRelAlarm(Alarm1, 10, 20);

Example 7.7: Relative cyclic alarm

在图7.9中,可以看到如何可视化此报警。

Figure 7.9: Illustration of a Relative Cyclic Alarm

7.3自启动Alarms

虽然可通过在主函数中调用SetRelAlarm() 或 SetAbsAlarm() API来起动Alarm,但最简单的调用周期Alarms方式是在STARTOS()后自启动Alarm。

自启动Alarm需声明其为绝对还是相对Alarm,counter及周期值。

Figure 7.10: Auto-starting Alarms

RTA-OS确保软件计数器在StartOS()期间初始化为零(硬件计数器将设置为您自己的应用程序初始化代码配置的值)。因此,如果对绝对Alarm使用零刻度开始时间,则必须小心,因为在Alarm启动时,零刻度已经发生。虽然Alarm将启动,但在相关计数器变为零之前,Alarm不会过期。在一个16位计数器上,每毫秒Tick增加一次,你需要等待超过65秒,然后在一个32位计数器上等待不到48天。指定Alarm在第一次(或以后)勾选时开始表示初始到期将在计数器的下一次勾选时发生。如果需要Alarm彼此同步(即Alarm之间的相对过期时间必须间隔预先设定的刻度数),则自动启动绝对Alarm非常有用。

7.4 删除Alarms

可以通过调用CancelAlarm() API来删除Alarm,例如,可能需要取消Alarm以停止正在执行的特定任务。可以使用SetAbsAlarm()或SetRelAlarm() API调用重新启动Alarm。

7.5确认何时会发生Alarm

当用户需要确认Alarm何时会发生,如对于绝对Alarm,为了避免已经达到的值被设置时可以通过调用Get Alarm() API获取。该调用返回指定Alarm到期前剩余的Tick数。如果未设置Alarm,则API调用将返回值E_OS_NOFUNC,到期的刻度数未定义。建议在使用结果之前检查调用的返回值。示例7.8显示了API调用的使用情况。

TickType TimeToExpiry;TickType SafetyMargin = 100;StatusType IsValid;IsValid = GetAlarm(Alarm1, &TimeToExpiry);if (IsValid != E_OS_NOFUNC) {    if (TimeToExpiry <= SafetyMargin) {      Log(InsideSafetyMargin);  }}

Example 7.8: Getting the time to expiry

在根据调用返回的Tick值出运行时决策时,尤其是在底层计数器具有高分辨率的情况下,应特别小心。与使用GetCounterValue() 读取计数器值一样,在获取该值和使用该值进行计算之间可能会发生抢占。这意味着可能会读取(很长)到期时间,但随后会被抢占,以便在Alarm到期前不久(甚至在Alarm到期后)恢复。

7.6非周期Alarms

周期报警只对循环行为有用。在许多系统中,例如那些需要定期执行任务来轮询数据源的系统中,这是非常理想的。但是,用户可能需要对在运行时需要更改的系统进行编程。例如,正在计算一个发动机轴转速,并使用它来编程火花或喷射定时的持续时间。

需要使用单次触发警报对具有警报的非周期行为进行编程,并由激活的任务设置为下一个到期值。

在示例7.9中,一个任务每毫秒运行一次,并轮询一个记录曲轴旋转度的计数器。该任务将计算曲柄的位置和速度。速度用于确定火花定时的持续时间。火花启动,警报设置为在SparkTiming ticks到期后。

TASK(MillisecondTask) {
  ...
  GetElapsedCounterValue(ShaftEncoder,&Position,&DegreesRotation);
  RevsPerMinute = (DegreesRotation/360) * 1000 * 60;
  SparkTiming = Lookup(RevsPerMinute);
  if (Position == 90) {
    StartSpark();
    SetRelAlarm(TimeCounter, SparkTiming, 0); /* Activates SparkOff on
    expiry */ }
}
...
TerminateTask()
}
​
TASK(SparkOff){
  StopSpark();
  TerminateTask();
}
Example 7.9: Aperiodic Alarm Example

7.7 

  • Alarms是基于counter设置的,同一个Counter可设置多个Alarms;

  • 每个Alarm执行的操作可能为:执行某个Task、设置个Event、执行某回调函数或增加一个计数器;

  • Alarm可设置绝对或相对counter值;

  • Alarm可配置为自启动模式。

  • 实际应用中一般采用调度表来调度,Alarms应用相对比较少。

参考文档:

[1] RTA-OS V6.1.3 User Guide

[2] Specification of Operating System AUTOSAR Release 4.2.2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Appium:Appium-Python-Client与Selenium版本不兼容导致的问题

一、问题描述 在执行python代码过程中&#xff0c;出现了以下错误&#xff1a; 错误一&#xff1a;No module named appium.webdriver.common.touch_action Traceback (most recent call last):File "d:\xxx\index.py", line 3, in <module> ModuleNotFound…

山西青年杂志山西青年杂志社山西青年编辑部2024年第10期目录

本刊专稿 共融共创、校企共建BIM创新创业中心的探索与实践 黄强;马福贵;贾晓敏;苏艳贞;魏艳卿; 1-3 财务管理课程专创融合教学改革与实践 宋衍程; 4-7 数字化赋能国际贸易实务课程建设研究 吴珍彩; 8-11《山西青年》投稿&#xff1a;cn7kantougao163.com 青年教育研…

VSCode 安装NeoVim扩展(详细)

目录 1、安装NeoVim扩展 2、windows安装Neovim软件 3、优化操作相关的配置&#xff1a; 5、Neovim最好的兼容性配置 6、技巧和特点 6.1 故障排除 6.2、Neovim 插件组合键设置 6.3、跳转列表 1、安装NeoVim扩展 在扩展商店搜索NeoVim&#xff0c;安装扩展 2、windows安装…

CSS 实现电影信息卡片

CSS 实现电影信息卡片 效果展示 CSS 知识点 CSS 综合知识运用 页面整体布局 <div class"card"><div class"poster"><img src"./poster.jpg" /></div><div class"details"><img src"./avtar…

React-Redux学习笔记(自用)

1. 环境搭建 插件安装&#xff1a;Redux Toolkit和react-redux npm i reduxjs/toolkit react-redux2、 store目录结构设计 集中状态管理的部分会单独创建一个store目录&#xff08;在src下&#xff09;应用通常会有很多个子模块&#xff0c;所以还会有个modules目录&#x…

net start mysql服务名无效

问题背景 起因是我的电脑因为停电烧坏了系统固态硬盘&#xff0c;再新装系统后&#xff0c;之前的MySQL服务无法通过下面的命令启动。 net start mysql # 报错&#xff1a;服务名无效 报错&#xff1a;服务名无效 报错信息 未找到&#xff1a;在Windows服务中找不到MySQL 找…

【无线传感网】分簇路由算法介绍

目录 1、LEACH路由算法 2、PEGASIS 算法 3、TEEN 算法 5、APTEEN 5、LEACH-C 算法 无线传感网中的路由协议就是寻找一条路径让网络中节点沿着这条路径将数据信息传输出去。路由协议的两大关键要点就是路径的优化和数据的分组,在传统计算机网络中,是将网络的拓扑…

帝国cms批量取消文章审核-把已审核的文章改成未审核的方法

帝国cms很多人采集的时候,把文章弄成了审核过的文章,或者因为其他的原因,文章都是审核通过,为了seo又不能把全部文章放出来,所以需要把文章弄成未审核以下就是解决本问题的办法 首先来修改后台列表文件,自行找文件路径 第二步,增加函数 在ecmsinfo.php的150行后面增加…

中年帕金森:守护健康,从容面对生活挑战

在快节奏的现代生活中&#xff0c;中年人群面临着越来越多的健康挑战。其中&#xff0c;帕金森病作为一种常见的神经系统疾病&#xff0c;逐渐引起了人们的关注。帕金森病不仅影响患者的身体健康&#xff0c;还对其日常生活造成极大的困扰。那么&#xff0c;我们该如何应对中年…

协同编辑:只是在线协作这么简单吗?揭秘协同编辑的深层价值

经常很多朋友咨询&#xff0c;无忧企业文档是否支持协同编辑&#xff0c;首先肯定是支持的。但是&#xff0c;我发现很多人对于“协同编辑”的理解可能比较表面&#xff0c;仅仅停留在多人同时编辑一份文档的层面。实际上&#xff0c;协同编辑的功能远不止于此&#xff0c;它更…

【Java】BigDecimal类型——BigDecimal 为什么可以保证精度不丢失

目录 简介类介绍案例分析总结BigDecimal类型的使用场景MySQL中存储BigDecimal类型数据补充&#xff1a;BigDecimal类型使用时的注意事项BigDecimal类型的其他使用 简介 BigDecimal是Java中的一个类&#xff0c;用于处理大数运算。它提供了精确的数值计算&#xff0c;可以处理任…

51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向

目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭&#xff0c;我们就需…

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者&#xff1a;Hongbo 01 &#x1f4a1;TL;DR 在加密投资领域如何找到真正的“价值”&#xff1a;Crypto 作为一种新兴资产&#xff0c;应该找到一种区别于传统公司股票资产的估值方法&#xff0c;本文重点阐述了加密货币作为新的资产类型与传统资…

北京健康检测小程序开发,爱自己,从体检开始

随着经济与科技的不断发展&#xff0c;人们也越来越重视自身的身体健康。面对市面上众多的体检机构与五花八门的体检产品&#xff0c;人们往往没有充足的时间进行筛选&#xff0c;好不容易选好了医院、但进行单项体检的价格较高&#xff0c;选择套餐&#xff0c;又包含了一些不…

Codeforces Round 953 (Div.2)

传送门 A. Alice and Books 时间限制&#xff1a;1秒 空间限制&#xff1a;256MB 输入&#xff1a;标准输入 输出&#xff1a;标准输出 题目描述 Alice 有 n 本书。第 1 本书有 页&#xff0c;第 2 本书有 页&#xff0c;依此类推&#xff0c;第n本…

c库函数:strrchr使用demo案例

1. strrchr库函数说明 头文件 <string.h> 函数形式 char *strrchr( const char *str, int ch ); 功能 在str所指向的空终止字节串中寻找字符ch的最后出现。 参数 str - 指向要分析的空终止字节字符串的指针 ch - 要搜索的字符 返回值 指向 str 中找到的字符的…

【Docker安装】Ubuntu系统下部署Docker环境

【Docker安装】Ubuntu系统下部署Docker环境 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、部署Docker环境4.1 安装Docker4.2 检查Docker版本4.3 配置Docker镜像加速4.4 启动Doc…

关于车规级功率器件热可靠性测试的分享

随着中国电动汽车市场的稳步快速发展和各大车企布局新能源的扩散&#xff0c;推动了车规级功率器件的快速增长。新能源汽车行业和消费电子都会用到半导体芯片&#xff0c;但车规级芯片对外部环境要求很高&#xff0c;涉及到的一致性和可靠性均要大于工业级产品要求&#xff0c;…

优化改进YOLOv5算法之Shift-ConvNets,具有大核效应的小卷积核,效果提升明显

目录 1 Shift-ConvNets模块原理 1.1 Decomposition and Combination of Convolution 1.2 Sparse Dependencies of Large Convolution Kernels 1.3 Intermodule Feature Manipulation 2 YOLOv5中加入Shift-ConvNets模块 2.1 common.py文件配置 2.2 yolo.py配置 2.3 创建…

龙讯旷腾PWmat计算vdW异质结中热载流子冷却 | 复刻《Phys. Chem. Chem. Phys 》文献

01 NAMD 背景介绍 在各类光物理与光化学过程当中&#xff0c;均会牵涉到激发态载流子动力学过程&#xff0c;诸如电荷弛豫、复合以及输运等等。光激发或者电子注入将初始的平衡状态打破&#xff0c;所产生的热载流子在其演化进程中&#xff0c;会与原子核产生强烈耦合。此时&a…