当前位置: 首页 > news >正文

AutoSAR实战:RTA-OS Counters操作系统计数器详解

AutoSAR实战:RTA-OS Counters操作系统计数器详解

文章目录

  • AutoSAR实战:RTA-OS Counters操作系统计数器详解
    • @[toc]
  • RTA-OS Counter介绍
  • 通用
  • RTA-OS 中的计数器
  • 计数器驱动程序
    • 软件计数器
      • 示例
      • 硬件计数器
      • Os_Cbk_Now_Counter()
        • 示例
      • Os_Cbk_Set_Counter()
        • 示例
      • Os_Cbk_Cancel_Counter()
        • Example
      • Os_Cbk_State_Counter()
        • Example
      • 硬件计数器与软件计数器

RTA-OS Counter介绍

RTA-OS Counters是ETAS公司RTA-OS操作系统中一个重要的组件,它用于跟踪和管理系统中各类时间相关的事件或操作。RTA-OS是一个符合AUTOSAR标准的实时操作系统,广泛应用于汽车电子控制单元(ECU)中,支持多任务、时间管理、任务调度和资源共享等功能,而Counters是其中的一个关键功能模块,主要用于定时管理和计数功能。

在RTA-OS中,Counters用于精确管理系统的时间和任务调度。它们是通过硬件计时器来实现的,可以为不同的任务、事件或周期性操作提供精确的时间跟踪。Counters的功能包括定时器中断管理、周期性任务的触发、时间限制的监控等。系统中可以定义多个Counter,且每个Counter都可以独立工作。每个Counter通常与一个计时器或者多个计时器相关联,能够按照系统需要的时间精度来执行。

在AUTOSAR标准中,Counters被用来确保时间敏感任务的准确调度和执行。例如,AUTOSAR中的定时服务(Time Service)使用Counters来管理各种时间相关的服务,如定时中断、周期任务的启动等。在RTA-OS中,Counters与系统时钟、时间管理服务紧密配合,提供高精度的时间控制。

RTA-OS中的Counters支持不同的配置选项,可以根据系统需求配置为不同的时间粒度和精度。此外,Counters还提供了API接口,允许开发人员对Counter进行操作,如启动、停止、重置计数等。这些API使得开发者能够根据特定的需求进行灵活的配置和管理。

总的来说,RTA-OS Counters是实现精确时间控制和任务调度的关键工具,尤其适用于需要高精度时间管理的嵌入式系统中。它与RTA-OS的其他功能模块相结合,共同支持AUTOSAR标准下的实时性要求,确保系统在不同时间事件中能够按预期行为执行,极大地提升了汽车电子控制系统的可靠性和性能。

通用

计数器以节拍(tick)为单位记录操作系统中发生的“事件”数量。节拍是一个抽象单位。由你自己决定一个节拍代表什么,进而确定计数器所统计的“事件”是什么。节拍可能的定义有:

  • 时间
  • 旋转
  • 错误
  • 其他事件

你可以将一个节拍定义为:

  • 时间,例如一毫秒、一微秒、一分钟等,此时计数器会告诉你过去了多长时间。
  • 旋转,例如以度或弧度为单位,在这种情况下,计数器会告诉你某个物体旋转了多少。
  • 按钮按下次数,此时计数器会告诉你按钮被按下了多少次。
  • 错误次数,此时计数器统计的是错误发生的频率 。

RTA-OS 中的计数器

在 RTA-OS 中配置计数器时,有一些必须配置的参数:

ParameterDescription
名称计数器的句柄名称。
类型硬件或软件。(下一节将详细阐述)
最大值最大计数值。所有计数器达到此值后会归零。
最小周期设置闹钟或调度表偏移的周期值时的最短节拍数。
每基本单位的节拍数驱动单个计数器节拍的底层节拍数。RTA-OS 不使用此参数(可选)。
每节拍的秒数计数器节拍的持续时间。如果需要节拍/时间转换功能,则此参数为必填项。

计数器驱动程序

RTA-OS旨在易于与众多平台集成,因此它并不强制采用一种控制所有计数器的方法。相反,它为集成商提供了一个简单的接口,以便驱动计数器。这取决于为计数器选择的驱动程序类型。

软件计数器

这些是完全在软件中处理和驱动的计数器,通过API进行递增操作。AUTOSAR规定了IncrementCounter(Counter) API,但RTA-OS还提供了特定于配置的IncrementCounter_Counter() API,该API是针对特定计数器定制的。这使得调用速度更快,更适合在中断处理程序中使用。请注意,不会执行错误检查。

