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

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

[复制链接]
阿松松 发布时间:2015-1-8 13:25
本帖最后由 阿松松 于 2015-1-9 15:29 编辑 . R- c7 L" k0 [3 C  Q) e5 r- ^6 V( C2 B

7 L6 D8 U2 S! E5 N在list.c中,把一个结点插入到链表尾部
2 n  e7 u" b) f1 h6 P' Wvoid vListInsertEnd( xList *pxList, xListItem *pxNewListItem )
2 W+ p0 V8 b9 |9 `4 G  G, w% K  l4 x
0 ~! |, w5 C# ^" {. ?
  1. void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )
    ; P2 z( @3 d  N  V. @2 \7 V( G0 m6 B
  2. {) f! ~' L& v: X) V$ T1 O0 r1 ?
  3. volatile xListItem * pxIndex;6 o% F) {0 j5 E3 f

  4. 5 v  c6 K, x" D
  5. /* 链表中,总是访问由PxIndex指向的链表结点。插入新结点到链表中时,' j4 [8 I* g7 h5 R3 U" o* y1 m
  6. 使得在调用pvListGetOwnerOfNextEntry函数时,新插入的结点是最后一个被移除的,
    $ x5 W4 `0 C# a' i* j) U( y+ Y4 {1 C  y
  7. 而不是对链表排序(说实话官方的这句- A! w' ]/ g: ^  Z1 k: s
  8. Insert a new list item into pxList, but rather than sort the list,
    / A4 D7 G3 k* Y2 q2 {8 G7 ~5 o
  9. makes the new list item the last item to be removed by a call to# p% }5 m- l% h& {7 s% a
  10. pvListGetOwnerOfNextEntry. 我一直搞不懂)。
    - X# `8 A+ D3 s+ @$ a' q5 ^
  11. 这意味着pxIndex必须指向这个新插入的结点。 */  ?6 r. P6 B. v" L& z& u
  12. pxIndex = pxList->pxIndex;0 i7 ^4 G/ q( C5 v3 d. B7 d
  13. % k% j4 y' |8 U. a0 i- v
  14. /*以下两句为新插入结点指定前后结点,可以比喻为孩子找到了爹妈。*/5 e, n" J2 S2 ~4 ]1 `7 k9 q( L
  15. $ S. b* U4 W  B% F
  16. /*使得新插入的结点的下一个结点指向当前链表pxList中的pxIndex的下一个结点。*/$ d, Q" e. x% @  V" [; ?
  17. pxNewListItem->pxNext = pxIndex->pxNext;2 c( d8 u9 M; S+ e% F0 k
  18. 6 L7 D% i  S$ `9 U9 J8 F, ]# r
  19. /*使得新插入的结点的上一个结点指向当前链表pxList中的pxIndex。*/' _" n  E' K# t) e( J  n
  20. pxNewListItem->pxPrevious = pxList->pxIndex;2 M5 b+ B, ^8 Y% O% T4 D

  21. & M! [9 w2 b: Z
  22. /*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。
    : ]; P# m1 [: G- [3 T
  23. 即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这  x% U# N0 ~1 W; O* c7 ^! V
  24. 一个结点,除了xListEnd)。*/
    6 u1 }* `$ L- Q8 D

  25. ( M, B8 n& v/ _5 n9 V$ C3 x' ~, j
  26. /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要1 u; @3 ]; J: E5 z
  27. 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的结点。*/
    " y6 ?* H2 K# f, E" j. c4 v
  28. pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;  n$ f$ @1 `* C9 p; \+ J2 J. }

  29. / H  ?* H% _! t* c
  30. /*使得当前链表pxList中的pxIndex的下一个(pxNext)指向新插入的结点。*/  S4 {. P7 a! f5 [- o
  31. pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;% R9 D) E6 p% F/ Z2 T

  32. 1 n$ B( l1 h! p
  33. /*使得当前链表pxList中的pxIndex指向新插入的结点。*/
    / b6 P, ]6 f' Q
  34. pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;
      ]$ d$ m6 U; _+ Z. j
  35. . O: w4 N( v  \* E; ?
  36. /* 让pxList知道这是他的结点。 */
    # N4 ?% h0 t$ Q
  37. pxNewListItem->pvContainer = ( void * ) pxList;
      j: ]9 o  T6 i5 d

  38. 1 v( V% r  K) D% U  [) r% i
  39. /*链表结点的数量自加1*/
    8 }( G( O% Z( x( F0 W& A
  40. ( pxList->uxNumberOfItems )++;
    ) e; }" f# Y7 W6 ~7 H
  41. }
复制代码
指针指来指去的,想想也头大,等下画个图。' J8 N! q7 B# J. M2 o" t

6 ^$ v' e! h4 X: b( D4 o
收藏 2 评论3 发布时间:2015-1-8 13:25

举报

3个回答
阿松松 回答时间:2015-1-8 13:50:43
随便画了下,请大神指点。
" K" }4 {4 L' h4 b2 b! f MediaLib_Camera Roll_WP_20150108_001.jpg 4 j' x; z& L9 n$ i% K
阿松松 回答时间:2015-1-9 15:27:13
本帖最后由 阿松松 于 2015-1-9 15:52 编辑 1 ~; Z5 |3 O  Q
  1. /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要
    2 i- c3 P$ e( U2 B
  2. 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的元素。*/
    ; d: R; `3 x( g2 M: z* I
  3. pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
复制代码

1 G' s8 j, d2 i' i  `1 e! H
% z6 U& D% u5 ~# g代码中28行的分析错误二得很,今天看这些代码有新的理解,这样才是正确的。/ [+ z" r2 [( I$ m- W2 o
% Y$ z  @5 C5 k
这句代码讲的是:" g' ]7 ~5 L3 p" m  d1 A" }
使得当前链表pxList中的pxIndex指针中的pxNext指针中的pxIndex指针指向新插入的结点pxNexListIetm,这样解释有点儿罗嗦,简而言之,就是将pxList中pxIndex指向的下一个结点的指向规则不再指向以前的旧结点,而是指向新插入的结点pxNexListIetm$ M. m3 y7 K$ n3 ^1 l0 Y
, h: q3 h1 e5 d( T! ^3 l: Z0 K: ]
下面讲的也是扯淡了,勿喷。。。$ @: {+ m  O. _* o5 z
/*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。( `" _$ C" G  b$ j1 T3 y) x- ^
即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这8 a/ s- J( i5 E# f1 g) n* D; x
一个结点,除了xListEnd)。*/

7 k5 V: Q7 @3 l- Z/ Q
5 G. _, z8 F- |7 H$ N8 G( Y: m
阿松松 回答时间:2015-1-9 15:31:30
本帖最后由 阿松松 于 2015-1-9 15:44 编辑
- C& V9 z$ @. v7 y3 q5 k( I
7 e3 e$ b  R+ N引用一个大神讲的,看完这个思路才清晰/ D0 X8 e2 p' J, E* O8 g" A
vListInsertEnd 函数将节点插入到链表的最后。所谓的最后,其实就是让  pxList->pxIndex 指向它就行了,因为遍历时是从 pxIndex->pxNext 的开始的,遍历一圈之后最后才能到 pxIndex。
故而插入后,pxIndex->pxNext还是指向以前的结点,那pxIndex就指向了新插入的结点,新插入的结点理所当然的排在了链表的最后。
* d0 z7 {$ A! ~0 w也没想到,插图倒是正确的了,尴尬
) r  L+ b) e- d! m% |# i9 M" e$ u+ [

所属标签

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