2011-11-23 54 views
0

我正在帮助朋友得到一个在他的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。

如果任何人有兴趣,我可以安排提供完整源代码的副本。任何帮助或指针都是值得赞赏的!

+0

它看起来像某种链接器问题。也许字符串文字没有被链接到正确的地址,或根本没有。我会查看生成的二进制文件并确认它确实包含所有需要的文字。同时尝试打印并验证他们的地址。 –

+0

检查堆栈的大小。如果它太小,你会得到这种奇怪的行为。另外,你可以显示SGCColour的定义吗? – qehgt

+0

并重新检查您的地图文件(链接器可以生成它)。可能是“常量数据”(放置C字符串)部分有问题。 – qehgt

回答

2

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

+0

编译时选择了正确的芯片,还有哪些其他选项需要更改? – rolls

+0

必须只是内存不足。 – rolls

+0

evice:atmega164p 计划:3398个字节(20.7%满) (+的.text。数据+ .bootloader) 数据:886个字节(86.5%满) (。数据+的.bss + .noinit)看起来像很多可用空间? – rolls