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

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

[复制链接]
阿松松 发布时间:2015-1-9 16:51
本帖最后由 阿松松 于 2015-1-9 23:35 编辑 3 l; \, ?5 n) j+ L# S& u1 f* T
3 B0 ?1 }  ^; d3 m" v5 n
在list.c中,将结点按照升序插入到链表的合适的位置。
" j9 z) q- T" e嗯,升序,就是以xListEnd作为最大值且放在链表结尾的从小到大的一种排序方式。
$ z+ F8 Z6 p+ N7 j7 K5 A2 R0 g$ b4 p( [
vListInsert( xList *pxList, xListItem *pxNewListItem )
! Z1 u+ Z2 x* @" v

. l; V: Z' D9 b. k! z1 m2 W
$ D; q: Y8 C, z7 L/ e  M7 H" S. z2 ]分析此段代码的时候,要记得这样的规则:
链表中,总是访问由PxIndex指向的链表结点。
2 X# r- b+ u. Z& X9 d, x: w9 x
遍历链表的时候,总是访问当前培训Index(本代码中是pxIterator)->Next指向的结点。
9 }0 ?! ~8 e( V) }' s而且,当访问到的结点与要插入的结点值大小相等的时候,是有一个特定的规则的,待补充。。。
  1. void vListInsert( xList *pxList, xListItem *pxNewListItem ) 5 \# `- C; F5 g/ }0 [8 h( ^# e
  2. {
    5 h4 x5 y/ S$ B2 y# ]/ P
  3. /*新建一个指针变量,在for循环中作遍历链表用*/   1 w: K) C7 q. c+ Y9 g3 _
  4. volatile xListItem *pxIterator;
      j4 I0 }2 F6 _, n) x$ I0 K

  5. 4 R- ^. U7 t+ [' i: o  h
  6. /*新建变量,存储新插入结点的值,升序排列时比较用。
    $ H, i* E7 x9 D( I# d: E( Z
  7. 嗯,这个值应该用来存储包含该结点任务的延时时间?*/   
    ' k" N3 p( K: m# G9 c! k+ F5 N
  8. portTickType xValueOfInsertion;
    0 P, l6 e! f; d) _

  9. ! S, ?8 D' g- Q! }; R9 N
  10. /*新建变量,存储新插入结点的值,升序排列时比较用.*/   ) b8 X% k& |1 k0 J+ P
  11. xValueOfInsertion = pxNewListItem->xItemValue;
    0 k! k1 }: y& m# U! x

  12. . ?2 E0 C- Q* |; T3 U+ }0 a  ^( t
  13. /*portMAX_DELAY是链表中能存储的最大的延时时常,也就是xListEnd变量的值,这个变量的使用有待分析。- }: d( C: a6 t8 e/ F+ X
  14. 如果新插入的结点的值等于这个最大值,那么直接把新插入的结点放到xListEnd前面就ok了*/   
    ; X& [+ u' G5 ~" o. l8 h1 E
  15. if( xValueOfInsertion == portMAX_DELAY )
      Q3 f3 J, @& J. t
  16. {
    / D2 M5 f: w& x; |4 \* h4 c6 h
  17. /*这句话也说明了,xListEnd上面的那个结点的值是最大的,即升序排列方式。*/   
    ! T& z+ V% R9 D
  18. pxIterator = pxList->xListEnd.pxPrevious;
    + V. s" f' v& b" P
  19. } 1 T/ `3 A, `3 \" N' g
  20. else 8 R6 f& N; Q1 ]: G: ?. H; Q% p
  21. {
    7 Y5 i' k+ n! J# L8 J" z3 f" |: R
  22. /*否则的话,就要从最xListEnd后面的那个结点开始进行遍历,! n; C' P7 G# o3 ~! a- K
  23. 把链表中的每个结点的值和新插入的结点值对比。*/! |" Y5 O% }0 n5 i; c: A

  24. + `# [- q- {+ A. k
  25. /*如果新插入的结点的值大于链表中pxIterator指针的后一个结点的值(链表中当前遍历到的结点)的值,则表明还没有找到合适的位置,就会一直在for循环中遍历,如果在某一次循环中发现遍历的那个值比新插入的结点的值大,(即pxIterator->pxNext->xItemValue <= xValueOfInsertion),且此时必满足pxIterator->xItemValue > xValueOfInsertion(因为既然遍历到了pxNext,那么pxNext的上一个结点即pxIterator指向的值肯定不满足条件),那么此时跳出for循环。*/
    0 i0 o& w/ a% [
  26. for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext );
    ' r4 m  X4 _! Y6 s: x% i/ i
  27. }
    % d& d- K( b" e) o2 b$ N$ q9 a( g

  28. 2 N; b8 f$ C- |1 w( X/ X
  29. /*在将新结点插入到链表中时,要连接好新结点与上下结点直接的关系,及双向链表的pxNext指针与pxPrevious指针,7 s# n: k. o, e% [# g. G
  30. 即:2 g- {8 l# J: Z
  31. pxNewListItem->pxNext指向下一个元素(与下一个结点之间的关系)& K* L4 c# k1 \
  32. pxNewListItem->pxNex->pxPrevioust指向pxNewListItem(与下一个结点之间的关系)
    & W% C' h! R$ j7 \% R

  33. " q: D9 a% i% Y- G2 b* _
  34. pxNewListItem->pxPrevious 指向上一个元素(与上一个结点之间的关系)
    $ w( `& `" A' J( }
  35. pxNewListItem->pxPrevious ->pxNext指向pxNewListItem(与上一个结点之间的关系)2 d5 S" a( u, r9 `( D( k/ G

  36. ( ?0 Z+ q% y; z5 e8 m
  37. 根据这几点规则,以下的几行代码就不用作分析了,请自行脑补。*/
    - t: o8 _0 R7 `% [1 W

  38.   F% l4 F& K3 B8 h: W. B4 D9 k! g

  39. 7 b5 l3 q7 N# q( k) ~7 r. e# s! \
  40. pxNewListItem->pxNext = pxIterator->pxNext; 1 B6 v0 b* b3 |
  41. pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
    1 C* |4 _$ F9 F$ |% t( J
  42. pxNewListItem->pxPrevious = pxIterator;
    $ `* r- u+ p  s% d2 q
  43. pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem; 7 G) w; }. X% s- T; J9 @
  44. 0 Y, G$ g9 ?+ a# ^$ J" u
  45. /*表明自己已经成功的插入到pxList链表中*/
    & I0 ], r; C, ]% [! ^1 b7 z/ `+ K
  46. pxNewListItem->pvContainer = ( void * ) pxList; & B; t3 y. f0 R8 x, _3 `( x1 p
  47. /*链表中的结点数量自加1*/
    # C$ F2 j$ q3 U; W3 U" @; {
  48. ( pxList->uxNumberOfItems )++; * y3 c4 Z* n, t, P7 n8 ^" }
  49. }
复制代码
. u' `8 n, b6 r5 H* r* x% u3 P

. k; p& O* t1 |9 E8 H( Z$ n没分析完,出去透气,等下来补。。嗯,我又回来更新了,终于完成了,请拍砖。
; F0 K- q# e4 t7 ]  d
( a6 Q9 u) t; N  F) n- V/ [/ Z3 ^; @3 u+ N1 S& D* G7 o
  {) N" I3 k0 F5 u

+ N1 N0 x4 O( ^7 \% z5 T# X# i+ w) C

$ y  }# u' |* p4 O
收藏 评论0 发布时间:2015-1-9 16:51

举报

0个回答

所属标签

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