AutoSar MemTst

根据Specification of RAM Test AUTOSAR CP R23-11,讲讲自己对RamTst.c的理解。

static void MemT_RamTstMainFunction(void)
{
  /* Get current RAM Test execution status, selecting the algorithm parameter set,、
   Enables background testing */
  if(memt_data.is_ram_tst_fisrt_run == MEMT_MAGIC_TRUE)
  {
    /* Gets the sign that RamTst initialization is complete, 
       and waits for the initialization to complete to begin subsequent operations */
    memt_data.ram_tst_exe_sts = RamTst_GetExecutionStatus();  
    if(memt_data.ram_tst_exe_sts == RAMTST_EXECUTION_STOPPED)
    {
      memt_data.is_ram_tst_fisrt_run = MEMT_MAGIC_FALSE;
      /* Select the first subset of the test set */
      RamTst_SelectAlgParams(RamTstConf_RamTstAlgParams_RamTstAlgParams);
      /*Start the RamTst background test*/
      RamTst_Allow();
    }
}

首先执行RAM测试,包含选择算法参数以及启用后台测试。一切都要等待RAM初始化完成,然后启动后续的操作。这个函数主要作用就是执行RamTest,最终的结果是启动RAM后台测试

selecting the algorithm parameter set?什么意思啊,为什么要获得算法参数?什么算法?什么参数?

测试参数算法选择涉及到了内存某个特定功能的测试,可能需要不同的地址范围以及step,

某些算法可能专注于检测 RAM 的读写错误,而其他算法可能检测 RAM 的边界条件或特殊故障模式

Note:该函数在5ms周期函数内,即每5ms执行一次RAM测试。从代码内容来看,只有首次需要执行,除非memt_data.ram_tst_exe_sts更改为了MEMT_MAGIC_TRUE

1000ms执行一次的函数。执行一下函数,

  MemT_ReadData();
  MemT_CalcFlsChecksum();
  MemT_CalcEntityChecksum();
  MemT_WriteData();
  (void)Rte_Call_alive_WdgMSupervisedEntity_MemTst_CheckpointReached(0u);

其中,MemT_ReadData读取fault 先决条件,猜测这和RAM测试中电压相关有关;

MemT_CalcFlsChecksum

它来计算Flash的校验和,通过hexview中的CRC和实际计算的CRC比较。如果相同,释放fls error,并将fls的checksum计算步骤设置为完成。但是需要注意,每个case中都有一个break,当完成该case任务后,会切换状态并跳出语句的执行。且三个状态是连续的,计算、大小端的转换以及完成;每次都会执行一个case,考虑到该函数被1s调用一次,所以会不断的更加状态管理变量来决定要执行的case。

MemT_CalcEntityChecksum

这个应该是计算bootlooder的CRC的。PBL是Primary Bootloader,即主要引导程序,它引导APP程序的启动,是首选要烧录到板子中的部分。这个函数计算BootLoader和APP的CRC值并保存在了全局变量中。

MemT_WriteData

这个函数将计算的结果上传,具体的,如果从DTC读取的Vmp故障条件有问题,那么写入False;否则,将

is_fls_err; /*flash CRC一致,为0x55 */
is_ram_err
app_checksum
pbl_checksum
calc_coplt_flag; /*计算CRC完成的标志*/

5ms 执行一次函数—-MemT_RamTstMainFunction

结合RamTst模块和整体的测试状态

首先执行RamTst_Init,该函数将状态设置为RAMTST_EXECUTION_**STOPPED,**在MemTst.c中,如果观测到RamTst_ExecutionStatusType类型的结构体变量为STOPPED, 说明初始化函数已经执行完毕了,可以进行下一个步骤。接着,OS Task执行调度动作,RamTst_MainFunction,但为no testing;Memtst模块调用RamTst_Allow(),当前状态更新为Test Allowed.这是os Task调用RamTst_Mainfunction(testing),当前状态切换为Running,执行一段时间后,执行RamTst_Stop,状态更新为STOPED;OS Task执行调度动作,RamTst_MainFunction,但为no testing,执行foreground test,状态更新为test running,执行完毕后更新为RAMTST_EXECUTION_STOPPED。

总结:只有当状态为ALLOWED时,才OS task才能调用MainFunction 来执行测试工作。

MemT_RamTstMainFunction函数的作用是每间隔5ms来检测RamTst状态,如果是首次初始化,获取当前RAM状态,如果STOP,那么设置算法参数,并allow RamTst MainFunction执行。


RamTst标准

它关注的是RAM单元的健康。RAM测试中,覆盖范围理解为一个指标,它指的是测试算法能够检测到的故障类型和覆盖的RAM区域。不同测试算法和覆盖级别具有不同的意义和应用场景。覆盖率越低,表示算法能够检测到的潜在故障范围越低。现在ISO标准规定了三个覆盖级别,60%,90%,99%。

RamTst_Allow

    RamTst_CurrentExecutionStatus_t = RAMTST_EXECUTION_ALLOWED;
这个状态允许RamTst_MainFunction()在下一个调度call中进行Testing

RamTst_Stop

/* Stops the currently running background test */
RamTst_CurrentExecutionStatus_t = RAMTST_EXECUTION_STOPPED;
/* Set the global loop counter for the background test to 0u. */
RamTst_BackgroundLoopCounter_u8 = (0u);

丢弃算法参数,停止MainFunciton在下一个预定调度内进行调度;将状态设置为执行STOP(当前原子级序列结束后,测试停止。

RamTst_Suspend,

 RamTst_CurrentExecutionStatus_t = RAMTST_EXECUTION_SUSPENDED;

什么是Schedule Call?
系统OS以特定的时间间隔来定期执行某个函数。

Foreground testing, Background testing

前者一次调用后一直执行,不可中断,在主程序的控制下完整的检测整个RAM区域,期间不允许其他程序访问;而后台测试是周期性运行,允许中断。

前台测试和后台测试是两种不同的RAM测试策略,前台测试适用于需要完整、不可中断的测试,而后台测试适用于在系统运行的同时进行周期性检查

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值