【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循环:

总结:链表遍历过程中,如果要删除当前节点,记得要把遍历指针指向前一个。