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文件的相关内容是否正确,避免编译、链接错误的源代码文件。
文章详细分析了系统上电后手动设置的时间在掉电重启后无法保存的问题,通过更换不同固件未能解决问题,最终发现是由于编译过程中的源码差异导致rtc驱动未正确编译,解决了rtc芯片时间保存的问题。
4235

被折叠的 条评论
为什么被折叠?



