powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
阅读:1319回复:10

如何实现驱动和内核对同一个内存空间的互斥访问?

楼主#
更多 发布于:2007-11-06 21:14
我现在在arminit.c文件中的中断处理中对某个中断进行了计数,因为该中断比较频繁,计数的变量在arminit.c文件中进行累加;而我要在驱动程序中把该变量读取出来;意味着我要在驱动程序中和内核中对该变量的访问实现互斥;我该如何实现这种驱动和内核对同一个变量的互斥呢?
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-11-07 11:59
自己顶一个
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-11-07 12:42
用户被禁言,该主题自动屏蔽!
wince_lover
驱动中牛
驱动中牛
  • 注册日期2007-01-10
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分1103分
  • 威望735点
  • 贡献值2点
  • 好评度279点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-11-07 14:02
CreateMutex
WaitForSingleObject
ReleaseMutex
不知道是否可以
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-11-07 20:47
这个本来就是互斥的,你只要保证在中断处理中增加该变量,驱动程序中只读取,就没有问题。

因为系统在处理中断时一定无法执行驱动程序的代码,反之亦然。
学海无涯
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-08 10:41
microsun说的有道理。

我实际测试的情况是这样的,我再arminit.c文件中对某个中断计数,驱动程序中每秒钟读取一次该计数(没有修改,只是读取),这个中断如果每秒钟3k次以下,程序没有问题;如果中断次数达到每秒3k次以上,驱动程序中每秒钟读取的计数值就会变成0,并且过一会后系统会发生复位现象。

我百思不解啊。希望能指点一二。
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-11-09 17:00
自己再顶一个
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-11-11 21:20
你的CPU是多少M的,
可以测一下在你这个系统中IST的响应速度,会不会是系统太慢了?
还有测一下只处理你这个中断,别的基本什么都不干时是什么现象.
学海无涯
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-11-13 14:11
cpu是266M,
就算是IST的响应速度慢,理论上也不应该出现这样的现象啊?
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
9楼#
发布于:2007-11-14 18:46
你驱动怎么去读的,那个计数是否会清0,我想来是这样设计的,通过KernelIoControl去获取这个在内核中中断的计数。如果你不去读这个中断计数,是否系统不会复位?另外你不是说中断计数是0吗?怎么又得到实际中断数超过3K/S?
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-11-15 09:09
预先预留一个内存空间,在驱动程序中读取时先映射到驱动程序的进程空间。

如果我不读取,系统是不会复位的,工作非常正常。

我使用的波形发生器在测试,因此输入的频率我知道。
游客

返回顶部