取消引用嵌入式

时间:2017-12-19 14:48:45

标签: c pointers embedded non-volatile

我在我的项目中使用瑞萨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,是否会导致异常?

基本上我有两个问题:

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

2 个答案:

答案 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的内存,因此软件无需担心内存硬件完整性。

相关问题