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

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

[复制链接]
阿松松 发布时间:2015-1-9 16:51
本帖最后由 阿松松 于 2015-1-9 23:35 编辑
; r& U' F& }3 s
+ C! K$ j! P- ]+ G/ s1 ?1 z6 D" L7 d在list.c中,将结点按照升序插入到链表的合适的位置。
, v- D: |. z( z! ]嗯,升序,就是以xListEnd作为最大值且放在链表结尾的从小到大的一种排序方式。
5 T1 H  x, w: U: i2 o: u" M/ E9 ^, G! e9 u9 a
vListInsert( xList *pxList, xListItem *pxNewListItem )- I. w1 @; I7 p1 H* R, u2 o

3 O- y8 t, \1 F! d) `! \8 F- u" D  S6 h' s
分析此段代码的时候,要记得这样的规则:
链表中,总是访问由PxIndex指向的链表结点。
! O, g  n! z! u8 i
遍历链表的时候,总是访问当前培训Index(本代码中是pxIterator)->Next指向的结点。- N% Z! v% M* A1 U
而且,当访问到的结点与要插入的结点值大小相等的时候,是有一个特定的规则的,待补充。。。
  1. void vListInsert( xList *pxList, xListItem *pxNewListItem ) * l3 e! k. J% a! D- P/ Q- k
  2. {   g' S' J4 \- J) M# h; H, i
  3. /*新建一个指针变量,在for循环中作遍历链表用*/   3 w+ W4 Y& g/ ]( Q, Y! y7 f
  4. volatile xListItem *pxIterator;
    $ R. b! g( {  A% m+ F8 S

  5. * f$ c) w& X: k
  6. /*新建变量,存储新插入结点的值,升序排列时比较用。8 k0 s7 y0 \: Q' q0 L
  7. 嗯,这个值应该用来存储包含该结点任务的延时时间?*/   # ^6 h9 i' a8 N/ C2 R
  8. portTickType xValueOfInsertion; - i2 `# o  \+ [! \, H/ C& G

  9. 8 T- M- a( ^' S1 w/ d+ N7 E9 X) }
  10. /*新建变量,存储新插入结点的值,升序排列时比较用.*/   ) ?2 J$ ~2 H, E
  11. xValueOfInsertion = pxNewListItem->xItemValue; ) w: a$ d7 s" u- U& u9 W

  12. 1 {! h& W, Y) k) k$ T
  13. /*portMAX_DELAY是链表中能存储的最大的延时时常,也就是xListEnd变量的值,这个变量的使用有待分析。
    3 S+ V/ V7 A( R/ j; P3 @
  14. 如果新插入的结点的值等于这个最大值,那么直接把新插入的结点放到xListEnd前面就ok了*/   $ T" |9 E' x% v8 F
  15. if( xValueOfInsertion == portMAX_DELAY )
    % _  r5 B# s9 H; U2 p
  16. {
    - _/ ~  q! K* c
  17. /*这句话也说明了,xListEnd上面的那个结点的值是最大的,即升序排列方式。*/   
    % F" N5 w- l4 h9 _; ^- ^5 L1 B
  18. pxIterator = pxList->xListEnd.pxPrevious; 2 M  ?6 m, A2 @) P
  19. } ! M) l3 l. H; j9 }/ ]
  20. else , l+ Z# l9 c( z( a0 a0 n# F
  21. {
    % Y$ H1 _! R1 }% O* O3 O
  22. /*否则的话,就要从最xListEnd后面的那个结点开始进行遍历,
    0 U. Q( W, ^, F6 @' {; L
  23. 把链表中的每个结点的值和新插入的结点值对比。*/% a% i1 n: K& s9 h  l4 t

  24. ! T% C, g9 s# {
  25. /*如果新插入的结点的值大于链表中pxIterator指针的后一个结点的值(链表中当前遍历到的结点)的值,则表明还没有找到合适的位置,就会一直在for循环中遍历,如果在某一次循环中发现遍历的那个值比新插入的结点的值大,(即pxIterator->pxNext->xItemValue <= xValueOfInsertion),且此时必满足pxIterator->xItemValue > xValueOfInsertion(因为既然遍历到了pxNext,那么pxNext的上一个结点即pxIterator指向的值肯定不满足条件),那么此时跳出for循环。*/. K+ _, ~! B9 O# c9 V
  26. for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ); : l; w( ^) k2 y; S$ }- P% W
  27. } & C/ g. `0 C0 r8 p! b) E1 C

  28. 6 q6 y2 |0 ~$ h' ?+ ~& _; ?$ F
  29. /*在将新结点插入到链表中时,要连接好新结点与上下结点直接的关系,及双向链表的pxNext指针与pxPrevious指针,
    5 |! X# m, b5 k& y) y. }1 i
  30. 即:, z& d4 V/ S, U( u) ^
  31. pxNewListItem->pxNext指向下一个元素(与下一个结点之间的关系)% @; K1 d* a3 r
  32. pxNewListItem->pxNex->pxPrevioust指向pxNewListItem(与下一个结点之间的关系)
    % v& L2 s( U8 l
  33. + S4 S" Y8 x# O: p' A
  34. pxNewListItem->pxPrevious 指向上一个元素(与上一个结点之间的关系)
    ( }6 T" T6 a4 b
  35. pxNewListItem->pxPrevious ->pxNext指向pxNewListItem(与上一个结点之间的关系)1 B/ C7 A& a8 E2 T2 N$ ?5 o0 _* t4 s3 U+ V
  36. . t! Q5 w  L- |! a) t' ?
  37. 根据这几点规则,以下的几行代码就不用作分析了,请自行脑补。*/
    ) |/ W5 ?$ H( I4 k/ j
  38. 8 |. }" C6 a0 m$ i3 L3 g

  39. 6 Z/ _9 }" d) z# O! z6 \; \
  40. pxNewListItem->pxNext = pxIterator->pxNext;
    8 l% w2 B+ ?; v. f( q6 {3 e7 o
  41. pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
    % P+ p* E) f$ M5 L0 e  F
  42. pxNewListItem->pxPrevious = pxIterator; 0 [- }- v' K5 p# X& M9 Q( {# g8 P
  43. pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem;
    1 v7 v) _3 T# O4 K

  44. 5 C. N( O% e0 H3 @% i
  45. /*表明自己已经成功的插入到pxList链表中*/8 P( h/ k) ^8 h0 ]
  46. pxNewListItem->pvContainer = ( void * ) pxList; ' X1 M6 `$ K! l7 h' U: Q
  47. /*链表中的结点数量自加1*/
    ' }2 H  r0 I; D% S
  48. ( pxList->uxNumberOfItems )++;
    % v5 k7 [$ i1 |1 @  @, M& z
  49. }
复制代码
: ]0 l" p& d( n4 E
: B; b) h) `3 j- m' W2 o
没分析完,出去透气,等下来补。。嗯,我又回来更新了,终于完成了,请拍砖。5 D1 E% o. h+ E, S8 a: E- h& Y

( K- q4 G- ~) q% z: y) `
0 J- D* T1 z5 O/ d- I: l/ U/ K/ H% J% J7 E* b& e
8 R# q: q& d# ~$ a4 f3 [

5 t& f  n% ~" ^5 l+ Q" o, L) U4 [& ?5 L9 u
收藏 评论0 发布时间:2015-1-9 16:51

举报

0个回答

所属标签

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