打印
[技术问答]

【转载】新塘N32926 实现时间同步

[复制链接]
365|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LM莫|  楼主 | 2020-3-29 15:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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


使用特权

评论回复
沙发
LM莫|  楼主 | 2020-3-29 15:27 | 只看该作者
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用于储存系统,静态编译出来的文件太大了。

使用特权

评论回复
板凳
LM莫|  楼主 | 2020-3-29 15:28 | 只看该作者
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

最后再同步一下时间,问题解决,功能完美实现。


使用特权

评论回复
地板
huangcunxiake| | 2020-3-29 15:29 | 只看该作者
时间服务器?

使用特权

评论回复
5
磨砂| | 2020-4-6 15:51 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
6
晓伍| | 2020-4-6 15:51 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
八层楼| | 2020-4-6 15:51 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
观海| | 2020-4-6 15:52 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
guanjiaer| | 2020-4-6 15:54 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

447

帖子

3

粉丝