我在项目中正在使用Renesas V850系列微控制器。我的产品使用与主程序部分分开的非易失性内存块(NVRAM块)位置。在运行时,对这些NVRAM块进行了监视,以验证它们没有损坏。此检查是使用类似于以下给出的代码完成的:
逻辑1
if((NULL != pBlock_One_Pointer) && (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET)))
{
.....Do some corrective action....
}
此代码的问题是,如果指针" pblock_one_pointer"以某种方式被值" null"损坏,则block_id check(如果没有完成"语句的第二部分)。
避免这种情况的一种方法是删除检查block_id的"如果"条件的第一部分,无论指针的指针是" null",或者不如下面给出的
所示。逻辑2
if (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET))
但是,如果" pblock_one_pointer"指向null,是否会导致例外?
基本上我有2个问题:
- 由于运行时某些损坏,指针是否有可能变为零指针?
- 如果是这样,逻辑2 会帮助我克服它吗?
但是,如果" pblock_one_pointer"指向null,是否会导致例外?
它会导致不确定的行为。
per 6.5.3.2 C标准的地址和间接操作员:
单元
*
操作员表示间接。如果操作数指向 一个函数,结果是功能指定器;如果指向 一个对象,结果是指定对象的lvalue。
如果操作数具有"指向 type "的类型,则结果具有 键入" type "。如果将无效的值分配给 指针,一单元*
操作员的行为是 未定义。
so:
由于运行时某些损坏,指针是否有可能变为零指针?
是。可能。
如果是这样,Logic 2将帮助我克服它?
否。怎么可能?您要检查损坏的内存位置。
由于运行时某些损坏,指针是否有可能变为零指针?
是的,有几件事可能导致这一点。软件问题,例如指针错误,失控代码,堆栈溢出等。此外,由于数据保留,EMI(如今的可能性较小)或环境辐射/宇宙射线而导致内存硬件失败。
如果是这样,Logic 2将帮助我克服它?
否。有多种方法可以检测损坏的RAM,最常见的是CRC校验和。
要检测失败的内存硬件,还有其他方法,例如"步行模式",您可以通过定期向它们编写1和0循环单元格。但是,在现代嵌入式系统中,使用内置ECC的内存,因此该软件不必费心记忆硬件完整性。