luxiao013
驱动牛犊
驱动牛犊
  • 注册日期2005-05-13
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1629回复:5

应用程序需要微妙级的延时,请问有什么好的方法。

楼主#
更多 发布于:2005-05-21 21:36
我想在应用程序中调用微妙级的延时函数,不知道如何实现。
并且还想在某一个循环内保证当前线程的实时性,即始终占有cpu,不被轮询出去,请问在evc中如何实现,谢谢!
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-23 16:12
你可以使用硬件TIEMER来做微秒级延迟

满足实时性可以有几种选择:
1.你可以提升该线程的优先级到实时优先级。这样做仍然会调度,只是如果没有优先级更高的任务将不会被换出
2.你可以直接关闭中断,直到你认为可以释放CPU,这样你的线程确实始终占有处理器,连调度都不会有。
根据地的兄弟们,团结就是力量
luxiao013
驱动牛犊
驱动牛犊
  • 注册日期2005-05-13
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-24 08:42
1.使用硬件定时器延时,是否要在evc中直接访问定时/计数寄存器?或者还需要汇编实现,以前我没做过单片机,大哥您能不能给出一段伪代码或示例代吗?
2.提升优先级可以用api实现吧?
  直接关中断应该也需要直接操作硬件寄存器吧?一到操作硬件这一块我就发懵,您能不能也给出一段示例代码?
  非常感谢!
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-24 13:08
1.访问硬件TIMER确实需要直接操作其内部寄存器,不过不一定要用汇编,你可以使用你的硬件TIMER的内部寄存器地址直接访问,在驱动中这个地址需要映射成虚拟地址,具体怎么做需要看你使用的平台以及硬件TIMER的设计(是单独的片子还是SOC内部设备)

2.提升优先级和关中断都可以用API做,SetThreadPriority用于提升线程优先级,INTERRUPTS_ON()和INTERRUPTS_OFF()宏用于关闭中断,不过这两个宏不太用在驱动中,如果需要的话你可以用汇编去控制,一般的CPU都有位可以直接开关所有中断

我不清楚你的平台,所以无法给你示例代码
根据地的兄弟们,团结就是力量
luxiao013
驱动牛犊
驱动牛犊
  • 注册日期2005-05-13
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-25 08:30
非常感谢wxl_50685330大哥的细心讲解。
我的平台是s3c2410+wince.net 4.2。
我都是想在evc开发的应用程序中使用,并不想在驱动中用。想看看示例代码以后有这样的问题也好自己解决了。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-25 10:10
不好意思,我没有现成的例子,不过CE下在应用中访问硬件和驱动中是一样的,首先确定你的TIMER的内部寄存器物理地址,0X12345678,然后使用VIRTUALALLOC和VIRTUALCOPY将其映射成虚拟地址,然后就可以直接控制了,这是前不久的帖子,你可以参考:


http://218.246.32.151/forum/html_91879.html?1116987019
根据地的兄弟们,团结就是力量
游客

返回顶部