这里列举一下嵌入式软件开发中容易遇到的几个简单但容易忽略的问题,一旦出现,会明显加大debug的难度。
1. 字节对齐的问题
在PC机上,变量地址不对齐对程序员来说不会有什么感觉,但是在嵌入式中可能就会导致程序不工作。
譬如如下这段代码
uint32_t base_addr = 0x4000000, value = 0x5a5a5a5a;
for (i = 0; i < 1; i++) {
writel (value, base_addr+i);
}
在循环执行第一次时
writel (0x5a5a5a5a, 0x4000000); // 工作正常
但是在执行到下一个循环时变成了
writel (0x5a5a5a5a, 0x4000001); // break down
这时很多处理器,譬如arm,如果不支持非对齐访问,那么系统就崩溃了,如果当前没有什么先进的调试手段,只能通过点灯调试,那么即使是这样一个错误可能也要追踪好久,想想时间花在了这种地方估计就会觉得不太值得了。
2. 注意变量类型,特别是变量和常量做加法时
譬如有如下一段代码
#define CONFIG_OFFSET 0x10
unsigned int *dmc = 0x4000000;
func(dmc+CONFIG_OFFSET);
注:
func
是想要调用的函数
本来此时想要执行的是
func(0x4000010);
结果编译成了
func(0x4000040);
岂不是事与愿违了,这个时候看代码通常很难看出来,通过反汇编可以,但是也增加了不少调试时间。