1. 程式人生 > 其它 >【FreeRTOS學習筆記】分析多優先順序程式碼效果

【FreeRTOS學習筆記】分析多優先順序程式碼效果

思路:

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迴圈:

總結:連結串列遍歷過程中,如果要刪除當前節點,記得要把遍歷指標指向前一個。