由于一个逻辑错误,整个程序无法正常工作

时间:2015-04-11 15:00:51

标签: arm embedded lpc

我正在为LPC2148使用NEX Robotics板。我发现下面的代码行很奇怪。

//Prototypes
void diaplayInRow1WithPosition(unsigned char* data, unsigned char position);
void diaplayInRow2WithPosition(unsigned char* data, unsigned char position);
unsigned char convertHigherNibbleToASCIIValue(unsigned char data);
unsigned char convertLowerNibbleToASCIIValue(unsigned char data);
int main (void)
{
    unsigned char temp2;
    unsigned int PLLStatus;
    initializeAll();
    PLLStatus = PLL0STAT; 
    temp2 =   convertLowerNibbleToASCIIValue(PLLStatus);
    diaplayInRow1WithPosition(&temp2,15);
    temp2 = convertHigherNibbleToASCIIValue(PLLStatus);
    diaplayInRow1WithPosition(&temp2,14);
    temp2 = PLLStatus>>8;
    temp2 =   convertLowerNibbleToASCIIValue(PLLStatus);
    diaplayInRow1WithPosition(&temp2,13);
    return(0);
}

执行此代码时,我看到一个空白显示。我注意到问题出在最后一个convertLowerNibbleToASCIIValue函数调用上。应该是:

temp2 =   convertLowerNibbleToASCIIValue(temp2 );

但由于这一行错误,为什么整个显示都是空白的?只有最后一个函数diaplayInRow1WithPosition应该给出麻烦吗? 即使用上面的线改变后,我也会显示空白。所以我将包含最后一个convertLowerNibbleToASCIIValue的行替换为

temp2 =   convertLowerNibbleToASCIIValue(PLLStatus>>8);

最后我得到了正确的展示。

无法消化问题。有人可以帮忙吗?我需要的主要答案是,如果一行中存在问题,为什么以前的行没有正确执行?我正在使用Keil编译器和任何编译器依赖项?没有编译错误。 如果类型等有问题,整个程序会被破坏吗?

2 个答案:

答案 0 :(得分:0)

“整个程序无效”的可能性更大:

  • 显示数据被缓冲,程序在缓冲数据到达显示之前崩溃,
  • 或者仅仅是PLLStatus的值不可显示并且具有消隐显示效果或者可能使其完全正常工作 - 它可能不是可打印的字符,并且我们没有得到关于显示的信息硬件或其API,因此 garbage-in 的效果未定义。

答案 1 :(得分:0)

最后发现问题是用Keil编译的。如果我添加一个额外的虚拟线(可能是任何赋值语句),代码工作!某处正在进行一些优化,但无法确定哪里。无论如何,我现在已经解决了。如果不起作用,请添加一个假人,如果不需要则再次删除!!!