欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

新塘N32926 实现时间同步

程序员文章站 2024-01-23 18:34:22
...

1.第三方库选择

由于项目里要实现板子上电后自动同步时间的功能,由于精度要求不太高,因此选择了NTP网络授时(还有GPS授时等)。
新塘这款芯片自带的SDK,kernel是2.6.35,busybox是1.15的,没有ntp功能。
关于ntp的开源实现有很多种选择。这里列出三种常用的方案。我采用的是最后一种方案。因为它代码量很少,编译起来非常方便,而且完成了我想要的同步时间的功能。如果Linux内核版本比较高,一般自带的busybox都已经有ntp的功能了,只要勾选即可。至于ntp,这是个比较大的开源项目,而且到现在还在更新,我只需要同步时间的功能,它对我来说太复杂了,而且初期编译的时候出现问题,编译后下载到板子上运行还有问题(虽然不是这个开源项目本身的问题,但是这的确导致我最终选择了ntpclient)。大家可以根据项目需求来选取合适的第三方库。
ntpclient的用法很简单,如下。其中-h是设定ntp服务器地址;-d是显示详细信息;-s是直接设置时间,当然在pc上,得有管理员权限。

./ntpclient -h 120.25.115.20  -d -s
第三方库 优势 为什么选/不选 资源地址
ntp 功能齐全吧 一开始编译不过/无法运行 ntp
busybox 的ntpd 编译、使用都方便 自带的bbox版本较低,不自带ntpd工具 busybox
ntpclient 功能单一体积小 符合项目需求 ntpclient

2.动态链接库的坑

这个问题具体来说就是,动态编译的程序,运行的时候都会提示"Permission denied"。一开始只考虑是不是动态链接库没有放到/lib内,但是最后发现问题的关键在于:动态链接库需要具有x权限
上网查了很多资料,都是说动态链接库只要有r权限就够了,可能是由于kernel版本比较低所以存在的问题吧。
之前编译ntp库执行时的错误大概也是由此而来。但是既然小程序能完成这件事,何必用牛刀呢~
这里附带写一下这个问题是怎么最终发现的。首先使用系统自带的 "readelf -l xxxx/readelf -d xxxx"命令查看动态编译的程序需要哪些.so文件。发现我都已经放在/lib下了。又采用静态编译编译程序,发现问题消失。最后是在看/lib下文件时,使用ls命令发现有的.so文件是粗体的,有的是细的,查看详细信息后发现粗体的是具有-x权限的,所以把所有的.so文件打包时,就加上了执行权限,最终解决了这一问题。
ps:新塘N32926是采用动态链接库打包成一个bin文件,在启动时挂载到/lib下实现的。所以文件在打包时就要具有-x权限。
ps:非得采用动态编译的原因有二,一是我一定要弄明白为什么动态运行过不去,二是sdk默认只分配了25M用于储存系统,静态编译出来的文件太大了。

3.改变时区

编译完成后,发现和北京时间有8小时的时差。很明显这是时区的问题。因此查阅了一些资料,有两种解决方案。一是

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

然而根本没有这个文件。最后采用了在/etc/profile中添加TZ环境变量的方法。
在/etc/profile中(对于该板子,由于系统最终是打包成一个完整的bin文件的,所以需要在sdk的rootfs下找到这个文件,修改后再生成kernel)添加

TZ=UTC-08:00  #设置为东8区
export TZ

最后再同步一下时间,问题解决,功能完美实现。
[1]: 嵌入式Linux中时区的修改

相关标签: 嵌入式开发