image-20251113074608256

示例

软件计数器最常见的示例之一,是为调度表或通过使用诸如GetElapsedCounterValue() 等其他应用程序编程接口来获取相对时间的模块提供某种时间概念。在这些情况下,计数器与时间相关联,这是通过在CAT2中断服务程序(ISR)中以固定间隔增加计数器的值来实现的。在ETAS启动套件中,可以看到Wdg_Counter(看门狗计数器),它由一个周期为1毫秒的GPT(通用定时器)中断每1毫秒递增一次。

ISR(Millisecond)
{
#ifdef FAST_APIOs_IncrementCounter_Wdg_Counter();
#elseIncrementCounter(Wdg_Counter);
#endif
}

硬件计数器

使用硬件计数器时,计数值保存在外部硬件外设中。然后,您的应用程序必须提供一个更复杂的驱动程序,以便在达到请求的节拍数时告知实时操作系统(RTA-OS)。RTA-OS 使用特殊回调来设置请求的节拍数、取消请求、获取当前计数值以及获取计数器的状态。
提供硬件计数器驱动程序并非易事,因为需要考虑很多因素,并且需要非常具体的项目和目标相关知识,才能针对特定用例实现预期的行为。

image-20251113074754948

RTA-OS 需要为硬件计数器实现以下四个回调函数:

Os_Cbk_Now_Counter()

该回调函数必须返回硬件计数器的当前值。在多核系统中,它可以在任何核心上被调用。

示例
FUNC(TickType, OS_CALLOUT_CODE) Os_Cbk_Now_Rte_TickCounter(void)
{return HwCounter->current(); /* current tick of counter */
}

Os_Cbk_Set_Counter()

此回调函数必须对硬件进行配置,以便当硬件值与匹配值(比较值)相等时生成适当的中断。一个匹配值会传递给该回调函数,它是一个绝对值,当计数器达到此值时,需要处理下一个计数器操作。由此产生的中断应调用AdvanceCounter API(或针对快速配置的特定版本Os_AdvanceCounter_Counter())。

务必注意处理以下情况:

  • 当时间间隔较短时,在调用此函数时,硬件计数可能已经超过了匹配值。如果是这样,必须确保在软件中设置中断挂起位。
  • 如果警报或调度表可以使用比已设置的时间间隔更短的时间间隔启动,代码必须能够减小匹配值,并检测这是否意味着硬件计数已经超过了该点。
  • 此回调函数通常不会初始化底层硬件。这通常在操作系统启动前的初始化代码中完成。
示例
FUNC(void, OS_CALLOUT_CODE) Os_Cbk_Set_Rte_TickCounter(TickType Match)
{/* Disable Comparator */HwCounter->disable();/* Is Match before current? */if((((sint32)(HwCounter->current() - Match + BUFFER_TICKS)) >= 0) &&(FALSE == HwCounter->is_pending())){HwCounter->set_pending(); /* raise */}else{/* second check - and no interrupt is pending */if(((sint32)(HwCounter->current() - Match + BUFFER_TICKS)) >= 0){HwCounter->set_pending(); /* raise */}else{/* Set new match of comparator */HwCounter->set_match(Match);}}/* Enable Matching */HwCounter->enable();
}

结果中断示例:

ISR(Millisecond)
{
#ifdef FAST_APIOs_AdvanceCounter_Rte_TickCounter();
#elseAdvanceCounter(Rte_TickCounter);
#endif
}

Os_Cbk_Cancel_Counter()

当没有运行的警报或调度表时,操作系统会在Os_AdvanceCounter内部调用此回调函数。该函数应用于阻止硬件计数器发出匹配信号。这通常通过禁用中断源来实现。你可能还需要清除任何相关的中断挂起位。硬件计数器本身应继续计数。

Example
FUNC(void, OS_CALLOUT_CODE) Os_Cbk_Cancel_Rte_TickCounter(void)
{HwCounter->disable();       /* disable further raising of interrupts */HwCounter->clear_pending(); /* clear pending interrupt */
}

Os_Cbk_State_Counter()

当操作系统需要决定是否启动一个计数器时,会调用此函数。用户代码(通常是计数器中断)也可以调用它来确定计数器的状态。该函数必须更新状态结构,以表明计数器是否正在运行、是否有匹配中断挂起,以及(如有需要)距离下一次匹配的时间间隔是多久。

