【转】VxWorks中高精度实时时钟的实现及C语言汇编混合编程

最近一个项目中需要在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寄存器进行读写操作。

时间: 2024-10-07 12:24:15

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

STM32F4学习笔记10——RTC实时时钟

RTC实时时钟 实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器.RTC 提供一个日历时钟.两个可编程 闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志.RTC 还包含用于管理低功耗模 式的自动唤醒单元. 两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒.分钟.小时(12 或 24 小时制).星 期几.日期.月份和年份.此外,还可提供二进制格式的亚秒值. 系统可以自动将月份的天数补偿为 28.29(闰年).30 和 31 天.并且还可以进行夏令时 补偿. 其它 32 位寄

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

http://blog.sina.com.cn/s/blog_68f909c30100pli7.html 实时时钟:RTC时钟,用于提供年.月.日.时.分.秒和星期等的实时时间信息,由后备电池供电,当你晚上关闭系统和早上开启系统时,RTC仍然会保持正确的时间和日期. 系统时钟:是一个存储于系统内存中的逻辑时钟.用于系统的计算,比如超时产生的中断异常,超时计算就是由系统时钟计算的.这种时钟在系统掉电或重新启动时每次会被清除. CPU时钟:即CPU的频率,当然这里的时钟频率指的是工作频率,即外频,还

第43章 RTC—实时时钟

第43章     RTC-实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 43.1 RTC简介 RTC-real time clock,实时时钟,主要包含日历.闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多.日历包含两个32bit的时间寄存器,可直接输出时分秒,星期.月.日.年.比起F103系列的RTC只能输出秒中断,剩下的其他时间需要软件来实现,429的

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

用DS12C887设计一个万年历,虽然反复查看说明书,还是出各种的错误. 因此,从美信官网查询资料,翻译的不太通,凑合着对照看. 原文链接 Tips for Writing Bulletproof Real-Time Clock Control Code 关于编写健壮的实时时钟控制代码的提示 摘要 : With the use of proper device initialization and code sequencing, accurate timekeeping and clock a

Arduino I2C + DS1307实时时钟

主要特性 DS1307是Maxim的串行.I2C实时时钟芯片.主要特性有: 工作电压:主电源电压4.5~5.5V,电池电压2.0~3.5V 功耗:电池供电.备份模式时<500nA 接口:I2C,最大速率100kbps 可编程方波输出 电源自动切换.失效检测 内置56字节大小.支持电池备份的RAM 管脚定义 X1.X2: 接32.768kHz晶体,要求晶体负载电容12.5pF Vcc:主电源,范围4.5~5.5V.当需要对DS1307读写时,需要接Vcc. VBAT:接电池,范围2.0~3.5V.

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

rx-8025是片外I2C实时时钟,其应用于9260板卡方法如下.总体思想是配置内核添加驱动(I2C驱动,内核已提供的很完备),板级文件添加设备,添加设备文件以应用程序操作. 1. 配置内核 1)I2C支持(可选择debug信息). 2)I2Chw选择gpio作为I2C硬件. 3)不选择片上RTT,选择芯片RX-8025. 其中rtc0为设备启动时钟. 2. 添加设备 /arch/arm/mach-at91/board-sam9260ek.c中添加以下语句:static struct i2c_b

STM32学习笔记10(实时时钟RTC)

对于单片机转ARM的同学来说,RTC可能比较少接触.提到实时时钟,更经常想到的是DS1302.当然,在STM32里,自己一个CPU已经足够,不需要DS1302. 实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器.因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据.我们在本期教程中将详细讲述RTC原理及例程,以引导大家顺利进入RTC的世界. 1.STM32的RTC模块 RTC模块之所以具有实时时钟功能,是因为它内部维

RTC实时时钟驱动

RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去. RTC通过STRB/LDRB这两个ARM指令向CPU传送8位数据(BCD码).数据包括秒,分,小时,日期,天,月和年.RTC实时时钟依靠一个外部的32.768Khz的石英晶体,产生周期性的脉冲信号.每一个信号到来时,计数器就加1,通过这种方式,完成计时功能. RTC实时时钟有如下一些特性: 1,BCD数据:这些数据包括秒.分.小时.日期..星期几.

RTC实时时钟

作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电).它的外围也不需要太多的辅助电 路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图10-8所示. 图10-8 RTC外接电路 1.2 RTC控制器 实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作.RTC 可以通过STRB/LDRB