STM32H7+UCOSIII+LWIP踩坑記錄

2020-09-25 11:01:03

STM32H7+UCOSIII+LWIP踩坑記錄

主要功能:微控制器作TCP伺服器實現PC端多使用者端連線微控制器,並行傳輸資料。

坑點1、優先順序問題:
一個使用者端連線就建立一個執行緒,優先順序由高到低遞減,即先連線上的使用者端執行緒優先順序高於後連線上的。這樣雖然傳輸速率慢的時候也能發能收,但是,當傳輸速率加快的時候就會出現一個問題:高優先順序的執行緒會一直搶佔CPU的控制權,導致低優先順序執行緒丟包甚至斷開連線。可能有人會想到給每個執行緒尾部加個系統延時讓執行緒執行完之後掛起一段時間,以達到讓出CPU控制權。這樣確實能達到一定的效果,丟包率也可能有所降低,但是治標不治本,下一個坑點就是延時的問題。最好的解決辦法是將所有使用者端執行緒固定在同一個優先順序下,UCOSIII是支援多個任務共用一個優先順序的。
坑點2、執行緒延時排程問題:
上面說到給執行緒加上延時排程確實能夠降低丟包率,但是丟包的現象依然存在,可能有人連線兩個或三個使用者端並行通訊都沒有問題,但你可以試試連五個六個,丟包現象就會很明顯了。另外延時會造成通訊效率降低。那最好的辦法還是去掉延時。不過之前用過F4的晶片實現同樣的功能時,去掉延時會造成程式卡死,具體原因當時沒有去深究,估計也是優先順序的問題,當時的執行緒優先順序還是採用由高到低的方式。這次用H7改成同等優先順序去掉延時之後沒有卡死的現象,並且通訊效率也提高了,丟包現象幾乎不存在。UCOSIII裡有個概念叫時間片排程,其作用是讓同等優先順序任務執行完n個片段之後主動讓出CPU使用權。n在OSTaskCreate()建立任務時可以設定。單個時間片時長也可以通過下面的宏定義設定。
#define OS_CFG_TICK_RATE_HZ 1000u
這個宏定義跟系統時間有關,修改後會改變時間函數例如延時等跟時間有關的函數的單位值,一般不建議修改這個,保持預設即可。
下面截一張通訊圖放上來,目前四個使用者端同時連線並行傳輸讀取ModbusTCP資料區0 err。
在這裡插入圖片描述