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
- 硬件计数器与软件计数器
文章目录
- 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 中配置计数器时,有一些必须配置的参数:
| Parameter | Description |
|---|---|
| 名称 | 计数器的句柄名称。 |
| 类型 | 硬件或软件。(下一节将详细阐述) |
| 最大值 | 最大计数值。所有计数器达到此值后会归零。 |
| 最小周期 | 设置闹钟或调度表偏移的周期值时的最短节拍数。 |
| 每基本单位的节拍数 | 驱动单个计数器节拍的底层节拍数。RTA-OS 不使用此参数(可选)。 |
| 每节拍的秒数 | 计数器节拍的持续时间。如果需要节拍/时间转换功能,则此参数为必填项。 |
计数器驱动程序
RTA-OS旨在易于与众多平台集成,因此它并不强制采用一种控制所有计数器的方法。相反,它为集成商提供了一个简单的接口,以便驱动计数器。这取决于为计数器选择的驱动程序类型。
软件计数器
这些是完全在软件中处理和驱动的计数器,通过API进行递增操作。AUTOSAR规定了IncrementCounter(Counter) API,但RTA-OS还提供了特定于配置的IncrementCounter_Counter() API,该API是针对特定计数器定制的。这使得调用速度更快,更适合在中断处理程序中使用。请注意,不会执行错误检查。

示例
软件计数器最常见的示例之一,是为调度表或通过使用诸如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 使用特殊回调来设置请求的节拍数、取消请求、获取当前计数值以及获取计数器的状态。
提供硬件计数器驱动程序并非易事,因为需要考虑很多因素,并且需要非常具体的项目和目标相关知识,才能针对特定用例实现预期的行为。

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)配置详解
