我正在帮助朋友得到一个在他的AVR上工作的图形LCD,几个月前所有的工作都没有问题,从那时起它一直没有任何问题。芯片现在已经从ATMega32换成ATMega164P。基本上与更多闪存相同的芯片,因为这种改变很多代码已停止工作。const Char数组被修改为全0,AVR微写入C
我们缩小了发生错误的位置,但无法纠正错误。我们在这里传递一个指向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”被运行的代码时,这表明该常量字符阵列正被一些如何zero'd ?我也曾尝试以下行也所有打印“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。
如果任何人有兴趣,我可以安排提供完整源代码的副本。任何帮助或指针都是值得赞赏的!
它看起来像某种链接器问题。也许字符串文字没有被链接到正确的地址,或根本没有。我会查看生成的二进制文件并确认它确实包含所有需要的文字。同时尝试打印并验证他们的地址。 –
检查堆栈的大小。如果它太小,你会得到这种奇怪的行为。另外,你可以显示SGCColour的定义吗? – qehgt
并重新检查您的地图文件(链接器可以生成它)。可能是“常量数据”(放置C字符串)部分有问题。 – qehgt