yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
阅读:2390回复:25

如何提高串行口的优先级

楼主#
更多 发布于:2005-02-14 16:45
windows里,串行口的优先级很低的,如果cpu被别人99%--100%占用了。串行口可能就会出问题,怎么才能提高串行口的优先级?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-14 16:50
如果cpu被别人99%--100%占用了。串行口可能就会出问题,

?应该不会
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-14 17:13
windows里,串行口的优先级很低的,如果cpu被别人99%--100%占用了。串行口可能就会出问题,怎么才能提高串行口的优先级?

CPU被占用应该看IRQL
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-15 10:02
serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-15 10:44
serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。

??????!!!!!!!
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-15 11:17
谢谢大家的回复。
我现在坐的是串口应用程序,从codeguru下载的Remon Spekreijse 的“A communication class for serial port”。采用的半双工方式,pc机发出命令后设备必须在规定时间内回复。现在的问题是当pc机cpu占用高(40%以上,由于处理图像,经常80%-90%),通讯就超时报错。把接收线程::SetPriorityClass(::GetCurrentProcess),REALTIME_PRIORITY_CLASS);情况好很多。代码如下:
event=WaitForMultipleObjects(2,m_hErray,FALSE,10)
if(event - WAIT_OBJECT_0==0){}
if(event - WAIT_OBJECT_0 == 10{}
if(event==WAIT_TIMEOUT)
yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-02-15 11:52
if(event - WAIT_OBJECT_0==0){}//接收到第一个字节
if(event - WAIT_OBJECT_0 == 1){}//接收到全部字节
if(event==WAIT_TIMEOUT)//超时
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-16 09:01
谢谢大家的回复。
我现在坐的是串口应用程序,从codeguru下载的Remon Spekreijse 的“A communication class for serial port”。采用的半双工方式,pc机发出命令后设备必须在规定时间内回复。现在的问题是当pc机cpu占用高(40%以上,由于处理图像,经常80%-90%),通讯就超时报错。把接收线程::SetPriorityClass(::GetCurrentProcess),REALTIME_PRIORITY_CLASS);情况好很多。代码如下:
event=WaitForMultipleObjects(2,m_hErray,FALSE,10)
if(event - WAIT_OBJECT_0==0){}
if(event - WAIT_OBJECT_0 == 10{}
if(event==WAIT_TIMEOUT)

说明是应用程序时常得不到控制,可以在驱动中开个大缓冲,然后在完成例程IoCompleteRequest的PriorityBoost参数给一个请求的线程优先级一个大提升。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-02-16 10:58
找到问题的原因了,但没有解决。不是接收的问题,是串口数据根本没有发送出去。不知道为什么?那位高手能指点指点,大数量分赠送拉。
值得说明的是,和驱动一点关系都没有,我坐的是应用程序。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-02-16 11:53
找到问题的原因了,但没有解决。不是接收的问题,是串口数据根本没有发送出去。不知道为什么?那位高手能指点指点,大数量分赠送拉。
值得说明的是,和驱动一点关系都没有,我坐的是应用程序。

你的应用程序铁出来
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-21 16:04
[quote]serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。

??????!!!!!!! [/quote]

To AllenZh 大哥: 为什么这么惊讶?是不是我说错了?希望得到你的指点。。。谢谢!
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-02-21 16:07
找到问题的原因了,但没有解决。不是接收的问题,是串口数据根本没有发送出去。不知道为什么?那位高手能指点指点,大数量分赠送拉。
值得说明的是,和驱动一点关系都没有,我坐的是应用程序。

会不会是流控信号起作用了?
yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-02-21 16:18
应用程序代码市龚建伟光盘上的,可以到http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483
下载。
这个通讯类好像对鼠标动作和窗口切换特别敏感。有窗口切换的时候发送数据的时间就延长,有时候延长到误认为丢失的程度。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-02-21 16:26
[quote][quote]serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。

??????!!!!!!! [/quote]

To AllenZh 大哥: 为什么这么惊讶?是不是我说错了?希望得到你的指点。。。谢谢! [/quote]
应用程序的优先级最低,在PASSIVE_LEVEL级,中断在DIRQL上,远高于PASSIVE_LEVEL级,进程调度器在DISPATCH_LEVEL,如果CPU总在PASSIVE_LEVEL级上面执行,那么应用程序将永远无法执行。所以应用程序执行的优先级与驱动代码执行的时间无关
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-02-21 16:39
应用程序代码市龚建伟光盘上的,可以到http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483
下载。
这个通讯类好像对鼠标动作和窗口切换特别敏感。有窗口切换的时候发送数据的时间就延长,有时候延长到误认为丢失的程度。

这么说,不是你的应用程序写的有问题,串口数据根本没有发送出去是应用程序得不到CPU,没有时间发,可以将处理图像的操作,分成小块,然后处理完这小块后主动让出CPU一下。如果处理图像的程序没有源代码,就麻烦了。只好做个驱动在核心干预调度,hook一些调度线程的kernel函数。
对了,又想到一个方法,但很可能跟应用程序优先级提升一样,不是绝对管用,在应用程序中多开线程,能多些机会,但要是显卡驱动要占很多时间,那就不管用了。做个驱动在核心干预调度也不管用了
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-02-22 16:00
应用程序的优先级最低,在PASSIVE_LEVEL级,中断在DIRQL上,远高于PASSIVE_LEVEL级,进程调度器在DISPATCH_LEVEL,如果CPU总在PASSIVE_LEVEL级上面执行,那么应用程序将永远无法执行。所以应用程序执行的优先级与驱动代码执行的时间无关


呵呵,谢谢指点了,驱动代码优先级应该是与应用程序的优先级没有关系,是我搞错了,以为驱动跟应用程序属于同一进程。还有点疑问。我记得PASSIVE_LEVEL,DIRQL,DISPATCH_LEVEL等等这些应该是中断级,而不是优先级,就是说中断级低的在执行时可以被中断级高的打断。一般情况下cpu都在PASSIVE_LEVEL上运行,这时候的线程调度就是优先级起作用了,优先级高的应用程序得到执行就多,为什么说应用程序永远不会执行呢?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-02-22 16:34
[quote]应用程序的优先级最低,在PASSIVE_LEVEL级,中断在DIRQL上,远高于PASSIVE_LEVEL级,进程调度器在DISPATCH_LEVEL,如果CPU总在PASSIVE_LEVEL级上面执行,那么应用程序将永远无法执行。所以应用程序执行的优先级与驱动代码执行的时间无关


呵呵,谢谢指点了,驱动代码优先级应该是与应用程序的优先级没有关系,是我搞错了,以为驱动跟应用程序属于同一进程。还有点疑问。我记得PASSIVE_LEVEL,DIRQL,DISPATCH_LEVEL等等这些应该是中断级,而不是优先级,就是说中断级低的在执行时可以被中断级高的打断。一般情况下cpu都在PASSIVE_LEVEL上运行,这时候的线程调度就是优先级起作用了,优先级高的应用程序得到执行就多,为什么说应用程序永远不会执行呢? [/quote]
前提是假设如果CPU总在PASSIVE_LEVEL级上面执行,当然这种是极端情况
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-02-23 08:18
 [/quote]
这么说,不是你的应用程序写的有问题,串口数据根本没有发送出去是应用程序得不到CPU,没有时间发,可以将处理图像的操作,分成小块,然后处理完这小块后主动让出CPU一下。如果处理图像的程序没有源代码,就麻烦了。只好做个驱动在核心干预调度,hook一些调度线程的kernel函数。
对了,又想到一个方法,但很可能跟应用程序优先级提升一样,不是绝对管用,在应用程序中多开线程,能多些机会,但要是显卡驱动要占很多时间,那就不管用了。做个驱动在核心干预调度也不管用了 [/quote]
谢谢指点,虽然处理图像的操作是我们自己编写的代码,但该写起来比较麻烦。做个驱动在河心干预调度可能是好办法,但时间紧迫,小弟还不会。现在的做法是将通讯这块单独写成一个进程,此进程的优先级最高。问题基本解决,正在测试中。
yachli
驱动小牛
驱动小牛
  • 注册日期2004-04-12
  • 最后登录2016-03-08
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-02-23 12:32
新麻烦出现,读共享内存后串口通讯就彻底中断
郁闷ing..........
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-02-23 15:31
新麻烦出现,读共享内存后串口通讯就彻底中断
郁闷ing..........

哪里的共享内存?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
上一页
游客

返回顶部