Example
FUNC(void, OS_CALLOUT_CODE) Os_Cbk_State_Rte_TickCounter(Os_CounterStatusRefType State)
{State->Running =  HwCounter->running();                       /* free running timer started? */State->Pending =  HwCounter->is_pending();                    /* interrupt pending? */State->Delay   = (HwCounter->match() - HwCounter->current()); /* time until next interrupt */
}

硬件计数器与软件计数器

使用软件计数器时,每次一个时钟周期过去,驱动程序都会告知实时操作系统(RTA-OS)。RTA-OS在内部对时钟周期进行计数,当达到匹配值时,就会执行相应操作。然后,RTA-OS会计算下一个匹配值,接着重复这个过程。这意味着可能有大量的时钟周期中断操作系统,但这些中断无需执行任何操作。

相比之下,使用硬件计数器时,RTA-OS会通过回调函数告知驱动程序何时需要执行下一个操作。外设对所需的时钟周期数进行计数,当达到正确的时钟周期数时,就会产生一个中断。然后,中断处理程序会调用Os_AdvanceCounter_CounterID() API,告知RTA-OS处理CounterID上的下一个待执行操作。RTA-OS执行该操作,之后重复这个过程。

在这两种模式下使用中断时,软件计数器每个时钟周期都会产生一次中断,而硬件计数器仅在需要执行操作时才产生一次中断。

总之,使用硬件计数器时,中断干扰可以显著降低。

往期文章:

汽车基础软件AutoSAR自学攻略(一)-低成本AutoSAR环境搭建

汽车基础软件AutoSAR自学攻略(二)-AutoSAR CP分层架构(1)

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

系统学习AutoSAR ETAS RTA-OS嵌入式操作系统(一)

系统学习AutoSAR ETAS RTA-OS嵌入式操作系统(二)开发过程 Development Process

AutoSAR 内存管理 NVM 规范 (1)(R24-11翻译)

AutoSAR 内存管理 NVM 规范 (2)(R24-11翻译)

AutoSAR实战:如何在BSW配置看门狗Wdg Stack的监控功能 (万字长文,50张图片)

AutoSAR实战:MemStack之NVM和FEE原理介绍

AutoSAR实战:EcuM 启动时序实战

AutoSAR实战:一步步从零开始配置XCP

AutoSAR实战:Crypto Stack 信息安全加密栈集成方法

AutoSAR实战:UDS诊断服务Communication Control (0x28)配置详解

http://www.dtcms.com/a/605026.html

相关文章:

  • FCAF3D: Fully Convolutional Anchor-Free 3D Object Detection论文精读
  • 北京市轨道交通建设管理有限公司网站企业网站建设合同书模板
  • 做图表的网站大连关键词
  • Vue 3中集成GIS(地理信息系统)
  • 进程基本概念
  • Java模拟算法题目练习
  • Mac远程控制新篇章:UU远程被控端深度测评
  • WordPress插件--菜单登录后可见的插件
  • 电商数据分析报告
  • Rust与主流编程语言客观对比:特性、场景与实践差异
  • C语言编译器有哪些 | 选择最适合的编译器提高开发效率
  • 网站频道规划网站个人备案模版
  • 昆明公司建设网站制作上海seo外包
  • MySQL: 存储引擎选择策略:基于事务支持、备份需求、崩溃恢复及特性兼容性的综合指南
  • 学生成绩管理系统 基于java+springboot+vue实现前后端分离项目并附带万字文档(源码+数据库+万字详设文档+软件包+安装教程)
  • ios-WebP
  • 网站如何做网站解析品牌策划方案怎么做
  • 能源企业合同管理数智化转型解决方案
  • 国标新规下的零碳园区新基建:碳电表与智慧能源平台的协同赋能
  • 从MCU到Agent:嵌入式系统如何进化成AI能源体
  • Hadess入门到精通 - 如何管理Docker制品
  • 网站建设对于电子商务的意义可以做代发货源的网站
  • ⸢ 拾伍 ⸥⤳ 安全数智化概念及建设思路
  • UCOS-III笔记(六)
  • 企业小型网站要多少钱百度怎么做网站广告
  • macos HbuildX 使用cli脚本创建uniapp 运行时报错“cli项目运行依赖本地的Nodejs环境,请先安装并配置到系统环境变量后重试。”
  • Android MediaCodec 硬编解码实战:从Camera预览到H264流与回环渲染
  • 大数据时代时序数据库选型指南:从技术架构到实战案例
  • STM32MP1 没有硬件编解码,如何用 CPU 实现 H.264 编码支持 WebRTC?
  • 完整事务性能瓶颈分析案例:支付系统事务雪崩优化