嵌入式linux 时间同步,解决嵌入式Linux中的时区问题

如果说让我做上层软件的工作,我做起来可以得心应手,但是让我做平台方面的工作(系统问题解决、驱动编写、软件移植等工作),确实不熟悉。所以很多问题都是摸着石头过河,没有经验。许多问题在有经验的朋友那里是小菜一碟,而放在我面前总是如遇大山。不免被嘲笑为“弱鸡”~

最近我在做基于 Realtek 芯片RTL8196E的家庭网关的研发工作。Realtek提供了一个Linux的SDK开发环境。由于硬件上没有RTC,所以其中Linux的系统(下面简称为RTLinux)时钟是不正确的。需要时间同步。这个我从busybox中集成了ntpd便可。但是,我发现就算是同步好了时间,在执行 date 命令输出的时间时区都不对。

我在网上找了许多Linux系统设置时区的办法。从部分是:将 /usr/share/zoneinfo/Asia/Shanghai 符号链接为 /etc/localtime 便可。我在自己的PC机Linux(下面简称为PCLinux)上尝试,果然奏效。而同样的方法运用到 RTLinux 却没有一点效果。

这是博主想抱怨两句:网上找到的资料大多是告诉你怎么怎么去做就能达到什么目标,而没有说明为什么要这么做,它内在的原理是什么。如果不知道为什么,那么一旦发生一点变化,就无法变通了。

经博主研究,解决上面问题的办法有两种:

设置 /etc/TZ 文件,在该文件中指明时区

设置 TZ 环境变量

若读者不想深究其原因,那后面的内容便不必再看了。

博主先是发现了 /etc/TZ 这个文件看似时区的意思,其内容为: PST8PDT7,不知道是什么意思。尝试改改它。

到busybox里去找找 "/etc/TZ",看是谁,是怎么实用这个文件的。没有找到相关的引用。

到Linux内核中去找。也没有~

到boards中去找。结果找到:

1b32e5b60579053fa4c6edb5f8f6c798.png

可以看出是在 romfs/lib/libc.so.0 库文件里的。

而这个库文件则是由toolchain的工具集中复制得来。

于是再到toolchain下去找,结果有很多:

1e7a7e3c0d342c8b1279ee1042d65b4e.png

这时区的问题原来是由uclibc来决定的。

去看看uclibc/libc/misc/time/time.c中是怎么解决 /etc/TZ 文件的。

3cf127b6f0bdc92c358b9570ef321bac.png

read_TZ_file()函数从 __UCLIBC_TZ_FILE_PATH__宏所(值为"/etc/TZ")指文件中读取数据。

在 _time_tzset(int use_old_rules) 中设置时区。

大致过程:

e = getenv("TZ");

if ((!e && !(e = read_TZ_file(buf))) || !*e) {

//!ERROR

}

可见,e先是从环境变量中去读,如果没有再从 /etc/TZ 中去读‍‍,‍‍这就是我们想要的原理。

接下来就是一大推解析相关的处理。这个我就不花时间去研究这个过程了,主要去看一下有没有相关的说明文档。

bbade503ecf1201f9f5852741d687d4a.png

09cb06b1438b5d6b809ede5a855b6425.png

OK,我全明白了。 如果是在中国,那么就应该将变量设置成:"CST-8",试试看:

0d5f20f2fe6e72b317fbbe688fa6d73a.png

成功!

现在有两种方案:

直接到时区信息写到 /etc/TZ 文件

在系统启动时,设置环境变量 TZ

这两者都可以做。我们先默认在 /etc/TZ 文件中写入 "CST-8"

问题解决!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj2243

2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6753 Solved: 2496[Submit][Status][Discuss]Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点…

eclipse linux windows 乱码,Ubuntu下Eclipse打开Windows下的工程文件乱码解决办法

Eclipse在Windows下默认使用的是GBK(包括GB2312)编码,而在Linux系统默认使用的是UTF-8编码,并且eclipse编码设置下拉列表不提供GBK编码可选项。如果eclipse打开工程或者文本乱码,基本可以肯定(因为常用的就这两种)这个工程/文本使用的是GBK编…

linux桌面旋转了180度,[多图]回顾每一款默认Ubuntu壁纸

每个默认的Ubuntu壁纸Ubuntu 4.10’Warty Warthog’当人们抱怨Ubuntu发行版中的“ 褐色 ”时,我经常想回到Ubuntu的第一张墙纸,以便他们的意见可以转变为“上下文”。事后看来,这只墙纸完全是一块毫无生气的带有徽标的棕色块。当然&#xff0…

【转】Apache 配置虚拟主机三种方式

Apache 配置虚拟主机三种方式 原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html一、基于IP 1. 假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP: [rootlocalhost root]# ifconfig eth0:1 1…

linux weblogic 防火墙,本地访问weblogic控制台无反应,关闭linux操作系统防火墙

