由于一个逻辑错误,整个程序无法运行

Entire program not working due to one logical error

我正在为 LPC2148 使用 NEX 机器人板。我发现下面几行代码有很奇怪的问题。

//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 编译器和任何编译器依赖项?没有编译错误。 如果类型等有问题,整个程序会被破坏吗?

比您的 "entire program not working" 更有可能的是:

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

终于发现是Keil编译器的问题。如果我添加一个额外的虚拟行(可以是任何赋值语句),代码就可以工作!!!某处正在进行一些优化,但无法弄清楚在哪里。无论如何,我现在有解决办法。如果不起作用,请添加一个假人,如果不需要,请再次删除!!!