Const Char数组被修改为全0的AVR微写在C
Const Char array being modified to all 0s for AVR micro written in C
我正在帮助一个朋友在他的AVR上得到一个图形LCD,几个月前所有的工作都没有问题,从那时起它就一直没有动过。芯片现在已经从ATMega32换成了ATMega164P。本质上是相同的芯片,更多的闪存,因为这个变化,很多代码已经停止工作。
我们已经缩小了错误发生的地方,但无法纠正它。在这里,我们传入一个指向const char字符串的指针,并尝试打印该字符串,但是由于某种原因堆栈(堆,其他什么?)损坏了,指针包含所有零。有人知道这是怎么发生的吗?我们启用了- 01级优化,这是正确计时所需的,我们也切换到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
}
现在,当代码运行时,显示打印' test',这表明const char数组是如何为零的?我还尝试了以下行,也都打印' test'
if(text[1] == 0) //prints 'atest'
if(*text== 0) //prints 'atest'
if(text != 0) //prints 'atest'
这表明它得到了一个有效的指针,但它似乎指向全0。
我们还尝试将对方法的调用更改为:
const char * string = "test";
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), string);
这段代码在几个月前是可以工作的,我们甚至有一个它运行的视频,现在程序中的每个函数都出现了同样的问题,字符数组传递(在堆栈上?)似乎不工作,被清除为0。
如果有人感兴趣,我可以安排宿主完整源代码的副本。任何帮助或指点都是感激的!
ATMega164P不是ATMega32的替代品,而是ATMega16。对于ATMega32,你需要ATMega324P。如果您正在使用ATMega32的内存映射(具有双EEPROM, SRAM和闪存),则您的字符串可能已经降落在根本不存在的内存中。对于移植问题,您可以查看Atmel的移植指南。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '