标准C如何实现高精度定时器

puyoupuyou90 2009-08-26 11:33:04
RT,我需要在执行outportb()后delay一段时间以满足一定的IO时序,需要精确到1us,如何实现?
...全文
341 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyfanta 2009-08-27
  • 打赏
  • 举报
回复
嵌入式系统上倒是经常写,一般都是用定时器,不知道PC上怎么实现……
zxg623 2009-08-27
  • 打赏
  • 举报
回复
还是用硬中断来实现
puyoupuyou90 2009-08-27
  • 打赏
  • 举报
回复
2楼所说的计算一条汇编指令消耗的时间t ,如何计算啊,我用示波器测过执行outportb()写一个H和L所用时间也不相同,而且第一次执行这个函数和再次执行所用的时间也不一样,IO上操作时序必须非常严格,现在只能靠设置不同的参数达到IO时序,只靠while循环达到延迟,要是用中断我应该怎么实现?
jackyjkchen 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 newjerryj 的回复:]
引用楼主 puyoupuyou 的回复:
RT,我需要在执行outportb()后delay一段时间以满足一定的IO时序,需要精确到1us,如何实现?


用GetTickCount()这个API,可以精确到微秒级别

GetTickCount

The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.


DWORD GetTickCount(void);


[/Quote]

我用过这个。15ms精度……
NewJerryj 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 puyoupuyou 的回复:]
RT,我需要在执行outportb()后delay一段时间以满足一定的IO时序,需要精确到1us,如何实现?
[/Quote]

用GetTickCount()这个API,可以精确到微秒级别

GetTickCount

The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.


DWORD GetTickCount(void);

大熊猫侯佩 2009-08-27
  • 打赏
  • 举报
回复
虽然话如此,但须具体情况具体对待:
http://www.programbbs.com/doc/305.htm
银河里游方舟 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zxg623 的回复:]
还是用硬中断来实现
[/Quote]
up
fly_new 2009-08-27
  • 打赏
  • 举报
回复
告诉你软件基本很难,无论目前哪个系统。
另外,用汇编来延迟的话(每个汇编语句的执行时间手册商可以查到),如果你的系统代cache活处理器带流水线,那延迟不准确。
2009-08-27
  • 打赏
  • 举报
回复
用 RDTSC 指令试试?可以直接读取硬件时钟。DOS 下这种东西应该挺好用的。
bo.cui 2009-08-27
  • 打赏
  • 举报
回复
基本无法做到太精准。。

这个 我一般就是用
计算一条汇编指令消耗的时间t 的方法完成。 好想也没什么更好的选择。。

首先,关闭所有中断。
然后开始循环N次,N的计算方式一般就是看CUP时钟频率了。 比如24MHZ的,那么你自己算个N出来
然后开中断。

或者用clock函数,这个系统计时器,也还行。
fenglinqiu 2009-08-27
  • 打赏
  • 举报
回复
看看
yangyunzhao 2009-08-27
  • 打赏
  • 举报
回复
估计不可能吧,DOS本身就不是实时系统。
我觉得这个是系统的问题,从语言角度无法入手吧。
[Quote=引用 12 楼 puyoupuyou 的回复:]
GetTickCount()这个函数不行 他的最小单位是ms 我要求到us级的,而且是在DOS下运行,谁知道硬件中断怎么实现啊
[/Quote]
draculamx 2009-08-27
  • 打赏
  • 举报
回复
硬件中断。。
岂不是要靠驱动程序来实现。。。。

软件定时,要达到微妙级,确实有点难度,你必须熟知你硬件的操作时间。。。
yzhyyyyc 2009-08-27
  • 打赏
  • 举报
回复
clock()可以吗。。。clock(),CLOCKS_PER_SEC...
puyoupuyou90 2009-08-27
  • 打赏
  • 举报
回复
GetTickCount()这个函数不行 他的最小单位是ms 我要求到us级的,而且是在DOS下运行,谁知道硬件中断怎么实现啊
jackyjkchen 2009-08-26
  • 打赏
  • 举报
回复
QueryPerformanceCounter();
QueryPerformanceFrequency();
这两个api精度就很高,但1us貌似达不到,你的条件苛刻了点,我感觉都有点硬件层的感觉
gnuser 2009-08-26
  • 打赏
  • 举报
回复
计算一条汇编指令消耗的时间t

循环(delay / t)
puyoupuyou90 2009-08-26
  • 打赏
  • 举报
回复
忘了说了,我的程序是在DOS下运行的,目的就是不让操作系统有任何delay

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