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

Arm 由于一个逻辑错误,整个程序无法运行,arm,embedded,lpc,Arm,Embedded,Lpc,我正在为LPC2148使用NEX机器人板。我发现下面几行代码有一个非常奇怪的问题 //Prototypes void diaplayInRow1WithPosition(unsigned char* data, unsigned char position); void diaplayInRow2WithPosition(unsigned char* data, unsigned char position); unsigned char convertHigherNibbleToASCIIVa

我正在为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);
}
当执行此代码时,我看到一个空白显示。我注意到问题在于最后一次ConvertLowerNibbleToAscivalue函数调用。应该是:

temp2 =   convertLowerNibbleToASCIIValue(temp2 );
但由于这一行错误,为什么整个显示是空白的?只有最后一个函数DIPLAYINROW1WITHPOSITION才会出现问题,对吗? 即使在改变了以上的行,我得到了空白显示。因此,我将包含最后一个ConvertLowerNibbleToAscivalue的行替换为

temp2 =   convertLowerNibbleToASCIIValue(PLLStatus>>8);
最后我得到了正确的显示

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

比“整个程序不工作”更可能的情况是:

  • 显示数据被缓冲,并且在缓冲数据到达显示器之前程序崩溃
  • 或者简单地说,
    PLLStatus
    的值是不可显示的,并且会导致显示空白,或者可能会完全停止它的工作-它可能不是可打印字符,并且我们没有得到有关显示硬件或其API的信息,因此垃圾的影响是未定义的

最终发现问题出在Keil编译器上。如果我添加一个额外的伪行(可以是任何赋值语句),代码就可以工作!!!某个地方正在进行一些优化,但无法确定在哪里。不管怎样,我现在有工作要做。如果不起作用,则添加一个假人,如果不需要,则再次移除

如果没有这些函数的代码,其他任何人都很难进行分析。您可以比较两个版本的列表文件或反汇编,看看有什么变化。或者,您可以在断点调试器下运行,或者添加监视输出(如串行端口),或者在程序中可以使用作用域监视的点处更改GPIO的状态。