结果取决于变量初始化的顺序?

时间:2014-05-19 21:17:44

标签: c microcontroller atmega

我正在ATmega16a上试验SPI,因此在C中初始化以下变量(在任何方法之外):

uint8_t refreshCounter = 0;
uint8_t sendBuffer[32] = {};
volatile uint8_t doSend = FALSE;
char lineBuffer[20] = {};

使用这些行一切都按预期工作,但是当我切换最后两行时,我的程序停止工作(至少远程SPI模块没有回答):

uint8_t refreshCounter = 0;
uint8_t sendBuffer[32] = {};
char lineBuffer[20] = {}; 
volatile uint8_t doSend = FALSE;

这些定义有什么问题?为什么订单很重要?

doSendvolatile,因为它在中断处理程序中使用。所有其他变量只能在无限主循环中访问。告诉我,如果你需要更多代码。

2 个答案:

答案 0 :(得分:2)

将@ WhozCraig的评论转变为答案:是的,我使用以下行将21个字节写入我的lineBuffer

sprintf(lineBuffer, "%20c", ' ');

因为sprintf附加一个尾随空格。我的错。

谢谢@WhozCraig!

答案 1 :(得分:1)

取决于变量顺序的奇怪行为通常是内存损坏的症状。在PC世界中并不值得注意,内存保护是正常的,但在裸机程序中它很常见。

如果您的程序崩溃是因为您在某处将short更改为int或某些结构中的变量顺序颠倒 - 开始寻找内存损坏。你不会失望的。 :)