【需求描述】考虑到FLASH受到辐射(如过海关X光)或者长时间存放导致存贮失效,主机厂要求对FALSH自检。
【解决办法】累加和校验
step1:校验前处理。用校验工具算出bin文件累加和,存入code flash最后一页的最后4个byte。
step2:APP内对code flash中除最后一页外计算累加和,比较该累加和与存入的累加和,若相等,则自检通过。
step3:on the air升级时,bootloader中同样“对code flash中除最后一页外计算累加和”,并将累加和写入code flash最后一页的最后4个byte。
【编码实现】
/****************************************************************
Prototype : selfDiag_FlashCheck
Description : check code flash
Input : none
Output : ret
Return Value :
***************************************************************/
U8 selfDiag_FlashCheck(void)
{
U8 u8Ret = FALSE;
#if APPSELFDIAG_FLASH
U8 *start = (U8*)_CFlash_START;
U8 *end = (U8*)_CFlash_END;
U8 *checkSum= (U8*)_CFlash_CHECKSUM;
U8 *addr = start;
U32 u32CheckSum = 0;
U32 u32checkSumROM = *((U32*)checkSum);
do
{
u32CheckSum += *addr;
addr++;
}while (addr != end);
if (u32CheckSum != u32checkSumROM)
{
u8Ret = FALSE;
}
else
{
u8Ret = TRUE;
}
#else
u8Ret = TRUE;
#endif
return u8Ret;
}
#define _CFlash_START (0x00000u)
#define _CFlash_END (0xFFE00u)
#define _CFlash_CHECKSUM (0xFFE0Cu)
#define DIAG_ON (1u)
#define DIAG_OFF (0u)
#define APPSELFDIAG_FLASH DIAG_OFF
p.s.累加和工具: