WinCE设置线程优先级影响

工业通信软件如CANopen和etherCAT一般都需要系统提供一个精准的timer。

前一段时间 时间在ARM 平台的WinCE上面实现精准度为250us 和500us 的timer。主要是利用硬件上面的一个定时器来实现计时功能。然后用驱动再实现一个可以提供250us或500us倍数的timer。 基本原理是:主线程里面主要是 open close 和DeviceIOControl的动作, 驱动初始化的时候还启动一个名叫 A 的thread,在A thread里面实现中断处理(每250us或者500us的基准频率触发一次),查看当前的等待时间是多少,如果是250us或者500us则立即触发 (通过事件方式,PulseEvent),如果是基本频率的倍数,则直接进入下次基本频率的等待,直到等待的时间timeout,立即触发。

最初简单的用name event 方式,来实现driver与AP的交互,为了简化操作,改用如下的DeviceIOControl方式。

系统AP的与driver的调用顺序如下:

 AP                               driver

Createfile XXX_Open

DevieIOControl() XXX_IOControl: set timer period

DeviceIOControl() XXX_IOControl:wait exactly time and use waitforsingleobject and return.

CLose XXX_Close

问题出现在多个AP同时在使用AP的时候,当其中一个AP正在等待的时候。另外一个AP close 掉的时候,竟然会影响到另外调用的AP。后来查找原因是因为AP里面主线程开启了一个thread并且将新开启的thread priority 提高了,在close掉新开启的thread的时候会影响到driver。经过各种尝试最后将新开启线程的priority 调整到原来默认的就OK了。

WinCE 在某些time critical 的应用中,新开启的thread 结束前首先要将new thread的优先级设置为默认的优先级,然后再进行关闭动作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章