1 文档范围(Scope of Document)
本文档定义了软件自由运行定时器(Software Free Running Timer,SWFRT)功能的需求。OS SWS 规范应当满足这些需求。
约束:特定微控制器的硬件可能无法支持自由运行定时器功能——那么此功能应当被省略。这在以下情况尤其适用:
- 硬件定时器不可用(或用于具有不兼容需求的不同功能);
- 硬件定时器可用但不独立。依赖关系不匹配;
- 硬件定时器不满足范围/分辨率/间隔需求;
- 预分频器不可用或不足;
- 硬件定时器可用,但使用会导致过高的中断负载。即通过软件仿真自由运行定时器并无多大用处,会导致 CPU 计算负载过大。
此模块的可配置性及其与其他模块的依赖关系是最关键的部分,因为许多情况下用于自由运行定时器的定时器应在模块之间共享。实现 SW-FRT 的模块应当导入任何其他工具关于定时器/时钟的设置,而不是定义设置。
2 约定(Conventions to be Used)
AUTOSAR 文档中的需求表示遵循 [5] 中指定的表格。在需求中,使用以下特定语义(基于 IETF RFC 2119):
- SHALL(应当):定义是规范的绝对要求。
- SHALL NOT(不得):定义是规范的绝对禁止。
- MUST(必须):定义是规范的绝对要求(基于法律/标准原因)。
- MUST NOT(禁止):定义是规范的绝对禁止(基于法律约束)。
- SHOULD / RECOMMENDED(建议/推荐):在特定情形下可能存在合理的理由忽略该项,但在选择不同做法之前必须充分理解其全部含义并谨慎权衡。
- SHOULD NOT / NOT RECOMMENDED(不建议):在特定情形下该行为可能是可接受的甚至是有用的,但在实现前应充分理解其含义并谨慎权衡。
- MAY / OPTIONAL(可以/可选):该项是真正可选的。
3 缩略语与缩写(Acronyms and Abbreviations)
| 缩略语 | 说明 |
|---|---|
API | Application Programming Interface(应用程序编程接口) |
BSW | Basic Software(基础软件) |
COM | Communications(通信) |
ECU | Electronic Control Unit(电子控制单元) |
GPT | General Purpose Timer(通用定时器,SWS 模块) |
HW | Hardware(硬件) |
Tick | 硬件定时器的一个增量 = HW 定时器 Tick;如果未明确说明,则指硬件定时器。TickType 由许多 HW-Timer Tick 组成;明确指向时将指出。 |
Interval of Timer | 两个测量点之间的时间距离 |
OS | AUTOSAR Operating System(AUTOSAR 操作系统) |
Range of Timer | 定时器可能覆盖的最大间隔 |
Reset Timer | 超过预定义边距时以预定义值启动的定时器。 |
Resolution of Timer | 可测量的最小时间间隔 |
SI | International System of Units(国际单位制,法语缩写 SI) |
SLA | Software Layered Architecture(软件分层架构) |
SWC | Software Component(软件组件) |
SWFRT | Software extending features of HW Free running timers(软件扩展硬件自由运行定时器功能) |
Test Value | 当前读出值所比较的值。 |
Wrap Around | 定时器达到定义的最大值时采取的动作。 |
每个需求都有以 SWFRT 前缀开头的唯一标识符。
4 功能概述(Functional Overview)
本章描述了自由运行定时器(Free Running Timer)模块的功能需求。第 4.1 节通过概述介绍 SWFRT,第 4.2 和 4.3 节包含需求。该功能将被底层软件和应用层访问。因此在 SLA 中的位置需要是服务层(SLA ID:02-06)。
范围内的功能:
A) SWFRT 模块提供的代码访问一个或多个硬件定时器。此硬件定时器在运行期间不得被任何其他 SW 模块修改(自由运行硬件定时器或复位定时器,SRS_Gpt_12404:配置为连续模式)。该定时器也可以为不同目的执行功能。SWFRT 代码将可能变化的硬件功能始终映射到相同的 SW 功能:
- SWFRT 从零开始,只要尚未经过时间;
- SWFRT 递增至最大值;该最大值可能与字节/字等的最大值不同;
- 超过最大值的增量重新从零开始 SWFRT(可以作为特殊情况环绕)。
功能 A)抽象 GPT 读出函数(SRS_Gpt_12117)或直接硬件访问(定时器单元可由 OS 直接管理,见第 5 章 SWS OS)。
B) SWFRT 还应扩展硬件的可能有限范围。特别是当硬件定时器的位数受到限制时,范围需要扩展。为此扩展,SWFRT 增加一个循环计数器。此计数器计数的间隔是硬件定时器的最大范围。
用于功能 A)和功能 B)的硬件定时器不一定是相同的定时器;在不同时间启动的两个不同硬件定时器以及范围也可以满足此功能。因此,功能 A)的硬件定时器和功能 B)的定时器之间可能会出现偏移。
范围内的用例:
- UC A:SWFRT(功能 B)应支持实现具有不同分辨率、不同范围和测量间隔的软件定时器。应用可使用 SWFRT 测量时间(从几毫秒到几天)。
- UC B:—(已移除;编号 B 保留以供引用)。
- UC C:SWFRT(功能 A)应在正常程序流中支持"小"定义的时间延迟。循环可使用 SWFRT 来监控(有故障的)硬件的时间间隔,当需要快速反应时间时。"小"应理解为无法通过 OSEK 功能(即几百纳秒)实现的延迟。
- UC D:当上述延迟超过可容忍时间(例如外部硬件的响应时间非常长)时,可以在等待比"小"时间间隔稍长的时间内应用 OS 重新调度。通过检查预期事件是否在定义时间内发生来注册超时。
开销限制:
应用两种可能功能中的哪一种取决于 SWFRT 导入的配置需求(要测量的最小和最大间隔、定时器的范围和分辨率)以及合理的资源消耗。
应当避免高频通知功能。即:不要使用 SRS_Gpt_12120:GPT 通知来提供长范围。而是基于调用 SWFRT 主函数的 OS 任务构建长范围。
典型用户场景序列:
- 读取 HW-FRT 或计数器;
- 执行某些动作;
- 循环测试此动作的成功;
- 再次读出上述 FRT,并且
- 如果与该 FRT 的后续读出值的差异未超过预定义超时,则将此动作标记为成功。
SWFRT 软件功能有时使用多个递增计数器。HW 计数器递增 1 应称为"tick"。进一步,微控制器硬件(HW)可提供仅递增和/或递减的定时器。Ticks 将表示显著不同的值(ns、ms、s)。溢出或超过设定最大值(/最小值)会自动以零(/最大值)重新启动定时器。此动作称为 wrap around(环绕)。
在 SWFRT 定时器的定义范围内,任何时间计算都需要调整到环绕值。
硬件特性抽象
应当考虑以下特性:
- 微控制器的外部时钟(晶振);
- 微控制器的 PLL;
- 微控制器(分数)预分频器;
- 微控制器的寄存器宽度;
- 环绕后的复位值/边距;
- 对这些寄存器的访问(!);
- 微控制器的操作模式(Sleep/Stop/Freeze 等);
- 微控制器定时器通道之间的时钟硬件依赖性("硬件时钟树");
- 系统时钟频率调制的缺失(!)、外部非基于时间的时钟供应(例如角度驱动时钟)(!)。
这些硬件特性应当与 MCU、GPT 和 OS 模块一起作为配置参数本地定义(其参数集可能不可移植到不同的微控制器)。它们的集合导致具有定义分辨率和范围的一个定时器的转换规则(可能不可移植到不同的配置);生成的代码需要为每个新配置从头开始生成。应用这些转换规则将导致函数(宏)以定义的分辨率读取自由运行定时器以及可测量的最大/最小间隔。"用户"对由定时器、规则、分辨率和范围组成的一套感兴趣。
以上所有内容都将映射到所涉及模块的配置章节中。
5 需求追溯(Requirements Tracing)
| 需求 | 描述 | 由以下 SRS 满足 |
|---|---|---|
RS_BRF_01048 | AUTOSAR 模块设计应当支持模块在多任务环境中协作。 | SRS_Frt_00044 |
RS_BRF_01056 | AUTOSAR BSW 模块应当提供标准化接口。 | SRS_Frt_00033、SRS_Frt_00034、SRS_Frt_00047 |
RS_BRF_01096 | AUTOSAR 应当支持 ECU 的启动和关闭。 | SRS_Frt_00020、SRS_Frt_00029、SRS_Frt_00041、SRS_Frt_00048 |
RS_BRF_01104 | AUTOSAR 应当支持 ECU 和总线的睡眠与唤醒。 | SRS_Frt_00048 |
RS_BRF_01472 | AUTOSAR 应当支持模式。 | SRS_Frt_00022 |
RS_BRF_01856 | AUTOSAR 微控制器抽象应当提供对内部 MCU 配置的访问。 | SRS_Frt_00023、SRS_Frt_00024、SRS_Frt_00025、SRS_Frt_00026 |
RS_BRF_01904 | AUTOSAR 微控制器抽象应当提供对硬件定时器的访问。 | SRS_Frt_00019、SRS_Frt_00020、SRS_Frt_00021、SRS_Frt_00022、SRS_Frt_00023、SRS_Frt_00024、SRS_Frt_00025、SRS_Frt_00026、SRS_Frt_00028、SRS_Frt_00029、SRS_Frt_00030、SRS_Frt_00031、SRS_Frt_00032、SRS_Frt_00033、SRS_Frt_00034、SRS_Frt_00041、SRS_Frt_00044、SRS_Frt_00047、SRS_Frt_00048 |
6 需求规范(Requirements Specification)
本章中同类需求按以下标题分组:
- 功能需求:配置、初始化、正常运行、关闭操作、故障操作等;
- 非功能需求:时序需求、资源使用、可用性、其他工作包产出等。
6.1 功能需求(Functional Requirements)
6.1.1 配置(Configuration)
本章说明模块可配置性的需求。
[SRS_Frt_00019] 应当配置硬件定时器类型。
| 类型 | New |
|---|---|
| 描述 | 根据要测量的范围、分辨率和最大/最小间隔,这定义了 SWFRT 模块应使用哪个(或哪些)硬件定时器用于哪个功能。选择满足分辨率范围等需求的定时器类型。这可以是 OS TickType 计数器或微控制器的硬件定时器。 |
| 理由 | 限制可用的可能性以及实现的变体/开销。 |
| 用例 | 定义:晶振和 PLL 的允许范围以及生成的定时器是否提供恒定频率;定时器应向上计数还是向下计数(虽然不阻碍使用,但所需程序会有所不同);首选寄存器宽度;该定时器是否需要与寄存器宽度不同的环绕边距;环绕值;是否可以使用预分频器;可为哪些预分频器设置哪些值(范围);可以级联哪些定时器;环绕之间的时间。 例如:选择 TriCore 的 System Timer。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904 |
[SRS_Frt_00020] 如果不使用 GPT 定时器,配置和初始化应当由提供 SWFRT 功能的模块(OS)执行。
| 类型 | New |
|---|---|
| 描述 | 如果不使用 GPT 定时器,配置和初始化应当由提供 SWFRT 功能的模块(OS)执行。 |
| 理由 | 最高效地使用硬件。 |
| 用例 | 通常有 "System Timer"、"Periodic Interrupt Timer"、"GPT Timer" 等定时器,可用于 SWFRT 和其他模块。使用哪个类型由需求 6.1.1.1 选择。它们仍具有需要按微控制器详细化和选择的功能——但不是按实现。这些设置不应被彼此覆盖,也不应被遗忘。 |
| 依赖 | SRS_Frt_00021 |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01096 |
[SRS_Frt_00021] 计算 tick 持续时间所需的元素应当是导入的配置项。
| 类型 | New |
|---|---|
| 描述 | 如果没有合适的硬件定时器配置,则设置新的硬件定时器配置。这是关于 SWS 第 10 章依赖项的需求。这应当确保设置是由 OS 完成还是 OS 将重用来自不同模块(例如 GPT)的定时器。 |
| 理由 | 最高效地使用硬件。 |
| 用例 | 硬件定时器能够提供大范围以及分辨率。它可用于 OS TickType 以及 SW FRT 的定时功能。只需应用不同的掩码操作。 |
| 依赖 | SRS_Frt_00020 |
| 支持材料 | — |
| 满足 | RS_BRF_01904 |
[SRS_Frt_00022] 应当能够说明使用哪个硬件定时器。
| 类型 | Valid |
|---|---|
| 描述 | — |
| 理由 | 代码将根据使用的定时器而有显著不同。 |
| 用例 | 定义将支持哪些定时器。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01472、RS_BRF_01904 |
[SRS_Frt_00023] 应当设置一个 tick 的持续时间。
| 类型 | Valid |
|---|---|
| 描述 | 根据对定时器寄存器的访问,这会导致不同的分辨率——必须知道此分辨率。 |
| 理由 | SRS_Frt_00021 和 SRS_Frt_00020 的组合定义了用于哪个定时器及其规则的设置。这些规则按微控制器和硬件定时器(分别为 OS GlobalTimeTickType)定义。 |
| 用例 | 在 80MHz 速度下运行的 TC1766 中,寄存器 TIM0 提供 12.5ns 的一个 tick。在用例 -C-(来自介绍章节)中,循环应循环读取定时器值并测试可能有故障的硬件。最大测试间隔为 500ns,因此第一次读取与其连续读取之间的差异被预定义为 40。 这样,基本 SW 模块和应用层都通过抽象的时间提供。 |
| 依赖 | [SRS_Frt_00021]、[SRS_Frt_00020] |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01856 |
[SRS_Frt_00024] SWFRT 应当支持不同的分辨率和范围。
| 类型 | Valid |
|---|---|
| 描述 | SWFRT 应当支持不同的分辨率和范围。即以覆盖范围和分辨率的方式设置不同 tick 长度的集合。这些由表示不同时间量的 tick 支持(见第 2.1 章表中的范围定义)。范围应当假定为从 0 到最大。 |
| 理由 | — |
| 用例 | 在 40MHz 速度下运行并使用 256 预分频器的 Star12 的 PIT 寄存器集提供 6.4µs 的一个 tick。对 16 位寄存器集寄存器的访问将提供 0...420ms 范围内的 ticks。由于无法覆盖大于 420ms 的间隔,因此应当实现额外的主函数计数器用于 0…2.6E3 s(1.8 天)的范围。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01856 |
[SRS_Frt_00025] 应为不同用户提供访问时间信息的方法。
| 类型 | Valid |
|---|---|
| 描述 | 可能需要不同的定时器、定时器掩码。如果是这样,必须定义每种访问方法。 |
| 理由 | 避免在 tick 计数和基于 SI 单位的比较之间的多次转换;改为使用具有预定义测试值的统一方法。 |
| 用例 | 可以访问基本 tick,也可以访问每第 n 个 tick。其中 n 取决于微控制器(例如仅读取相应计数器的位 8...24)。如果访问跨越 16/32 位边界或超过一个时钟周期,必须特别注意一致性。 |
| 依赖 | SRS_Frt_00019、SRS_Frt_00020、SRS_Frt_00021、SRS_Frt_00022、SRS_Frt_00023;SRS_Frt_00034 |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01856 |
[SRS_Frt_00026] 设置目标计数值:时间差应当在配置时以 SI 单位离线计算。
| 类型 | Valid |
|---|---|
| 描述 | 目标计数值是与读取的定时器值进行比较的值。目标计数值应当以 SI 单位配置。等效的 tick 存储在 ECU 的内存中。 |
| 理由 | 运行时应当保持低开销:在配置时计算用于测试定时器差值的边距(而不是在运行时乘以)。 |
| 用例 | 离线计算的目标计数值可以是任何配置类。目标计数值是那些将在运行时与定时器的当前值进行比较的常量。这意味着比较指令必须遵守范围、分辨率和有效的定时器间隔。这样代码简化为比较指令。 用户模块所需的值在其 XML 中表达。SWFRT 的自动配置编辑器检查其他模块的时间,当找到时,使用定时器的范围和分辨率的知识来计算以 counter ticks 为单位的时间。然后将这些值放回用户的 XML 中,以便用户的代码生成可以访问这些值。 |
| 依赖 | SRS_Frt_00025 |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01856 |
[SRS_Frt_00028] 应当确保连续运行模式。
| 类型 | Valid |
|---|---|
| 描述 | 使用的硬件定时器可以具有不同目的的功能。此硬件应当是自由运行的硬件定时器或复位定时器,SRS_Gpt_12404:配置为连续模式。 |
| 理由 | — |
| 用例 | — |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904 |
6.1.2 初始化(Initialisation)
[SRS_Frt_00029] 应当提供一个独立于是否需要设置或修改任何寄存器的初始化函数。
| 类型 | Valid |
|---|---|
| 描述 | 如果 MCU 驱动执行初始化,则必须在 MCU 驱动初始化被调用后调用 SWFRT init 函数。如果 GPT 驱动执行初始化,则必须在 GPT 驱动被调用后调用 SWFRT init 函数。 |
| 理由 | 确保定时器和 PLL 已初始化。 |
| 用例 | — |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01096 |
6.1.3 正常运行(Normal Operation)
[SRS_Frt_00030] 读出值应当从零开始。
| 类型 | Valid |
|---|---|
| 描述 | 读出值从零开始;即使硬件从最大值向下计数到零。 |
| 理由 | 支持定义标准接口。 |
| 用例 | 例如,硬件以 0xE000 启动并向下运行到 0x100,由于需要一些比例因子,对读出值的所有调整应当在 SWFRT 内完成。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904 |
[SRS_Frt_00031] SWFRT 应当递增,即连续读出值将增加——除非超过 SWFRT 的定义范围。
| 类型 | Valid |
|---|---|
| 描述 | 这意味着:当硬件定时器向下计数时反转计数器;进一步:调整任何可能存在的偏移(当硬件定时器从某个边距向下计数到零或从某个边距向上计数到溢出时)。 |
| 理由 | 支持定义标准接口。 |
| 用例 | — |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904 |
[SRS_Frt_00032] 环绕(wrap around)应当无需软件交互即可工作。
| 类型 | Valid |
|---|---|
| 描述 | — |
| 理由 | 节省运行时。不要让时间"走动",即中断消耗时间,因此增加了定时器未跟踪的时间。 |
| 用例 | 硬件定时器应当配置为连续运行。应当不需要任何动作来重新启动定时器。环绕应当在硬件支持下加载重新启动值:例如,没有额外的自由运行定时器可用。CapCom 定时器应当共享。其配置如下:CapCom 定时器从 0xFFFF 启动,重新加载边距值为 0x3ff,重新加载值为 0xFFFF,计数器配置为向下计数器。向下计数到 0x3FF 后,在没有软件交互的情况下重新加载 0xFFFF。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904 |
[SRS_Frt_00033] 应当有一个原子读取定时器值的函数。
| 类型 | Valid |
|---|---|
| 描述 | 此函数读取定时器 ticks。不包括从定时器 ticks 到 SI 单位(秒、毫秒、微秒、纳秒)的转换。 |
| 理由 | 避免不一致的访问。 |
| 用例 | 必须一致地读取定时器值(即使跨越字节边界或多个时钟周期)。这可能涉及对 8 位/16 位/32 位/64 位寄存器的保护访问: 例如,TriCore TC1766 提供 56 位的定时器宽度。这 56 位可通过 TIM0 ... TIM6 寄存器访问。其中 TIM0 读取 ticks。TIM1 每 16 ticks 读取一次,TIM2:216,TIM3:4096,TIM4:65536,TIM5:220,TIM6:232。如果按硬件定义的顺序读取寄存器,这些寄存器将在 32 位以上提供一致性。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01056 |
[SRS_Frt_00047] SWFRT 应当提供一个"用户"相关的 API(函数/宏)以将 ticks 转换为时间。
| 类型 | Valid |
|---|---|
| 描述 | 此函数以 ticks 数作为参数,并将其参数转换为 SI 单位(秒、毫秒、微秒、纳秒)的时间。 |
| 理由 | 允许转换为基于 SI 的时间单位。 |
| 用例 | A) 外围设备在被访问之前需要启动时间。此启动时间在 HW 描述中指定。需要实现超时(以 SI 单位)以避免读取无效数据。此超时需要映射到 a) 能处理该间隔的硬件定时器 b) 给该定时器 ticks 数的值。 B) 诊断通信需要可变的帧间时间(STMIN)。它们需要设置为测量间隔,范围为 100µs 到 900µ(9 个值)和第二个测量间隔 1...127 ms(126 个值)。这 135 个值需要基于可用的定时器和循环主函数进行离线计算。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01056 |
[SRS_Frt_00034] 该模块应当提供计算先前存储值(作为参数传递)与当前定时器值之间经过的 ticks 的功能。
| 类型 | Valid |
|---|---|
| 描述 | 调用者需要提供最后读取的值。 |
| 理由 | 支持不同功能级别(代码大小和执行时间)。 |
| 用例 | 读取当前定时器值,并使用参数中的时间函数计算差异。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01056 |
6.1.4 关闭操作(Shutdown Operation)
[SRS_Frt_00041] SWFRT 不应有关闭操作。
| 类型 | Valid |
|---|---|
| 描述 | — |
| 理由 | 没有可关闭的内容;并非所有定时器都可以停止。 |
| 用例 | — |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01096 |
[SRS_Frt_00048] SW FRT 功能应当在其 Init 函数之后被保证,并且在 ECU 的 'SLEEP'、'Wakeup I'、'StartUP I'、'Go OFF II' 和 'Power Off' 状态下不可用。
| 类型 | Valid |
|---|---|
| 描述 | 在 ECU 的上述状态下,功能将返回未定义的结果,因此在这些状态下不应使用它。 |
| 理由 | PLL 可能不可用/降低等。 |
| 用例 | 当存在未知定时器设置的风险时,不要使用此功能。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01104、RS_BRF_01096 |
6.1.5 故障操作(Fault Operation)
无特定需求。
6.2 非功能需求(Non-Functional Requirements)
6.2.1 时序需求(Timing Requirements)
无特定的时序需求。
6.2.2 资源使用(Resource Usage)
[SRS_Frt_00044] SWFRT 不应为使用而阻塞定时器。
| 类型 | valid |
|---|---|
| 描述 | 允许多个模块使用相同的定时器。如果其他模块的需求在类似范围内,应当能够重用其配置。 |
| 理由 | 支持定时器共享。 |
| 用例 | 如果 PWM 以 SWFRT 需求范围内的频率工作,应当提供该定时器供使用。 |
| 依赖 | — |
| 支持材料 | — |
| 满足 | RS_BRF_01904、RS_BRF_01048 |
7 引用的 AUTOSAR 文档(Referenced AUTOSAR documents)
- [1] 分层软件架构(
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf) - [2] 术语表(
AUTOSAR_TR_Glossary.pdf) - [3] GPT 驱动规范(
AUTOSAR_SWS_GPTDriver.pdf) - [4] 操作系统规范(
AUTOSAR_SWS_OS.pdf) - [5] 软件标准化模板(
AUTOSAR_TPS_StandardizationTemplate.pdf)