linux使用默认Makefile引发的RTC掉电不保存问题分析

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文件的相关内容是否正确,避免编译、链接错误的源代码文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值