阅读:2390回复:25
如何提高串行口的优先级
windows里,串行口的优先级很低的,如果cpu被别人99%--100%占用了。串行口可能就会出问题,怎么才能提高串行口的优先级?
|
|
沙发#
发布于:2005-02-14 16:50
如果cpu被别人99%--100%占用了。串行口可能就会出问题, ?应该不会 |
|
|
板凳#
发布于:2005-02-14 17:13
windows里,串行口的优先级很低的,如果cpu被别人99%--100%占用了。串行口可能就会出问题,怎么才能提高串行口的优先级? CPU被占用应该看IRQL |
|
|
地板#
发布于:2005-02-15 10:02
serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。
|
|
地下室#
发布于:2005-02-15 10:44
serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。 ??????!!!!!!! |
|
|
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) |
|
6楼#
发布于:2005-02-15 11:52
if(event - WAIT_OBJECT_0==0){}//接收到第一个字节
if(event - WAIT_OBJECT_0 == 1){}//接收到全部字节 if(event==WAIT_TIMEOUT)//超时 |
|
7楼#
发布于:2005-02-16 09:01
谢谢大家的回复。 说明是应用程序时常得不到控制,可以在驱动中开个大缓冲,然后在完成例程IoCompleteRequest的PriorityBoost参数给一个请求的线程优先级一个大提升。 |
|
|
8楼#
发布于:2005-02-16 10:58
找到问题的原因了,但没有解决。不是接收的问题,是串口数据根本没有发送出去。不知道为什么?那位高手能指点指点,大数量分赠送拉。
值得说明的是,和驱动一点关系都没有,我坐的是应用程序。 |
|
9楼#
发布于:2005-02-16 11:53
找到问题的原因了,但没有解决。不是接收的问题,是串口数据根本没有发送出去。不知道为什么?那位高手能指点指点,大数量分赠送拉。 你的应用程序铁出来 |
|
|
10楼#
发布于:2005-02-21 16:04
[quote]serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。 ??????!!!!!!! [/quote] To AllenZh 大哥: 为什么这么惊讶?是不是我说错了?希望得到你的指点。。。谢谢! |
|
11楼#
发布于:2005-02-21 16:07
找到问题的原因了,但没有解决。不是接收的问题,是串口数据根本没有发送出去。不知道为什么?那位高手能指点指点,大数量分赠送拉。 会不会是流控信号起作用了? |
|
12楼#
发布于:2005-02-21 16:18
应用程序代码市龚建伟光盘上的,可以到http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483
下载。 这个通讯类好像对鼠标动作和窗口切换特别敏感。有窗口切换的时候发送数据的时间就延长,有时候延长到误认为丢失的程度。 |
|
13楼#
发布于:2005-02-21 16:26
[quote][quote]serial 用的是中断,所以应该不会有优先级的问题。。另外,驱动里的代码能否得到执行的“优先级”一般继承自应用程序,所以,一般来说,应用程序优先级高的话,对应的驱动的代码得到执行的时间就多。。 ??????!!!!!!! [/quote] To AllenZh 大哥: 为什么这么惊讶?是不是我说错了?希望得到你的指点。。。谢谢! [/quote] 应用程序的优先级最低,在PASSIVE_LEVEL级,中断在DIRQL上,远高于PASSIVE_LEVEL级,进程调度器在DISPATCH_LEVEL,如果CPU总在PASSIVE_LEVEL级上面执行,那么应用程序将永远无法执行。所以应用程序执行的优先级与驱动代码执行的时间无关 |
|
|
14楼#
发布于:2005-02-21 16:39
应用程序代码市龚建伟光盘上的,可以到http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483 这么说,不是你的应用程序写的有问题,串口数据根本没有发送出去是应用程序得不到CPU,没有时间发,可以将处理图像的操作,分成小块,然后处理完这小块后主动让出CPU一下。如果处理图像的程序没有源代码,就麻烦了。只好做个驱动在核心干预调度,hook一些调度线程的kernel函数。 对了,又想到一个方法,但很可能跟应用程序优先级提升一样,不是绝对管用,在应用程序中多开线程,能多些机会,但要是显卡驱动要占很多时间,那就不管用了。做个驱动在核心干预调度也不管用了 |
|
|
15楼#
发布于:2005-02-22 16:00
应用程序的优先级最低,在PASSIVE_LEVEL级,中断在DIRQL上,远高于PASSIVE_LEVEL级,进程调度器在DISPATCH_LEVEL,如果CPU总在PASSIVE_LEVEL级上面执行,那么应用程序将永远无法执行。所以应用程序执行的优先级与驱动代码执行的时间无关 呵呵,谢谢指点了,驱动代码优先级应该是与应用程序的优先级没有关系,是我搞错了,以为驱动跟应用程序属于同一进程。还有点疑问。我记得PASSIVE_LEVEL,DIRQL,DISPATCH_LEVEL等等这些应该是中断级,而不是优先级,就是说中断级低的在执行时可以被中断级高的打断。一般情况下cpu都在PASSIVE_LEVEL上运行,这时候的线程调度就是优先级起作用了,优先级高的应用程序得到执行就多,为什么说应用程序永远不会执行呢? |
|
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级上面执行,当然这种是极端情况 |
|
|
17楼#
发布于:2005-02-23 08:18
[/quote]
这么说,不是你的应用程序写的有问题,串口数据根本没有发送出去是应用程序得不到CPU,没有时间发,可以将处理图像的操作,分成小块,然后处理完这小块后主动让出CPU一下。如果处理图像的程序没有源代码,就麻烦了。只好做个驱动在核心干预调度,hook一些调度线程的kernel函数。 对了,又想到一个方法,但很可能跟应用程序优先级提升一样,不是绝对管用,在应用程序中多开线程,能多些机会,但要是显卡驱动要占很多时间,那就不管用了。做个驱动在核心干预调度也不管用了 [/quote] 谢谢指点,虽然处理图像的操作是我们自己编写的代码,但该写起来比较麻烦。做个驱动在河心干预调度可能是好办法,但时间紧迫,小弟还不会。现在的做法是将通讯这块单独写成一个进程,此进程的优先级最高。问题基本解决,正在测试中。 |
|
18楼#
发布于:2005-02-23 12:32
新麻烦出现,读共享内存后串口通讯就彻底中断
郁闷ing.......... |
|
19楼#
发布于:2005-02-23 15:31
新麻烦出现,读共享内存后串口通讯就彻底中断 哪里的共享内存? |
|
|
上一页
下一页