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