VxWorks中高精度实时时钟的实现及C语言汇编混合编程
来源:互联网 发布:网络脱口秀主持人 编辑:程序博客网 时间:2024/06/08 09:04
最近一个项目中需要在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中找到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中包括了pentiumLib.h这个头文件后项目竟然不能编译通过!无奈之下仔细察看手册中对TSC相关函数的说明,手册曰:这三个函数都是通过汇编实现的,要读TSC寄存器只需使用RDTSC这条指令,它会将TSC的当前值低32位放入EAX寄存器,高32位放入EDX寄存器。那我岂不只要在我的应用程序中插入这么一段汇编就可以了,关键是怎么在VxWorks下使用C语言跟汇编混合编程呢?
还好以前看过一点《Linux内核源代码情景分析》,在上册的第一章中就有关于GCC中C语言汇编混合编程的介绍,而VxWorks使用的编译器正是GCC!那不妨就来试一试吧,于是有了下面的代码:
/**************************************************************************
*
* getTsc - Get TSC count
*
* 获取TSC(时戳计数器)计数值,将计数器高位存入pHi,低位存入pLo
*
* RETURNS: N/A
*/
void getTsc(unsigned int *pHi, unsigned int *pLo)
{
unsigned int hi, lo;
__asm__ __volatile__(
"rdtsc/n
movl %%eax, %0/n
movl %%edx, %1"
:"=b"(lo),"=c"(hi)
:
:"memory"
);
*pHi = hi;
*pLo = lo;
}
/**************************************************************************
*
* getTsc - Get the lower half of TSC count
*
* 获取TSC(时戳计数器)低32位计数值
*
* RETURNS: TSC低32位计数值
*/
unsigned int getTsc32(void)
{
unsigned int tmp;
__asm__ __volatile__(
"rdtsc/n
movl %%edx, %0"
:"=c"(tmp)
:
:"memory"
);
return tmp;
}
如果使用PowerPC平台,PowerPC提供的TB(Time Base)寄存器类似于Pentium的TSC,VxALib中提供vxTimeBaseSet() 和 vxTimeBaseGet()两个函数来对TB寄存器进行读写操作。(感谢柏飞电子的FZZ提供PowrPC方面的技术支持!)
- VxWorks中高精度实时时钟的实现及C语言汇编混合编程
- VxWorks中高精度实时时钟的实现及C语言汇编混合编程
- 汇编C语言混合编程
- C/汇编的混合编程
- C/汇编的混合编程
- c/汇编的混合编程
- C/汇编的混合编程
- c语言与汇编的混合编程代码
- C语言与汇编混合编程
- C语言与汇编混合编程
- C语言和汇编混合编程
- 汇编与C的混合编程(数字振荡器的实现)
- C和汇编混合编程及示例
- ARM汇编, C语言和汇编混合编程
- C 汇编混合编程
- 【实验】Arm汇编和C语言混合编程实验
- 5种语言混合编程:C++、JS、python、Lisp、汇编
- 如何在64位的linux系统上使用汇编和C语言混合编程
- 08年TODO List -- 贵在坚持
- 51日记5
- C 语言中的指针和内存泄漏
- 20080117 - FE足球队总结及新年展望
- 基于 GTK+ 和 X-window 的 GUI 在嵌入式 Linux 中的应用
- VxWorks中高精度实时时钟的实现及C语言汇编混合编程
- nekohtml的简单使用
- VC++指南
- 访问 IIS 元数据库失败 -入门问题
- 内存管理
- oracle数据库主要命令
- 在VC中使用ADO开发数据库应用程序
- 前两天才发现C#中的 控件一个不可替代的功用。
- Microsoft.NET Framework 全面开源