最近一个项目中需要在VxWorks下使用一个高精度实时时钟,要求精度为1ms,溢 出时间大于5小时。VxWorks提供系统时钟,该时钟在操作系统启动后开始计数,精度为1个tick,可以通过tickGet()获取当前计数值。因为 系统时钟默认工作频率为60Hz,则1个tick相当于16.7ms,不符号我们的精度要求。虽然可以通过sysClkRateSet(1000),把精度提高到1ms,但1kHz的系统时钟中断频率会使得CPU的开销大增。考虑到像nanoSleep()这样的应用其计时精度可以达到纳秒级,CPU中肯定有相应的ns级的时钟提供。项目使用的硬件平台为PC104,处理器为300MHz X86兼容CPU,在VxWorks函数手册(vxworks_os_libraries_api_reference)中察看CPU相关的函数库,果然在pentiumALib.h中找到pentiumTscGet32()、pentiumTscGet64()、pentiumTscReset() 这3个API可以对CPU中内建的TSC进行操作。TSC即Time Stamp Counter,为Pentium系列CPU提供的64位时戳计数器,该计数器在CPU上电或复位后每个指令周期计数一次,Intel保证TSC的溢出周 期大于10年。像我们使用的300MHz的CPU,其TSC精度约为33ns,溢出周期约为19303年,这完全符合我们项目的要求。

但令人faint的 是,在downloadable project中包括了pentiumALib.h这个头文件后项目竟然不能编译通过!无奈之下仔细察看手册中对TSC相关函数的说明,手册曰:这三个函数都是通过汇编实现的,要读TSC寄存器只需使用RDTSC这条指令,它会将TSC的当前值低32位放入EAX寄存器,高32位放入EDX寄存器。那我岂不只要在我的应用程序中插入这么一段汇编就可以了,关键是怎么在VxWorks下使用C语言跟汇编混合编程呢?还好以前看过一点《Linux内核源代码情景分析》,在上册的第一章中就有关于GCC中C语言汇编混合编程的介绍,而VxWorks使用的编译器正是GCC!

那不妨就来试一试吧,于是有了下面的代码:

  1. /*****************getTsc - Get TSC count*************************************
  2. 获取TSC(时戳计数器)计数值,将计数器高位存入pHi,低位存入pLo** RETURNS: N/A
  3. ****************************************************************************/
  4. void getTsc(unsigned int *pHi, unsigned int *pLo)
  5. {
  6. unsigned int hi, lo;
  7. __asm__ __volatile__("rdtsc\n movl %%eax, %0\n movl %%edx, %1":"=b"(lo),"=c"(hi)::"memory");
  8. *pHi = hi;
  9. *pLo = lo;
  10. }
  11. /****************getTsc - Get the lower half of TSC count***************
  12. 获取TSC(时戳计数器)低32位计数值** RETURNS: TSC低32位计数值
  13. ***********************************************************************/
  14. unsigned int getTsc32(void)
  15. {
  16. unsigned int tmp;
  17. __asm__ __volatile__("rdtsc\n movl %%edx, %0":"=c"(tmp)::"memory");
  18. return tmp;
  19. }

如果使用PowerPC平台,PowerPC提供的TB(Time Base)寄存器类似于Pentium的TSC,VxALib中提供vxTimeBaseSet() 和 vxTimeBaseGet()两个函数来对TB寄存器进行读写操作。

【转】VxWorks中高精度实时时钟的实现及C语言汇编混合编程的更多相关文章

  1. 实时时钟、系统时钟和CPU时钟的区别

    http://blog.sina.com.cn/s/blog_68f909c30100pli7.html 实时时钟:RTC时钟,用于提供年.月.日.时.分.秒和星期等的实时时间信息,由后备电池供电,当 ...

  2. 第43章 RTC—实时时钟

    第43章     RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...

  3. 第43章 RTC—实时时钟—零死角玩转STM32-F429系列

    第43章     RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...

  4. Maxim实时时钟芯片设计指南5791-关于编写健壮的实时时钟控制代码的提示

    用DS12C887设计一个万年历,虽然反复查看说明书,还是出各种的错误. 因此,从美信官网查询资料,翻译的不太通,凑合着对照看. 原文链接 Tips for Writing Bulletproof R ...

  5. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  7. RTC实时时钟

    作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...

  8. stm32——RTC实时时钟

    stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...

  9. I2C实时时钟rx-8025板卡实际应用

    rx-8025是片外I2C实时时钟,其应用于9260板卡方法如下.总体思想是配置内核添加驱动(I2C驱动,内核已提供的很完备),板级文件添加设备,添加设备文件以应用程序操作. 1. 配置内核 1)I2 ...

随机推荐

  1. pytest 学习笔记一:参数化与组织分层

    组织分层: 1.普通方式,和unittest分层类似: setup_module()  # 通常放在类外 setup_class(cls) setup(self) teardown(self) tea ...

  2. java面试题:分布式

    分布式分为分布式缓存(Redis).分布式锁(Redis或Zookeeper).分布式服务(Dubbo或SpringCloud).分布式服务协调(Zookeeper).分布式消息队列(Kafka.Ra ...

  3. PAT1021(dfs 连通分量)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  4. mybatis知识点(已掌握)

    1.${} 和 #{} 的区别? ${} 直接显示传入数据,不能防止sql注入,一般用于传数据库对象(比如表名). #{} 传入数据被当成字符串,自动加上双引号,防止sql注入. 2.有哪些Execu ...

  5. Java自学之路(小白向)

    首先学习一门语言无非就受教与自学两种方式,本博文针对自学(穷逼没钱报班,大学又不是计算机专业,只能自学啊) 开个玩笑,其实有很多人是适合自学的,下面介绍. 一.要充满自信我自己就可以学好(够面试用的入 ...

  6. TZOJ 3295 括号序列(区间DP)

    描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[( ...

  7. load balancer does not have available server for client: provider

    Ask Question up vote6down votefavorite 4 I'm trying to use Feign client. Below is my feing client: i ...

  8. 使用HttpClient 传送form 表单的请求

    在项目中用到了,需要使用HttpClient 进行模拟表单传送form 表单的需求,在平常的项目中,大概都是传送json串的样式需求,但是如何才能给对应的服务器传送一个form 表单呢? 这就需要了N ...

  9. 一分钟了解mongodb(转)

    mongo的由来 截取自英文俚语humongous,意为”巨大的”,是否表明mongodb在设计之初就是为大数据量处理而生呢? mongodb是个啥 mongodb是个可扩展.高性能.开源.面向文档( ...

  10. 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量

    原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为   aB , 驼峰命名就可以了.