我在我的项目中使用瑞萨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检查(&#34的第二部分;如果"语句未完成)。
避免这种情况的一种方法是删除"的第一部分,如果"无论指针是什么,它检查Block_ID的条件是" NULL"或不如下所示
逻辑2
if (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET))
但是如果" pBlock_One_Pointer"指向NULL,是否会导致异常?
基本上我有两个问题:
答案 0 :(得分:2)
但是如果“pBlock_One_Pointer”指向NULL,它会导致异常吗?
它会导致未定义的行为。
{p> the C standard的 6.5.3.2地址和间接运算符:一元
git commit --amend
运算符表示间接。如果操作数指向 一个函数,结果是一个函数指示符;如果它指向 一个对象,结果是指定对象的左值 如果操作数具有类型''指向 type '的指针,则结果为 输入'' type ''。如果已分配无效值 指针,一元*
运算符的行为 未定义。
所以:
由于运行期间的某些损坏,指针是否有可能成为NULL指针?
是。这是可能的。
如果是这样,Logic 2会帮助我克服它吗?
没有。怎么可能呢?您要检查损坏的内存的位置将丢失。
答案 1 :(得分:-1)
由于运行期间的某些损坏,指针是否有可能成为NULL指针?
是的,有几件事可能导致这种情况发生。软件问题,如指针错误,失控代码,堆栈溢出等。此外,由于数据保留,EMI(现在不太可能)或环境辐射/宇宙射线而导致内存硬件出现故障。
如果是这样,Logic 2会帮助我克服它吗?
没有。有办法检测损坏的RAM,最常见的是CRC校验和。
要检测发生故障的内存硬件,还有其他方法,例如“步行模式”,您可以通过定期向其写入1和0来循环单元格。但是,在现代嵌入式系统中,使用内置ECC的内存,因此软件无需担心内存硬件完整性。