挑战:如何做到精确等待n个CPU时钟,并且在等待时期将控制权交给操作系统???

gencheng 2008-03-10 08:37:53
由于现在在做的是实时通讯,要求精确的延时,汇编语言能不能做到:精确等待n个CPU时钟,并且在等待时期将控制权交给操作系统???

也就是说在等待时期内不占用cpu资源.我现在用的是Delphi,它的sheep()函数经测试精度太差,比如sheep(1)应该是等待1毫秒,在这1毫秒内让出cpu使用权.但实际上等待了n个毫秒,很不精确.不知道汇编语言能不能做到??
...全文
187 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmwgreenrain 2008-03-14
  • 打赏
  • 举报
回复
使用timer函数
cnzdgs 2008-03-12
  • 打赏
  • 举报
回复
如果你是要精确一些的定时可以用CreateWaitableTimer和SetWaitableTimer,每秒50次还是没问题的,不过这个定时器跟Sleep的效果是不同的,比Sleep准得多,但离精确到n个CPU周期可差得远了。
再罗嗦一句,这问题跟汇编语言没什么关系。
gencheng 2008-03-12
  • 打赏
  • 举报
回复
不是我要求苛刻,而是用户要求在Windows系统上实现单位时间内的数据采集率要求有一定的指标.比如说每秒50组数据等等.所以Sleep就达不到要求了.而如果不Sleep,让cpu一直无限循环的采集数据,那么cpu占用率将会一直保持在97%以上,用不了多久也会死掉,那样更玩完.
rularys 2008-03-11
  • 打赏
  • 举报
回复
在一个实时系统上也许可以实现;在Windows上可不行,楼主要求很苛刻
大熊猫侯佩 2008-03-11
  • 打赏
  • 举报
回复
windows非实时OS,你可以看一下 windows 内核揭秘 4edit 为什么不可以。
alan001 2008-03-11
  • 打赏
  • 举报
回复
一块板+时钟引线+定时器芯片/处理器
BMCRNET 2008-03-11
  • 打赏
  • 举报
回复
MARK
ckc 2008-03-11
  • 打赏
  • 举报
回复
晕到死不是实时操作系统,无法实现你的要求
不知道你的具体应用是什么,要么降低应用对实时的要求,要么使用硬件解决这个问题
archim 2008-03-11
  • 打赏
  • 举报
回复
阅读CPU手册,计算每条指令的时钟数,然后自己设计一个循环来等待
gencheng 2008-03-11
  • 打赏
  • 举报
回复
楼上的还真够取巧.因为Delphi的Sleep()也是调用win32API的 Sleep.所以效果应该一样.

另外Delphi内嵌的BASM不支持invoke,所以上述方法事实上在Delphi中也行不通.
cnzdgs 2008-03-11
  • 打赏
  • 举报
回复
要与Sleep(1)效果相同?那就用汇编调Sleep函数不就行了。
invoke Sleep, 1
gencheng 2008-03-11
  • 打赏
  • 举报
回复
如何用汇编做出效果和sleep(1)函数相同的东西?难道汇编做不到???

因为主要是用在串口数据采集上,所以有此要求!
cnzdgs 2008-03-10
  • 打赏
  • 举报
回复
做不到,也不可能做到,因为切换一次任务所需要的时间就是微秒级的。如果等待时间不把控制权交出,在一定程度上还有机会做到。
执行Sleep函数不是定时用的,而是放弃线程对CPU的控制权,等到线程轮回一周后才能再次获得控制权,此时如果还未达到Sleep指定的时间,则自动再次放弃控制权,如此往复。线程每次获得控制权是10毫秒(时间片),达到10毫秒后系统会自动切换到其它线程,未达到时可以执行Sleep函数主动放弃。
相关推荐
发帖
汇编语言

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
帖子事件
创建了帖子
2008-03-10 08:37
社区公告
暂无公告