gpt4 book ai didi

c++ - 对于用 C 编写的 AVR micro,Const Char 数组被修改为全 0

转载 作者:行者123 更新时间:2023-11-28 03:44:03 27 4
gpt4 key购买 nike

我正在帮助一位 friend 在他的 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 数组正在某种程度上归零?我还尝试了以下行,它们也都打印“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);

这段代码在几个月前就可以正常工作了,我们甚至有它运行的视频,现在程序中的每个函数都出现了同样的问题,正在传递的字符数组(在堆栈上?)似乎没有工作并清零。

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

最佳答案

ATMega164P 不是 ATMega32 的替代品,而是 ATMega16 的替代品。对于 ATMega32,您需要 ATMega324P。如果您正在使用 ATMega32 的内存映射(它有双 EEPROM、SRAM 和闪存),您的字符串可能已经落入根本不存在的内存中。对于移植问题,您可以查看 porting guide来自爱特梅尔。

关于c++ - 对于用 C 编写的 AVR micro,Const Char 数组被修改为全 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8236742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com