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,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/126195.html
標籤:其他
上一篇:2020-09-23 Modbus協議詳解 YapethsDY
下一篇:老板,結賬算算多少錢 ~~~~~
