AUTOSAR进阶图解==>AUTOSAR_SRS_TimeService

AUTOSAR时间服务(Time Service)模块详解

基于AUTOSAR标准的Time Service模块分析与图解

目录


1. 文档范围

本文档定义了BSW模块Time Service的需求规范。Time Service模块是AUTOSAR经典平台的一部分,为基于时间的功能提供服务。

首次规范要求范围是针对非安全相关系统的基本软件模块。对于在安全相关系统中实施基本软件模块,应检查是否需要额外要求。


2. 功能概述

Time Service模块是服务层的一部分,为基于时间的功能提供服务。主要用例包括:

  • 基于时间的状态机
  • 时间测量
  • 超时监控
  • 忙等待

该模块提供了多种"计时器类型"——即所谓的"Time Service Predef Timers",这些计时器在硬件支持且配置启用的情况下可用。

2.1 Time Service模块架构

在这里插入图片描述

2.1.1 架构组件解释
组件 Time Service:
  • 职责: Time Service模块是AUTOSAR服务层的核心组件,负责提供各种基于时间的功能服务
  • 功能点:
    • 提供Time Service Predef Timers(预定义计时器)
    • 支持时间基准状态机实现
    • 提供超时监控机制
    • 提供时间测量功能
    • 提供忙等待功能

Time Service Predef Timers基于GPT Driver提供的GPT Predef Timers,这些是由GPT驱动提供的免费运行的硬件计时器。每个预定义计时器都有固定的时钟周期(物理时间单位)和固定的位数(物理范围),从而确保时间基础功能在所有支持所需Time Service Predef Timers的平台上兼容。

组件 GPT Driver:
  • 职责: GPT驱动位于ECU抽象层,为Time Service提供硬件计时器接口
  • 功能点:
    • 提供GPT Predef Timers(预定义GPT计时器)
    • 提供底层计时功能

需要注意的是,Time Service模块不使用和分发GPT驱动的所有功能。此外,所有服务都由用户调用(轮询模式),不支持通知方式。Time Service模块也不是"计时器堆栈"的顶层。

2.1.2 代码示例
/* Time Service模块初始化示例 */
void TimeService_Init(void)
{
    /* 初始化Time Service模块内部状态 */
    timeServiceInitialized = TRUE;
    
    /* 初始化预定义计时器 */
    GPT_StartPredefTimer(GPT_PREDEF_TIMER_1US);
    GPT_StartPredefTimer(GPT_PREDEF_TIMER_100US);
    
    /* 其他初始化工作 */
}

/* 使用Time Service进行忙等待示例 */
Std_ReturnType TimeService_BusyWait(uint32 microseconds)
{
    if (!timeServiceInitialized) {
        return E_NOT_OK;
    }
    
    /* 使用预定义计时器执行忙等待 */
    return TimeService_WaitWithCheckPredefTimer(TIME_SERVICE_TIMER_1US, microseconds);
}

2.2 Time Service类结构

在这里插入图片描述

2.2.1 类结构解释
类 TimeService:
  • 功能: Time Service模块的主要类,提供各种时间服务API
  • 关键API:
    • GetCounterValue: 获取指定计数器的当前值
    • GetElapsedValue: 获取自上次读取以来经过的时间值
    • GetTimeStamp: 获取当前时间戳
    • GetTimeStampValue: 获取时间戳值
    • WaitWithCheckPredefTimer: 使用预定义计时器执行带检查的等待
    • CompareTimeStamp: 比较两个时间戳
    • GetVersionInfo: 获取版本信息
类 TimeService_PredefTimer:
  • 功能: Time Service预定义计时器的配置结构
  • 关键属性:
    • BitSize: 预定义计时器的位大小,决定计时器的最大计数范围
    • TickDuration: 预定义计时器的时钟周期,表示每个时钟周期的物理时间单位
    • IsEnabled: 指示预定义计时器是否启用
