以前用MontaVista的toolchian编译的好好的bootloader, 用DevTek带的arm-linux就有问题, 而且是莫名其妙。出问题的代码如下:
register int i;
for (i = 0; i < j; i++) ; // j 是运行期变量
这
段代码本意是自循环,达到delay效果。但是用arm-linux编译后, 这段代码死活不能delay(优化选项打开 -O2 -Os,
都试过)。当时就觉得相当奇怪,在尝试延长循环次数和其他方法无效后,只能-S
直接汇编。汇编的结果是这段loop被编译器直接remove掉了。当然不打开优化选项一点问题都没有,但bootloader哪能不优化呀。第一反应是
从编译选项上找问题, 但后来对比DevTek的bootloader,
发现i的声明被volatile修饰而非register后,一切ok。后来去GCC去找原因,至今没什么发现。
结合以前BSP 里的driver bug和如今toolchian的异常,给人一启发:千万别过于依赖别人的东西,需要一些怀疑精神。
阅读(1841) | 评论(0) | 转发(0) |