这两个星期在LPC2214上调一些代码,前几天调试感觉代码稳定性特别差,同样的代码不做任何改动从新编译一次就有可能造成程序不能执行。后来逐渐发现了原因,在ADS中设置全局变量很可能造成代码不稳定甚至不能运行。而且编译器的优化可能会造成很多毛病,同样的代码 我用-O2编译能够正常运行,但是用-O0编译就不能正常执行。后来把容易造成错误的全局变量全部用VOLATILE声明,但是结果仍然不理想,最后是在忍无可忍,选择了IAR来编译。感觉IAR还是相当好用的,我用的4.40A,一个不好的地方是和HJTAG之间配合的不太好。决定过两天买一个仿真器。今天代码在RAM中已经调通但是下载到FLASH中程序一中断就跑飞,出现取指令异常。后来发现是中断向量表的重映射没设置对(memmap寄存器),导致中断向量表存在片上RAM中,中断程序跳转的时候程序就飞了。2214的UART不知道是不是有BUG,将从串口发给2214的数据再重新传回来,经常发送的00就会被忽略掉,而且如果发送的数中有13的话,就根本没有反馈了,不知道是串口调试软件的问题还是2214的问题。可能是外国人觉得13不吉利给我没收了。这几天调代码问过几次ZLG的技术支持,总体感觉水平很差。而且一直性我推荐什么垃圾ECOS增值包,在他们口中ECOS增值包就是个万金油,什么问题都有相应解决方案。还有一点感觉是LPC2214的BUG太多,下载勘误表一大堆BUG,简直让人不敢放心。
使用关键词__volatile限定的一个对象,可以告诉编译器该对象可能在程序之外被修改,这样编译器在编译时将不优化对该操作对象的操作。对于系统中的IO寄存器,通常使用volatile类型的结构来访问。
——《ARM体系结构与编程》