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的優先級設置爲默認的優先級,然後再進行關閉動作

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