sylixos下移植glib时clock_gettime函数分析

author author     2022-10-03     714

关键词:

1. 问题分析

      移植glib中间件时,运行测试用例出现异常错误,定位问题为g_clock_gettime函数获取的时间和系统API获取的时间不一致导致。

      glib中间件中g_get_monotonic_time函数原型如程序清单 1.1所示。

程序清单1.1  g_clock_gettime函数原型

gint64  g_get_monotonic_time (void)
{
  struct timespec ts;
  gint result;

  result = clock_gettime (CLOCK_MONOTONIC, &ts);

  if G_UNLIKELY (result != 0)
     g_error ("GLib requires working CLOCK_MONOTONIC");

  return (((gint64) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000);
}

      经过分析,g_get_monotonic_time函数调用clock_gettime函数且传入的参数为CLOCK_MONOTONIC。

      SylixOS下在阻塞等待等操作获取时间时调用clock_gettime函数且传入的参数为CLOCK_REALTIME,所以导致glib中获取的时间和SylixOS获取的时间不一致,出现上述的问题。

2. 实现原理

      SylixOS下clock_getime函数实现如程序清单2.1所示。

程序清单  2.1  

__LW_RETU_FUNC_DEFINE(int, clock_gettime,
                      (clockid_t  clockid, struct timespec  *tv),
                      (clockid, tv))

      SylixOS下clock_gettime函数调用lib_clock_gettime函数,其函数原型为:

INT  lib_clock_gettime (clockid_t  clockid, struct timespec  *tv)

     函数lib_clock_gettime原型分析:

  • 函数执行成功返回ERROR_NONE,执行失败置错误码并返回PX_ERROR;

  •  参数clockid为获取时间模式;

  •  参数tv获取时间结构体;

     SylixOS提供四种获取时间模式,如表 2.1所示。

                                                                                 表2.1  获取时间模式

CLOCK_REALTIME

系统实时时间,随系统实时时间改变而改变,中间时刻如果系统时间被用户改动,则对应的时间相应改变

CLOCK_MONOTONIC

从系统启动开始计时,不受系统时间被用户改变的影响

CLOCK_PROCESS_CPUTIME_ID

系统CPU从本进程到当前代码花费的时间

CLOCK_THREAD_CPUTIME_ID

系统CPU从本线程到当前代码花费的时间

3. 测试用例

      测试程序代码如程序清单 3.1所示。

程序清单 3.1  获取时间示例

#include <stdio.h>
#include <time.h>

int  main (int  argc, char  **argv)
{
    struct timespec tv = {0, 0};

    clock_gettime(CLOCK_REALTIME, &tv);
    printf("CLOCK_REALTIME : %llu 
", tv.tv_sec * 1000 + tv.tv_nsec / 1000000);

    clock_gettime(CLOCK_MONOTONIC, &tv);
    printf("CLOCK_MONOTONIC : %llu 
", tv.tv_sec * 1000 + tv.tv_nsec / 1000000);

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tv);
    printf("CLOCK_PROCESS_CPUTIME_ID : %llu 
", 
           tv.tv_sec * 1000 + tv.tv_nsec / 1000000);

    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tv);
    printf("CLOCK_THREAD_CPUTIME_ID : %llu 
", 
            tv.tv_sec * 1000 + tv.tv_nsec / 1000000);

    return  0;
}

      如程序清单 3.1所示,测试用例中通过clock_gettime函数分别获取四种模式下的时间,在模拟器上运行测试程序,运行结果如下:

[[email protected]:/apps/test]# ./test
CLOCK_REALTIME : 946846519684
CLOCK_MONOTONIC : 161719686
CLOCK_PROCESS_CPUTIME_ID : 147
CLOCK_THREAD_CPUTIME_ID : 157


vxworks驱动移植至sylixos总结(代码片段)

本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现。1.驱动注册与初始化1.1VxWorks中驱动注册与初始化1.1.1初始化函数VxWorks中大部分函数使用了VxWorks的VxBus结构,对于基于VxBus... 查看详情

通过curl下载文件

1.适用范围   本文档介绍SylixOS下通过curl中间下载文件的流程,使用者应熟悉SylixOS系统以及curl中间件。2.下载流程2.1 资源准备  文件下载依赖curl中间件,故下载前需基于SylixOS进行curl中间件移植,移植过程... 查看详情

移植eigen库到sylixos下及使用方法

1.开发环境宿主机:Windows7 集成开发环境:Real-EvoIDE3.5.3 虚拟机:Ubuntu 目标机:x862.Eigen简介Eigen是一个提供了线性代数、矩阵、向量操作等运算的C++库,其中包含了很多算法。Eigen的License是MPL2,支持多平台。 Eigen... 查看详情

sylixos音频驱动移植

...文档为实现Nuc970平台音频驱动的方法总结,以此提供一些SylixOS音频驱动移植方法的参考。2.原理概述2.1 Codec编解码芯片  声音信号分为模拟信号和数字信号,Codec编解码芯片主要功能就是实现模拟信号与数字信号的互... 查看详情

sylixos标准工程移植到lite版本

...理器(如ARMM系列处理器)的开发工作,翼辉信息推出了SylixOSLite工程版本。SylixOSLite版本工程属于SylixOS轻量级工程,与标准的SylixOS工程相比裁剪掉部分功能(如GDB调试、虚拟内存管理、动态装载、部分网络功能等)。  ... 查看详情

移植libffi到sylixos

1.开发环境宿主机:Windows7集成开发环境:Real-EvoIDE3.2.5虚拟机:Ubuntu14.04本篇仅介绍libffi库的移植过程,包括资源的获取,工程文件的修改以及编译出错处理。移植后的libffi支持ARM、MIPS、PowerPC和x86平台,本文档以x86平台为例进行... 查看详情

sylixos下基于zynq-7000加载fpga程序

1、概述本文主要介绍SylixOS下基于Zynq-7000平台加载FPGA程序的方法,该方法使用的是Zynq-7000的devcfg功能模块(DeviceConfigurationInterface),该模块支持系统启动后进行FPGA程序的在线加载。2、使用方法介绍2.1工程所在目录devcfg驱动模块... 查看详情

移植libnopoll到sylixos技术笔记

1.开发环境    宿主机:windows7    集成开发环境:Real-EvoIDE3.1.5    虚拟机:ubuntu    目标机:mini2440本篇仅介绍nopoll库的移植过程,包括资源的获取,工程文件的修改以及... 查看详情

可移植地在 autoconf/automake 中包含 GLib 标头

】可移植地在autoconf/automake中包含GLib标头【英文标题】:PortablyincludeGLibheadersinautoconf/automake【发布时间】:2010-12-1612:16:40【问题描述】:我需要为使用基于autoconf的系统构建的项目包含GLib标头以实现可移植性。如何以可移植的方... 查看详情

vxworks工程移植到sylixos应用笔记

...用户在RealEvo-IDE开发环境中移植Vxworks应用程序,并部署到SylixOS操作系统上运行,使用到的开发工具为RealEvo-IDE集成开发环境。2.准备工作2.1环境准备在使用之前,须安装有翼辉信息开发的集成开发套件,由于系统上安装的防火墙... 查看详情

gstreamer移植qnx:交叉编译glib(代码片段)

...streamer的依赖库,也就是说最终目标,是将gstreamer移植到QNX6.6系统上。我选择的是gstreamer1.16,他需要的glib版本是2.40以上,因此就索性使用最新的glib版本。编译用的host系统是Ubu 查看详情

sylixos基于nuc970平台的sd驱动移植

...  本文档为实现Nuc970平台的SD驱动总结,提供一些SylixOSSD驱动移植方法的参考。2.原理概述2.1 控制器类型  SD控制器有两种类型,分为SD标准控制器(SDHCI)和SD非标准控制器。  SylixOSBase代码中实现了SDHCI的驱... 查看详情

sylixos启动读取配置文件

1概述  SylixOS启动时会加载环境变量配置文件profile,网络配置文件ifparam.ini以及系统启动脚本startup.sh。2环境变量配置文件profile   SylixOS启动时会执行varload命令,该命令的作用是从系统/etc/profile文件中读取环境变量... 查看详情

sylixos普通定时器精度分析

1.适用范围   SylixOS下实现高精度定时器和普通定时器功能,本文档介绍普通定时器的精度问题,适用于SylixOS开发工程师,使用者应具备SylixOS基础知识以及基本编程能力。2.实现原理   SylixOS下在应用层创建... 查看详情

sylixos下dbus替换方案

1.1SylixOS下替换原理    上一篇博客中介绍了DBUS通信原理以及常用函数接口,本文档介绍SylixOS下DBUS功能替换方案。   SylixOS有多种进程间通信方法,可以实现类DBUS的进程间通信功能。根据DBUS通信原理,Sy... 查看详情

sylixos上ethercat实现

...mpleOpenSourceEtherCATMaster)和EtherLab的theIgHEtherCAT&reg;Master,SylixOS对两者都支持。其中IgH作为常用的EtherCAT开源协议栈,SylixOS已移植支持。 2SylixOS-IgH使用框架 &nbs 查看详情

sylixos的system使用

1.适用范围SylixOS是一款为大型嵌入式系统设计的硬实时系统,支持使用system调用执行命令。SylixOS为了保证实时性在system的实现上和Linux有所差别,本文着重介绍SylixOS如何实现system和在使用system时需要注意的事项。2.原理介绍SylixO... 查看详情

sylixoswrite0字节问题

1问题描述在移植中间件过程中,在SylixOS调用write函数写入0字节的数据到文件中时,会导致对应的中间件测试用例失败,失败的原因是文件系统中的write函数在Linux系统和SylixOS有区别,两种实现的差别如下。2write函数的实现机制2.... 查看详情