根据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测试策略,前台测试适用于需要完整、不可中断的测试,而后台测试适用于在系统运行的同时进行周期性检查