我们发现有了一些改善:一些输出被显示在了LCD屏上了。但是,由于一次访问违规,程序崩溃掉了。因此我们需要再次地做出选择。我们是应该使用调试器还是继续使用自动化的错误检测技术。由于经验告诉我们自动化错误检测技术能非常高效地检查出我们当前程序所遇到的内存崩溃这类问题,因此我们决定使用运行时内存监测来查找问题。

整个程序的运行时内存监测

为了进行运行时内存监测,我们使用 C++test 来插装应用程序。这样的插装是轻量级的,所以经过插装后的程序适合在目标板上运行。当我们把程序上载到目标板上并运行经过插装的程序后,我们将结果下载到PC上,如下的错误将被报告出来:

基于多种自动化软件验证技术查询嵌入式C语言应用中的缺陷问题

该结果指出在第48行代码处产生了一次读取数组越界的错误。显然,msgIndex变量的值肯定超过了数组的范围。如果我们随着堆栈追踪上一级的原因,我们将发现此处的打印信息所指示的值的确超出了数组的范围(因为在调用printMessage()函数前我们给出了一个错误的条件)。我们可以删除掉这个不必要的条件(value 《= 20)以修改这个错误。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value 》= 0 && value 《= 10) {

index = VALUE_LOW;

} else if ((value 》 10) && (value 《= 20)) {

index = VALUE_HIGH;

}

printMessage(index, value);

}

然后我们重新运行程序,将不会再报告任何内存错误。当我们把程序上载到目标板上时,它似乎如我们预期那么在工作了。尽管如此,我们仍然有一些担心。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查