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

FreeRTOS源代码分析vListInsertEnd( xList *pxList, xListItem *pxNewL...

[复制链接]
阿松松 发布时间:2015-1-8 13:25
本帖最后由 阿松松 于 2015-1-9 15:29 编辑 , \0 R2 w" N- {0 Q) F

" B# d4 P2 }1 [( g在list.c中,把一个结点插入到链表尾部  \3 f9 Q0 c; O! ?, s1 x
void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )5 C: f0 d* i+ z$ t- }
/ C2 h7 [8 W6 D
1 x6 z" e- S+ m  F& z; u9 b9 O6 Q
  1. void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )8 }+ K- i8 Y0 x/ _
  2. {
    : r4 F# ^4 s+ d$ o
  3. volatile xListItem * pxIndex;
    8 i" _- ^; J( [/ D
  4. 2 e/ k4 m  q% V; X9 ~
  5. /* 链表中,总是访问由PxIndex指向的链表结点。插入新结点到链表中时,
    % M5 p$ w: P0 j' D2 ?! T
  6. 使得在调用pvListGetOwnerOfNextEntry函数时,新插入的结点是最后一个被移除的,/ D' `3 [* o$ r4 Q1 \
  7. 而不是对链表排序(说实话官方的这句! U  r% q. @: H5 \4 l0 q* `
  8. Insert a new list item into pxList, but rather than sort the list,  U1 }0 t/ l! s
  9. makes the new list item the last item to be removed by a call to
    & A0 G3 i2 V' Z
  10. pvListGetOwnerOfNextEntry. 我一直搞不懂)。
    ' c# e6 I# ?% W# b9 B5 \2 I
  11. 这意味着pxIndex必须指向这个新插入的结点。 */
    . Z$ @' j) y9 l$ Q0 O% @: }1 U
  12. pxIndex = pxList->pxIndex;7 m8 h: {! o9 T# B# |

  13. " u- r+ q* n( c& Z
  14. /*以下两句为新插入结点指定前后结点,可以比喻为孩子找到了爹妈。*/
    ' x  G' b& F8 P( u8 h! T

  15. , `+ N9 B7 r5 @9 }- I1 S
  16. /*使得新插入的结点的下一个结点指向当前链表pxList中的pxIndex的下一个结点。*/) ]0 }, p' u% g2 h
  17. pxNewListItem->pxNext = pxIndex->pxNext;
    ! K* n3 o2 S2 L: o# L
  18. * R- X1 |$ J( ]5 \3 f' j% J& e( M
  19. /*使得新插入的结点的上一个结点指向当前链表pxList中的pxIndex。*/
    . k0 c% J; [( Q
  20. pxNewListItem->pxPrevious = pxList->pxIndex;; S7 L6 E  L4 S. Z
  21. , S- H1 c% a% F& L8 L6 ^: q
  22. /*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。1 X/ t; }" \6 r( y
  23. 即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这! d' q* R* T3 T6 n( \
  24. 一个结点,除了xListEnd)。*// z0 R, p) t& q, \& o: z

  25. 0 p( M" U: s7 B+ c
  26. /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要
    # E1 z: I/ p' ~- Q
  27. 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的结点。*/
    . i9 Y" f% l* @3 V" {# y# E7 ?, j
  28. pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;4 d& b( S& Q$ _5 _. [  O: P
  29. + C& M4 `% S  @
  30. /*使得当前链表pxList中的pxIndex的下一个(pxNext)指向新插入的结点。*/+ T. g& q, H! V6 }0 v7 e1 J8 C
  31. pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;. Y  ]& i) Z, N' A

  32. 9 B# o7 Z" G8 r9 b% ^
  33. /*使得当前链表pxList中的pxIndex指向新插入的结点。*/
    8 r  R# I8 T* `5 P  D. Y- C
  34. pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;/ i/ R: r4 l- K0 Q+ |' z
  35. 7 J$ P6 i# s; `5 C" B9 D
  36. /* 让pxList知道这是他的结点。 */
    # V$ p0 T0 m" p+ ^- @* q" o$ A+ j
  37. pxNewListItem->pvContainer = ( void * ) pxList;
    # Z, m7 i3 A! w

  38. 0 a6 k  N6 m: s
  39. /*链表结点的数量自加1*/
    $ c/ @  I5 l$ E
  40. ( pxList->uxNumberOfItems )++;
    9 M, C  p; u8 X7 |  y+ F
  41. }
复制代码
指针指来指去的,想想也头大,等下画个图。8 l; L/ w1 {' H) b9 Y
9 T! K; t$ n+ E, R$ a5 ], Y( d0 M
赞 收藏 2 评论3 发布时间:2015-1-8 13:25

举报

3个回答
阿松松 回答时间:2015-1-8 13:50:43
随便画了下,请大神指点。
, O8 e" |- C, Y1 d, y MediaLib_Camera Roll_WP_20150108_001.jpg 5 ~/ ?4 \3 z& j! ~9 f3 y. u; Y
阿松松 回答时间:2015-1-9 15:27:13
本帖最后由 阿松松 于 2015-1-9 15:52 编辑
9 L/ ^4 y" C0 \5 ]8 a, @: d
  1. /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要2 D* w- I+ Q6 r( x3 M
  2. 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的元素。*/
    , s' ^; B* C; h3 I$ |
  3. pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
复制代码

; M  Q% J; l! X5 W% j: _: o" G' I& y. N* f
代码中28行的分析错误二得很,今天看这些代码有新的理解,这样才是正确的。
+ ]; r2 t2 O. L$ R1 F" Z2 Q6 T$ H0 y2 T: E, H4 @
这句代码讲的是:$ B$ N. I; b+ x. Y+ E
使得当前链表pxList中的pxIndex指针中的pxNext指针中的pxIndex指针指向新插入的结点pxNexListIetm,这样解释有点儿罗嗦,简而言之,就是将pxList中pxIndex指向的下一个结点的指向规则不再指向以前的旧结点,而是指向新插入的结点pxNexListIetm6 }% y" ^7 h) q8 f, k# P3 G
) x* D( y8 o  g; V: \- M/ S" J
下面讲的也是扯淡了,勿喷。。。
0 L" ~' p+ |! a9 w
/*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。
% R2 }  a* Y. c0 A即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这9 N1 \( l9 D- a4 Q, h- Y
一个结点,除了xListEnd)。*/
, ?9 m4 s7 P, o5 ^& o  v; \

7 w. b* _3 ^2 t1 ]; B, P7 D2 ^
阿松松 回答时间:2015-1-9 15:31:30
本帖最后由 阿松松 于 2015-1-9 15:44 编辑 $ l3 e3 x8 D% t9 Z2 E: G! p  y
  J  C' f/ N1 w' X9 Y
引用一个大神讲的,看完这个思路才清晰( u) J. z6 H% z" n# D7 x& b
vListInsertEnd 函数将节点插入到链表的最后。所谓的最后,其实就是让  pxList->pxIndex 指向它就行了,因为遍历时是从 pxIndex->pxNext 的开始的,遍历一圈之后最后才能到 pxIndex。
故而插入后,pxIndex->pxNext还是指向以前的结点,那pxIndex就指向了新插入的结点,新插入的结点理所当然的排在了链表的最后。
$ W2 f+ t2 |# ], |6 k( h也没想到,插图倒是正确的了,尴尬5 S1 s/ ~% K$ h: b
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版