【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循环:
总结:链表遍历过程中,如果要删除当前节点,记得要把遍历指针指向前一个。