一、KEIL MDK有时编译生成的烧录文件有问题
最近因为这个编译的问题折腾了整整两天,每天都加班,搞得头大如斗,这个必须是要记录总结一下。一开始本来工程中使用了LFS文件系统,但是实际测试中,发现这个LFS对写SPI FLASH耗时非常的长,比如说正常写入只需要1s,加了这个LFS,耗时需要4s,整整是原来4倍的时间,这一点不细说这个LFS的问题,然后就是准备把LFS从代码中去除掉,于是花了两三天时间,费了挺大劲,终于把它去掉了,换成了直接读写SPI FLASH的形式,测了确实是没有问题,但是这个时候,问题来了:这个修改后的工程编译生成的文件完全是不正常的,现象是会造成DSP控制出错,然后DSP一直是个异常的,不知道为啥异常,对比来对比去,确实没有发现问题,于是只好拿原来可以运行的工程和现在的工程对比,把两个工程通过SPI发送给DSP的命令数据全部打印出来做对比,果然这个思路是对的,虽然花了很大的力气,但是确实发现两个工程打印出来的数据在某些模块的控制上,命令数据完全对应不上,不仅是内容对应不上,而且长度也对应不上,因为两个工程对于DSP的控制是完全一模一样的,不可能存在这么大的差异。于是调试看,在调试中发现,异常工程在某些模块的DSP控制过程中,取保存在MCU FLASH中的常量数组中的数据时,取出来的数据竟然完全是错误的,取出来的数据和数组中实际放置的数据完全不一样,那么就是这里出问题了,会什么会有这样的问题呢?问了老司机,他说他以前就有碰到这样的问题,应该是编译器的问题,导致编译出来的文件有问题,于是我把那个常量数组定义的源文件稍微改了下然后编译再下载进去,果然调试看数据就对了,于是乎,我就把整个工程的所有文件全部重新编译,然后生成的烧录文件下载后,再把发给DSP的命令打印出来,果然,这下和那个正常的工程命令是完全一样的。TMD,浪费了我一天半的时间,搞得心贼累,最后发现是编译器的问题,好像具体是因为有些文件改了但是编译器没有重新编译,它这个编译是按文件的时间来判断是否需要编译的,不知道怎么的,然后编译出来的文件可能不是全部的最新的源文件编译的,所以对应不上,烧录进去程序跑起来就有点莫名其妙的错误。这下好了,找到问题了,因为这个工程不是最新的,只是为了用来找这个问题的原因,所以没用最新的,而是用了去除了LFS但是又和之前的工程差异尽量小的工程,也是为了保持尽可能的小改动,这样方便定位是哪些改动导致的问题。然后,我就把最新的工程,照着前面的处理方式,既对那个放置常量数组的文件做了小改动重新编译,然后又把整个工程的文件全部重编译了一遍,这样应该总没问题了,然后烧录进去,尼玛,DSP仍然有问题,也是和之前那个异常工程一样的问题,唉,叹口气,真的是服了,没有办法,只好像上面一样,再次把这个工程发给DSP的命令数据打印出来,发现仍然是那几个模块的数据不一样,长度也不一样,但是因为这个相比之前的工程,改了DSP的LIMIT,所以有差异是正常的,而且长度也确实是变长了,所以综合分析这些命令数据也是没问题的,那么问题出在哪呢?实在是没辙了,只好把工程发给了老司机让他帮忙看看,他重新编译生成烧录文件烧录进去后,竟然是正常的,没有问题,不过此时因为换了台机器,难道是硬件板子的问题,于是我又拿回来,重新烧录了进去,然后发现仍旧不正常,这就奇葩了,我这边编译生成的文件烧进去就是异常的,他那边编译生成的烧进去就是正常的,这TM,而且这个工程我是全部重新编译过了的,然后老司机说,把之前生成的.obj的中间文件全部删除掉,然后再全部重新编译看看,我照做了,编译完后再烧进去,靠,正常了,反复测了下,确实正常了,这也太离谱了,又TM是编译的问题,真不知道该说什么了。本来之前的工程是全部重编译后就正常了,现在这个工程也是全部重编译了,但是生成的文件仍然有问题,直到把所有的原来生成的中间文件全部删除再重新全部编译后,烧录文件才正常,唉,这也太那个了,这样搞的我很崩溃,这编译这么多的问题,因为这个鬼问题,花了我整整两天,真是是日了狗。