I.问题现象
系统上电后,手动设置系统时间,并固化到rtc芯片中,掉电重启后发现系统时间未保存住,系统时间变成1970年1月1日0时0分0秒开始计时。
II.问题分析
拿到单板后,依次做了更换当时给测试制作的sd卡上的kernel固件、文件系统固件、uboot固件,发现问题依然存在;
当时我的虚拟机中存放着制作sd卡固件的源码,重新编译kernel固件并更换,发现问题依然存在;
将虚拟机中kernel的源码删除,重新从svn上checkout一份相同版本的kernel源码编译uImage,更换此kernel固件后问题恢复;
从上面的情况分析,应该是第一次制作kernel固件时的源码与第二次重新从svn上checkout的源码编译出来的固件存在差异,导致问题出现。
第一次的源码是在通过命令svn status | xargs rm –rf将存在的代码跟svn上的差异代码删除,之后通过svn update更新最新的svn代码后编译生成的kernel固件,此固件烧录到管理机上后会有rtc时钟无法保持的问题;
第二次的源码是直接将kernel代码删除掉,然后重新从svn上checkout一份新的代码后编译生成的固件,此固件烧录到管理机后无问题。
在第二次代码的基础上重新执行第一次的操作:svn status | xargs rm –rf,svn update,之后编译kernel固件,观察rtc驱动目录下编译生成的.o文件,并与直接删除kernel代码并重新checkout的代码编译后rtc驱动目录下生成的.o文件对比:
直接删除源码,重新checkout后编译,rtc目录下生成的.o文件如下图
在源码基础上通过svn status | xargs rm –rf后svn update更新代码编译,rtc目录下生成的.o文件如下图:
对比发现rtc-rx8025.o文件没有编译出来,多出来一个rtc-pcf8563.o,此文件是pcf8563 rtc芯片的驱动编译而成,从此处可以得到的结论是:在源码基础上通过svn status | xargs rm –rf后svn update更新代码编译的方式是存在问题的,会导致我们的rx8025驱动未被编译,因为没有响应的驱动从而系统无法从片外rtc芯片获取系统时间,表现为rtc芯片掉电无法保存系统时间,而系统在获取不到片外rtc芯片时间后会自动将系统时间设置为1970年的起始时间。
III.解决措施
1、规范版本发布编译流程,确保流程是删除全部老代码,之后重新从svn上checkout对应版本的新代码,最后再进行固件的编译工作。
2、编译过程中那些驱动要编译哪些驱动不编译是由makefile文件控制的,查看rtc驱动的makefile文件,发现驱动的编译是由内核配置选项控制的:
为了防止rx8025的驱动漏编译的情况发生,修改此makefile文件,写死rtc驱动一定编译rx8025的驱动,而不编译pcf8563的驱动:
IV.总结和建议
编译制作发布的固件时,要检查Makefile文件的相关内容是否正确,避免编译、链接错误的源代码文件。