类 GPT_PredefTimer:
  • 功能: GPT预定义计时器,作为Time Service预定义计时器的基础
  • 关键属性:
    • BitSize: GPT预定义计时器的位大小
    • TickDuration: GPT预定义计时器的时钟周期
    • IsEnabled: 指示GPT预定义计时器是否启用

通过这种类结构,Time Service预定义计时器基于GPT预定义计时器实现,从而提供统一的时间服务API。每种计时器类型都有预定义的时钟周期和位大小,确保了在不同平台上的兼容性。

2.2.2 代码示例
/* Time Service模块数据类型定义 */
typedef uint8 CounterType;
typedef uint32 CounterValueType;
typedef uint32 TimeStampValueType;
typedef struct {
    TimeStampValueType timestamp;
    uint8 timer_id;
} TimeStampType, *TimeStampPtrType;

typedef enum {
    TIME_ELAPSED,    /* 第一个时间戳晚于第二个时间戳 */
    TIME_EQUAL,      /* 两个时间戳相等 */
    TIME_NOT_ELAPSED /* 第一个时间戳早于第二个时间戳 */
} CompareResultType;

/* Time Service预定义计时器配置 */
typedef struct {
    uint8 BitSize;        /* 计时器位大小 */
    uint32 TickDuration;  /* 计时器时钟周期(微秒) */
    boolean IsEnabled;    /* 计时器启用状态 */
} TimeService_PredefTimerType;

/* Time Service API实现示例 */
Std_ReturnType TimeService_GetCounterValue(CounterType TimerId, CounterValueType* Value)
{
    if (TimerId >= MAX_TIMER_ID || Value == NULL) {
        return E_NOT_OK;
    }
    
    /* 通过GPT驱动获取计数器值 */
    return GPT_GetPredefTimerValue(TimerId, Value);
}

Std_ReturnType TimeService_GetElapsedValue(CounterType TimerId, 
                                          CounterValueType* PreviousValue, 
                                          CounterValueType* ElapsedValue)
{
    if (TimerId >= MAX_TIMER_ID || PreviousValue == NULL || ElapsedValue == NULL) {
        return E_NOT_OK;
    }
    
    CounterValueType currentValue;
    Std_ReturnType result;
    
    /* 获取当前计数器值 */
    result = GPT_GetPredefTimerValue(TimerId, &currentValue);
    if (result != E_OK) {
        return result;
    }
    
    /* 计算经过的时间值 */
    if (currentValue >= *PreviousValue) {
        *ElapsedValue = currentValue - *PreviousValue;
    } else {
        /* 处理计数器溢出情况 */
        *ElapsedValue = (0xFFFFFFFF - *PreviousValue) + currentValue + 1;
    }
    
    /* 更新上一次值 */
    *PreviousValue = currentValue;
    
    return E_OK;
}

2.3 Time Service状态模型

在这里插入图片描述

2.3.1 状态模型解释
状态 未初始化:
  • 描述: Time Service模块尚未初始化的状态
  • 特性: 在这个状态下,模块的任何功能都不可用
  • 转换: 通过初始化过程转换到已初始化状态
状态 已初始化:
  • 描述: Time Service模块成功初始化后的状态
  • 特性: 在这个状态下,模块的所有功能都可用
  • 子状态:
    • 空闲: 模块未执行任何特定功能的默认状态
    • 执行时间测量: 模块正在执行时间测量功能
    • 超时监控: 模块正在执行超时监控功能
    • 忙等待: 模块正在执行忙等待功能

Time Service模块的状态模型展示了模块在初始化后如何在各个功能状态间转换。用户可以通过调用不同的API函数触发状态转换:

  • 调用GetTimeStamp()GetTimeStampValue()会从空闲状态转换到执行时间测量状态
  • 调用GetElapsedValue()会从空闲状态转换到超时监控状态
  • 调用WaitWithCheckPredefTimer()会从空闲状态转换到忙等待状态

所有功能完成后,模块会自动返回到空闲状态。模块采用轮询模式,所有服务都由用户调用,不支持通知方式。

