2

我在我的项目中使用 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 检查(“if”语句的第二部分未完成)。

避免这种情况的一种方法是删除“if”条件的第一部分,它检查 Block_ID 而不管指针是否为“NULL”,如下所示

逻辑 2

if (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET))

但是如果“pBlock_One_Pointer”指向NULL,会不会引发异常?

所以基本上我有两个问题:

  1. 由于运行时的某些损坏,指针是否有可能变为 NULL 指针?
  2. 如果是这样,Logic 2会帮助我克服它吗?
4

2 回答 2

2

但是如果“pBlock_One_Pointer”指向NULL,会不会引发异常?

它会导致未定义的行为。

根据C 标准6.5.3.2 地址和间接运算符

一元运算*符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值。
如果操作数的类型为''指向类型''的指针则结果的类型为''类型''。如果为指针分配了无效值,则一元运算符的行为*未定义。

所以:

由于运行时的某些损坏,指针是否有可能变为 NULL 指针?

是的。这是可能的。

如果是这样,Logic 2 会帮助我克服它吗?

不,怎么可能?您要检查是否损坏的内存位置已丢失。

于 2017-12-19T15:04:31.893 回答
-1

由于运行时的某些损坏,指针是否有可能变为 NULL 指针?

是的,有几件事可能导致这种情况。软件问题,例如指针错误、代码失控、堆栈溢出等。此外,由于数据保留、EMI(现在不太可能)或环境辐射/宇宙射线而导致内存硬件故障。

如果是这样,Logic 2 会帮助我克服它吗?

不会。有多种方法可以检测损坏的 RAM,最常见的是 CRC 校验和。

要检测故障的内存硬件,还有其他方法,例如“行走模式”,您可以通过定期向它们写入 1 和 0 来循环单元格。然而,在现代嵌入式系统中,使用具有内置ECC的内存,因此软件无需担心内存硬件完整性。

于 2017-12-20T07:59:58.083 回答