你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FreeRTOS 源代码分析vListInsert( xList *pxList, xListItem *pxNewListItem )

[复制链接]
阿松松 发布时间:2015-1-9 16:51
本帖最后由 阿松松 于 2015-1-9 23:35 编辑

在list.c中,将结点按照升序插入到链表的合适的位置。
嗯,升序,就是以xListEnd作为最大值且放在链表结尾的从小到大的一种排序方式。

vListInsert( xList *pxList, xListItem *pxNewListItem )


分析此段代码的时候,要记得这样的规则:
链表中,总是访问由PxIndex指向的链表结点。

遍历链表的时候,总是访问当前培训Index(本代码中是pxIterator)->Next指向的结点。
而且,当访问到的结点与要插入的结点值大小相等的时候,是有一个特定的规则的,待补充。。。
  1. void vListInsert( xList *pxList, xListItem *pxNewListItem )
  2. {
  3. /*新建一个指针变量,在for循环中作遍历链表用*/   
  4. volatile xListItem *pxIterator;

  5. /*新建变量,存储新插入结点的值,升序排列时比较用。
  6. 嗯,这个值应该用来存储包含该结点任务的延时时间?*/   
  7. portTickType xValueOfInsertion;

  8. /*新建变量,存储新插入结点的值,升序排列时比较用.*/   
  9. xValueOfInsertion = pxNewListItem->xItemValue;

  10. /*portMAX_DELAY是链表中能存储的最大的延时时常,也就是xListEnd变量的值,这个变量的使用有待分析。
  11. 如果新插入的结点的值等于这个最大值,那么直接把新插入的结点放到xListEnd前面就ok了*/   
  12. if( xValueOfInsertion == portMAX_DELAY )
  13. {
  14. /*这句话也说明了,xListEnd上面的那个结点的值是最大的,即升序排列方式。*/   
  15. pxIterator = pxList->xListEnd.pxPrevious;
  16. }
  17. else
  18. {
  19. /*否则的话,就要从最xListEnd后面的那个结点开始进行遍历,
  20. 把链表中的每个结点的值和新插入的结点值对比。*/

  21. /*如果新插入的结点的值大于链表中pxIterator指针的后一个结点的值(链表中当前遍历到的结点)的值,则表明还没有找到合适的位置,就会一直在for循环中遍历,如果在某一次循环中发现遍历的那个值比新插入的结点的值大,(即pxIterator->pxNext->xItemValue <= xValueOfInsertion),且此时必满足pxIterator->xItemValue > xValueOfInsertion(因为既然遍历到了pxNext,那么pxNext的上一个结点即pxIterator指向的值肯定不满足条件),那么此时跳出for循环。*/
  22. for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext );
  23. }

  24. /*在将新结点插入到链表中时,要连接好新结点与上下结点直接的关系,及双向链表的pxNext指针与pxPrevious指针,
  25. 即:
  26. pxNewListItem->pxNext指向下一个元素(与下一个结点之间的关系)
  27. pxNewListItem->pxNex->pxPrevioust指向pxNewListItem(与下一个结点之间的关系)

  28. pxNewListItem->pxPrevious 指向上一个元素(与上一个结点之间的关系)
  29. pxNewListItem->pxPrevious ->pxNext指向pxNewListItem(与上一个结点之间的关系)

  30. 根据这几点规则,以下的几行代码就不用作分析了,请自行脑补。*/


  31. pxNewListItem->pxNext = pxIterator->pxNext;
  32. pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
  33. pxNewListItem->pxPrevious = pxIterator;
  34. pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem;

  35. /*表明自己已经成功的插入到pxList链表中*/
  36. pxNewListItem->pvContainer = ( void * ) pxList;
  37. /*链表中的结点数量自加1*/
  38. ( pxList->uxNumberOfItems )++;
  39. }
复制代码


没分析完,出去透气,等下来补。。嗯,我又回来更新了,终于完成了,请拍砖。






收藏 评论0 发布时间:2015-1-9 16:51

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版