2.3.2 代码示例
/* Time Service模块状态定义 */
typedef enum {
    TIMESERVICE_UNINIT,   /* 未初始化 */
    TIMESERVICE_INIT      /* 已初始化 */
} TimeService_StateType;

/* 内部功能状态 */
typedef enum {
    TIMESERVICE_IDLE,            /* 空闲 */
    TIMESERVICE_MEASURING,       /* 执行时间测量 */
    TIMESERVICE_MONITORING,      /* 超时监控 */
    TIMESERVICE_BUSY_WAITING     /* 忙等待 */
} TimeService_FuncStateType;

/* 模块内部状态变量 */
static TimeService_StateType timeServiceState = TIMESERVICE_UNINIT;
static TimeService_FuncStateType timeServiceFuncState = TIMESERVICE_IDLE;

/* 时间测量功能示例 */
Std_ReturnType TimeService_GetTimeStamp(TimeStampPtrType TimeStampPtr)
{
    if (timeServiceState != TIMESERVICE_INIT) {
        return E_NOT_OK;
    }
    
    if (TimeStampPtr == NULL) {
        return E_NOT_OK;
    }
    
    /* 更新功能状态 */
    timeServiceFuncState = TIMESERVICE_MEASURING;
    
    /* 获取时间戳 */
    CounterValueType value;
    Std_ReturnType result = GPT_GetPredefTimerValue(GPT_PREDEF_TIMER_1US, &value);
    
    if (result == E_OK) {
        TimeStampPtr->timestamp = value;
        TimeStampPtr->timer_id = GPT_PREDEF_TIMER_1US;
    }
    
    /* 恢复空闲状态 */
    timeServiceFuncState = TIMESERVICE_IDLE;
    
    return result;
}

/* 超时监控功能示例 */
Std_ReturnType TimeService_CheckTimeout(
    CounterType TimerId,
    CounterValueType StartValue,
    CounterValueType Timeout,
    boolean* TimeoutOccurred)
{
    if (timeServiceState != TIMESERVICE_INIT || TimeoutOccurred == NULL) {
        return E_NOT_OK;
    }
    
    /* 更新功能状态 */
    timeServiceFuncState = TIMESERVICE_MONITORING;
    
    CounterValueType currentValue;
    CounterValueType elapsedValue;
    Std_ReturnType result;
    
    /* 获取当前计数器值 */
    result = GPT_GetPredefTimerValue(TimerId, &currentValue);
    
    if (result == E_OK) {
        /* 计算经过的时间 */
        if (currentValue >= StartValue) {
            elapsedValue = currentValue - StartValue;
        } else {
            /* 处理计数器溢出 */
            elapsedValue = (0xFFFFFFFF - StartValue) + currentValue + 1;
        }
        
        /* 判断是否超时 */
        *TimeoutOccurred = (elapsedValue >= Timeout);
    }
    
    /* 恢复空闲状态 */
    timeServiceFuncState = TIMESERVICE_IDLE;
    
    return result;
}

3. 术语与缩略语

缩略语/术语描述
Time Service Predef TimerTime Service预定义计时器
GPT Predef TimerGPT预定义计时器,是由GPT驱动提供的免费运行的上计数器

4. 总结

AUTOSAR Time Service模块作为服务层的重要组成部分,为汽车软件提供了基本的时间服务功能。通过预定义计时器机制,它确保了在不同平台上时间基础功能的兼容性。

主要特点:

  • 提供多种预定义计时器类型,具有固定的时钟周期和物理范围
  • 支持时间基准状态机、时间测量、超时监控和忙等待等功能
  • 采用轮询模式,所有服务由用户调用,不支持通知方式
  • 基于GPT驱动提供的硬件计时器实现

这些功能使Time Service模块成为AUTOSAR架构中实现基于时间功能的关键组件,为汽车电子控制单元(ECU)的开发提供了标准化的时间服务接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值