【FreeRTOS學習筆記】分析多優先順序程式碼效果
阿新 • • 發佈:2022-05-11
思路:
1.觀察同優先順序,flag在邏輯分析儀的波形變化
2.觀察不同優先順序,flag在邏輯分析儀的波形變化
1.觀察同優先順序變化:
(1).兩flag幾乎同時進入高電平,說明讓步的確實發揮了非阻塞的作用;
(2).
(2.1).flag2比flag1先翻轉為低電平,根據本人的程式碼,初次執行先制定了task1為CurrentPCB,所以task2是後插入延時連結串列的;
FreeRTOS的連結串列插入順序如下:
並且本設計中,時鐘中斷在遍歷延時連結串列時,是從屁股往前,如下圖:
總之後插入的節點會先被遍歷到,從延時連結串列恢復到就緒列表,如下圖:
再看從延時恢復到就緒的遍歷方式:
以上分析可以得出,是Task2先得到了執行,如下圖;
符合邏輯分析儀中flag2先翻轉的現象,並且flag2在0.2s後得到了翻轉,延時也比較準確;
但重要的是,為什麼flag1在0.3s才被翻轉?就像是下一個時鐘中斷到來時,Task1才得到排程。
單步執行調查:
思路轉換,觀察時鐘中斷時,是否沒有恢復所有連結串列中延時已到的任務節點
發現將節點移出連結串列的時候,指向上下節點的指標被清空了!如圖:
更新程式碼,在刪除節點前,先更新迭代節點。
出錯,continue不會跳過for的第三部分呀,修改程式碼,迭代節點指向前一個:
成功指向下一個節點,如圖:
波形圖也正常了:
原來是資料結構的使用方法有錯誤。
再仔細檢查當刪除節點後,到底遍歷到了什麼?
原來遍歷Next節點的時候,遍歷到了就緒連結串列的下一個節點!!如下圖:
然後排序值就是最大值,直接跳出for迴圈:
總結:連結串列遍歷過程中,如果要刪除當前節點,記得要把遍歷指標指向前一個。