我正在帮助一位朋友在他的AVR上使用图形液晶显示器,几个月前,所有显示器都工作正常,自那以后一直未受影响。该芯片现在已从ATMega32更换为ATMega164P。本质上,同一块芯片具有更多的闪存,因为此更改导致许多代码停止工作。

我们已缩小发生错误的位置,但无法纠正。在这里,我们传递一个指向const char字符串的指针,并尝试打印该字符串,但是由于某种原因,堆栈(堆,还有其他东西?)损坏了,并且指针包含全零。有谁知道如何发生这种情况?我们启用了-O1级别优化,这是正确定时所必需的,我们也已切换到winAVR编译器,并且没有任何更改。我们也没有访问调试器的权限,只有有限的“打印”样式调试。

这是导致问题的代码部分:

//in the header file that is included
int SGCTEXTStringF(int column, int row, int font, int colour, const char* text);

//Call the function
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), "text");

//Function
int SGCTEXTStringF(int column, int row, int font, int colour, const char* text){

unsigned char bytes[23]={0};

//...Code to communicate with LCD and set up a 'print string'

if(text[0] == 0) {
    bytes[6] = 'a';
    bytes[7] = 't';
    bytes[8] = 'e';
    bytes[9] = 's';
    bytes[10] = 't';
}

//..more code to finish sending the array
}


现在,代码在运行时显示“ atest”,这表明const char数组被置零了吗?我也尝试了以下几行,也都打印了“ atest”

if(text[1] == 0)   //prints 'atest'
if(*text== 0)      //prints 'atest'
if(text != 0)      //prints 'atest'


这表明它获得了一个有效的指针,但它似乎指向全零。

我们还尝试将对方法的调用更改为:

const char * string = "test";
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), string);


已知此代码在几个月前开始工作,我们甚至还运行了一段视频,现在程序中的每个函数都表现出相同的问题,正在传递的char数组(在堆栈上?)似乎不起作用,并且清除为0。

如果有人感兴趣,我可以安排托管完整的源代码副本。任何帮助或指针,不胜感激!

最佳答案

ATMega164P不是ATMega32的替代品,而是ATMega16的替代品。对于ATMega32,您将需要ATMega324P。
如果您将内存映射用于ATMega32(具有双EEPROM,SRAM和闪存),则您的字符串可能已落入根本不存在的内存中。
对于移植问题,您可以查看Atmel的porting guide

10-02 02:33