有时候,我们在Linux操作系统上成功启动了weblogic,也查看了7001端口的状态是开启的。但是访问weblogic控制台没有反应,也没有报错。使用 netstat -ano | grep 7001 查看端口的状态可是访问weblogic控制台,还是没有反应。我们在本地…

fedora linux搜狗输入法,在Fedora 28系统下安装搜狗输入法

以下介绍在Fedora 28系统下安装搜狗输入法,也适用在Fedora 27下的安装,亲测可以。先声明一下,在Fedora 27及以后版本中出现的输入框候选词界面变形但不影响使用。第一步:安装fzug软件源具体方法如下:1.添加 FZUG 源Fed…

linux reboot命 过程,IDRAC安装dell服务器操作系统(linux or windows),用到生命周期管理器...

1、首先给服务器装上idrac模块,然后给idrac配置一个远程IP,用作管理2、在web界面输入IP,弹出以下界面,输入账号密码登录3、认证成功后,点击虚拟控制台启动4、进入如下界面,点击菜单栏的《虚拟介质》&#x…

DroidPlugin插件化开发

360手机助手使用的 DroidPlugin,它是360手机助手团队在Android系统上实现了一种插件机制。它可以在无需安装、修改的情况下运行APK文件,此机制对改进大型APP的架构,实现多团队协作开发具有一定的好处。 它是一种新的插件机制,一种免安装的运行…

io wait linux,另辟蹊径-诊断工具之 IO wait

导读最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端、本机都没问题,但是没想到上了第二份日志之后,问题来了:1、问题:集群中的某台机器 top 看到负载巨高,集群…

Oracle第二天

Oracle第二天 整体安排(3天) 第一天:Oracle的安装配置(服务端和客户端),SQL增强(单表查询)。 第二天:SQL增强(多表查询、子查询、伪列-分页)&…

linux搭建虚拟化平台报告,部署KVM虚拟化平台------搭建(示例代码)

一 、部署KVM虚拟化平台hyper-v是windows中的虚拟化1、KVM模块直接整合在Linux内核中,kvm是内核模块,虚拟机与kvm模块之间为管理工具2、KVM组成1.KVM Driver---虚拟机创建---虚拟机内存分配---虚拟CPU寄存器读写---虚拟CPU运行2.QEMU (经过简化与修改)--…

linux 选择文件指定的行数据类型,06练习题

1.如何删除一个非空子目录/tmp? BA. del /tmp/*B. rm -rf /tmpC. rm -Ra /tmp/*D. rm -rf /tmp/*2.存放linux默认系统日志文件是 BA./var/log/dmesg #系统启动时日志B./var/log/messages #系统日志C./var/log/secure #登录相关 安全3.用命令ls -l显示出来文件txt的描…

C#多线程编程

C#多线程编程 一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程…

《DSP using MATLAB 》示例Example6.3

代码: C0 0; B1 [2 4; 3 1]; A1 [1 1 0.9; 1 0.4 -0.4]; B2 [0.5 0.7; 1.5 2.5; 0.8 1]; A2 [1 -1 0.8; 1 0.5 0.5; 1 0 -0.5]; [b1, a1] par2dir(C0, B1, A1)[b2, a2] par2dir(C0, B2, A2)b conv(b1, b2) % Overall direct form numerator a conv(a1…

简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明

学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成…

java入门,学习笔记

编译 通过javac编译java程序,会编译出一个后缀为class的文件,我们再通过java虚拟机(jvm)执行编译后的java程序。 在java中始终有一个main函数,它作为程序的入口,程序从这个入口开始执行一直到结束。 public…

linux命令之ifconfig详细解释

依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置。 1.命令格式: ifconfig [网络设备] [参数] 2.命令功能: ifconfig 命令用来查看和配置网…

loadrunner controller:实时查看VUser的运行情况

1) 如下图,在Run标签页,点击“Vusers...”打开Vuser窗口; 2) 如下图选中一个Vuser点击按钮可以打开Run-Time Viewer窗口,RTV窗口页面显示的就是该Vuser当前的操作; 3) 如下图所示,…

【二色汉诺塔 】

/* 二色汉诺塔 */#include <stdio.h>void hanoi(int disks, char sources, char temp, char target) {if(disks 1){printf("move disk from %c to %c \n", sources, target);printf("move disk from %c to %c \n", sources, target);}else{hanoi(d…

c语言凸包算法,基于C语言的凸包算法实现

基于C语言的凸包算法实现非计算机专业&#xff0c;代码有些的不好的地方&#xff0c;大佬轻喷^ _ ^根据要求&#xff0c;需要使用C语言实现凸包算法——Graham扫描法&#xff0c;本文将从算法理解、实现思路、遇到的问题及其解决方案三个方面来阐述实现过程。算法理解凸包算法G…