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

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

[复制链接]
阿松松 发布时间:2015-1-9 16:51
本帖最后由 阿松松 于 2015-1-9 23:35 编辑 . `7 g1 F: R8 f7 w
+ q/ ~- C6 v9 G0 O; `5 X
在list.c中,将结点按照升序插入到链表的合适的位置。) V7 s; p, Y) k& f" p9 T% \
嗯,升序,就是以xListEnd作为最大值且放在链表结尾的从小到大的一种排序方式。
6 x) b9 a$ c. k; N5 L- B% C6 _: u( g/ A" z
vListInsert( xList *pxList, xListItem *pxNewListItem )
' r. _  k8 @# Q
6 |1 P; i+ }, J" H, I" k& v+ z

) T9 f3 h2 M: D- a7 t# J# W% G分析此段代码的时候,要记得这样的规则:
链表中,总是访问由PxIndex指向的链表结点。
" G1 t1 b  @$ _/ d% q1 v: ~
遍历链表的时候,总是访问当前培训Index(本代码中是pxIterator)->Next指向的结点。
8 B; H$ A- j& Q' M- ~9 A而且,当访问到的结点与要插入的结点值大小相等的时候,是有一个特定的规则的,待补充。。。
  1. void vListInsert( xList *pxList, xListItem *pxNewListItem )
    ; F' w9 Q2 |! C  q
  2. {
    + I# T' I, O0 T  F
  3. /*新建一个指针变量,在for循环中作遍历链表用*/   # w3 D! Q. r) `. c5 V/ M+ r
  4. volatile xListItem *pxIterator;
    - L, G/ h# g% A

  5. ( b8 ?# ^2 @& l% u0 J
  6. /*新建变量,存储新插入结点的值,升序排列时比较用。
    * c) H) n: h  Q6 n+ t
  7. 嗯,这个值应该用来存储包含该结点任务的延时时间?*/   5 o1 b- _3 u3 w% ^
  8. portTickType xValueOfInsertion;
    0 I6 a$ k7 k7 e' e4 W- ]4 E/ C2 L0 L

  9. 5 E/ P7 b0 Y. z+ E+ L2 z+ H
  10. /*新建变量,存储新插入结点的值,升序排列时比较用.*/   
    ' c( `$ ]# K+ y+ F: H% a
  11. xValueOfInsertion = pxNewListItem->xItemValue;
    0 f9 X1 y' {4 U" E. n
  12. ( ?8 b6 W# Y: e+ p# h
  13. /*portMAX_DELAY是链表中能存储的最大的延时时常,也就是xListEnd变量的值,这个变量的使用有待分析。5 K. M7 |6 ^$ i/ f# _: h% f' U  P
  14. 如果新插入的结点的值等于这个最大值,那么直接把新插入的结点放到xListEnd前面就ok了*/   
    2 \' V8 {/ f. s0 x: r4 ?
  15. if( xValueOfInsertion == portMAX_DELAY ) ; I) p5 s1 h3 e# p% M: f# F
  16. { % I7 B8 L' P& H+ l
  17. /*这句话也说明了,xListEnd上面的那个结点的值是最大的,即升序排列方式。*/    7 R# M$ D* T! x6 @& L3 x! I9 j
  18. pxIterator = pxList->xListEnd.pxPrevious; , n  T: o4 X& Q0 C6 f! ]5 K
  19. } * J0 n9 z  S& y: C5 ]) v  Q( G
  20. else
    / Z7 z, A7 q* O6 D: A
  21. { 2 h7 t. X* [" Z: O) q# @
  22. /*否则的话,就要从最xListEnd后面的那个结点开始进行遍历,2 N! _! S7 v4 r& X  x/ v
  23. 把链表中的每个结点的值和新插入的结点值对比。*/
    9 {8 @- n  ?) F+ ^% I& Y$ \

  24. : O. v0 `  Y; r2 p6 C# L  K
  25. /*如果新插入的结点的值大于链表中pxIterator指针的后一个结点的值(链表中当前遍历到的结点)的值,则表明还没有找到合适的位置,就会一直在for循环中遍历,如果在某一次循环中发现遍历的那个值比新插入的结点的值大,(即pxIterator->pxNext->xItemValue <= xValueOfInsertion),且此时必满足pxIterator->xItemValue > xValueOfInsertion(因为既然遍历到了pxNext,那么pxNext的上一个结点即pxIterator指向的值肯定不满足条件),那么此时跳出for循环。*/. c7 J! F9 {9 |$ o# Y  z/ S
  26. for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext );
    0 s1 k, s0 F  z4 L* @7 G" N6 K5 D
  27. }
    ) K, H8 z; h6 z$ s* V9 S% F* o
  28. ' b5 A- M& u; o5 C
  29. /*在将新结点插入到链表中时,要连接好新结点与上下结点直接的关系,及双向链表的pxNext指针与pxPrevious指针,6 C! D& G- x* h1 ~$ \
  30. 即:
    0 ~5 T" [, A: z, C! V, R: t
  31. pxNewListItem->pxNext指向下一个元素(与下一个结点之间的关系)2 l7 c- M, `# K/ V; |
  32. pxNewListItem->pxNex->pxPrevioust指向pxNewListItem(与下一个结点之间的关系)% _) `: l1 E$ K  y$ P
  33. & p+ G" |" W( [$ W( [, W9 w1 m- K
  34. pxNewListItem->pxPrevious 指向上一个元素(与上一个结点之间的关系)
    4 C- v4 e/ T0 O
  35. pxNewListItem->pxPrevious ->pxNext指向pxNewListItem(与上一个结点之间的关系)8 V  o/ I3 M6 O; Z

  36. & o' h' d5 \9 `" r' |3 n1 R
  37. 根据这几点规则,以下的几行代码就不用作分析了,请自行脑补。*/) x6 Q0 N8 r; X; i. T6 [8 \. {

  38. 8 d" j  j4 j) Q9 W# n9 Z
  39. 6 l7 z$ N! L. F
  40. pxNewListItem->pxNext = pxIterator->pxNext; ; Z' f: d9 P8 }7 f4 r
  41. pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; 9 e: P; o/ Q6 e& o9 t' d; L
  42. pxNewListItem->pxPrevious = pxIterator; . y  Q$ ]: N- i
  43. pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem;
    + I- Y7 e! w) w4 w% x  s0 R
  44. 2 L8 q4 E! j- _2 x
  45. /*表明自己已经成功的插入到pxList链表中*/; u" M& _4 H$ _, D2 y: c
  46. pxNewListItem->pvContainer = ( void * ) pxList;
      q% W! W! m. q5 x- B, m" ^
  47. /*链表中的结点数量自加1*/
    5 o* K$ J2 o# ]6 h& S# V
  48. ( pxList->uxNumberOfItems )++; ' E9 O  |4 k. d% ~
  49. }
复制代码

4 O, E5 F+ B: T+ K; F: e2 z. y/ r) N9 {# D: z: S
没分析完,出去透气,等下来补。。嗯,我又回来更新了,终于完成了,请拍砖。+ K+ e, T1 E% U" v8 J+ a6 x) W

1 _* k% d. B# Z
# k/ b) m/ p( g, x6 n8 ?  r- _2 [. A  f& z! U
2 M# M0 m8 i7 c6 V% ~6 |

0 E7 _9 h, G4 A- i. @( Y$ U1 f: L1 V& {. `& }
赞 收藏 评论0 发布时间:2015-1-9 16:51

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版