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

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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版