我正在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;
这些定义有什么问题?为什么订单很重要?
doSend
是volatile
,因为它在中断处理程序中使用。所有其他变量只能在无限主循环中访问。告诉我,如果你需要更多代码。
答案 0 :(得分:2)
将@ WhozCraig的评论转变为答案:是的,我使用以下行将21个字节写入我的lineBuffer
sprintf(lineBuffer, "%20c", ' ');
因为sprintf
附加一个尾随空格。我的错。
谢谢@WhozCraig!
答案 1 :(得分:1)
取决于变量顺序的奇怪行为通常是内存损坏的症状。在PC世界中并不值得注意,内存保护是正常的,但在裸机程序中它很常见。
如果您的程序崩溃是因为您在某处将short
更改为int
或某些结构中的变量顺序颠倒 - 开始寻找内存损坏。你不会失望的。 :)