我正在帮助一个朋友在他的 AVR 上安装一个图形 LCD,几个月前一切正常,从那时起就没有受到影响。该芯片现已从 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 数组是如何归零的?我还尝试了以下行,这些行也都打印了“test”
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);
这段代码几个月前就可以运行了,我们甚至有一段运行它的视频,现在程序中的每个函数都出现了同样的问题,被传递的字符数组(在堆栈上?)似乎不起作用并且清零。
如果有人感兴趣,我可以安排托管完整源代码的副本。任何帮助或指示都将不胜感激!