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

FreeRTOS源代码分析vListInitialise( xList *pxList )

[复制链接]
阿松松 发布时间:2015-1-8 11:36
本帖最后由 阿松松 于 2015-1-8 11:44 编辑 ; P* C+ A) `& r5 h* W

9 M5 g' }$ H! T5 w7 _  W' j" E2 |最近在学习FreeRTOS,因为对系统的架构不懂,学习的时候总是似懂非懂,不知道如何运用这几天看了FreeRTOS的源码,每次认真分析总能有不同的收获,不管是对是错,与大家分析,也请指正。
( j3 I/ B( l+ m8 u3 m
! w( S" `/ n& r( T7 K- i在list.c中,
, ?+ H+ b) h: W8 i3 O初始化链表:& ^3 ^7 q: J" O, }1 D; L
void vListInitialise( xList *pxList ): K/ ]+ J1 x. h2 g: ]# ]

4 O1 \9 \; w$ H/ e5 W
  1. void vListInitialise( xList *pxList )2 W% U0 |2 Y  y: n
  2. {
    , @, u, F  T7 W0 a' s; E
  3. /* 链表结构包含一个用来标志链表结束的链表元素,初始化链
    ' k0 R& m9 M$ [8 u: J) R
  4. 表的时候,链表结束元素被当作链表的唯一入口。 */
    ) I! ?/ B7 s5 d
  5. pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd );, B( O2 Z7 v8 x# ?, B$ c. x

  6. # V& r$ Y& \$ O  Y; ]
  7. /* 为了确保链表元素是链表的结束,链表结束元素值必须是链表中最大的值。*/; d6 f* Z! C4 M7 C1 o: [" M' T2 ^
  8. pxList->xListEnd.xItemValue = portMAX_DELAY;
    9 f. L& T$ [8 u$ }7 x+ m

  9. - B6 E- t* K9 m: X
  10. /*链表结束元素的Next和Previous指针都指向它自己,这样的话就能知道什么时候链表为空。 */
    5 l# W( s4 n. |, V4 X8 u+ K8 y
  11. /*链表结束元素的Next指针指向自己,之所以用&是因为XListEnd本身只是结构体变量,而不是指针变量。*/
    " Y. f2 f7 L" `2 {
  12. pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd );& M# @  N9 z; ^' W$ \3 j# K
  13. /*链表结束元素的Previous指针指向自己,之所以用&是因为XListEnd本身只是结构体变量,而不是指针变量。*/
    4 n4 h( s  \0 l4 V: }2 N
  14. pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd );. v  O6 w+ n- k1 z- p
  15. % Q2 n6 p& G6 E1 _7 A! Z
  16. /*此时链表中的元素个数还是0*/
    " A8 c% ]0 p! T3 ]& L0 E
  17. pxList->uxNumberOfItems = 0;/ a3 ^& ]; U& |& Z* @  L3 _7 l# n
  18. }
复制代码

, a* W: _  o, o0 h  v4 X3 }+ w以上分析完毕,菜鸟初学,请大神拍砖。  J" _8 d, k; E3 D$ z
希望和大家多多讨论, N* G7 h) b+ P, A/ X
& H6 K* Z( q* z- g0 A
赞 收藏 1 评论3 发布时间:2015-1-8 11:36

举报

3个回答
阿松松 回答时间:2015-1-8 14:29:51
参考官方List.h里面的一段话
  1. * Lists are created already containing one list item.  The value of this
    / G1 [2 T0 \; s  o, ~" V
  2. * item is the maximum possible that can be stored, it is therefore always at0 k$ _( d+ j# d/ [
  3. * the end of the list and acts as a marker.  
复制代码
这段话一部分意思就是说:链表在被创建的时候就包含了一个链表元素,这个元素的值是可能被存储的最大值,因此,它必须一致在链表的末尾作为一个标志。
, F4 V3 o4 S5 O3 y
阿松松 回答时间:2015-1-12 18:26:22
顺便附上初始化结点的代码,其实很简单的了,就是确保这个结点不属于任何一个链表,难道新建结点的时候,结点就已经心有所属了不成?哈哈。。。# G* D) _% C4 `: p

) K2 t4 V# S+ ~( q/ s
  1. void vListInitialiseItem( xListItem * const pxItem ); D4 N! a' c1 x+ t8 e' M# L$ n2 u
  2. {& k: Y8 D. P) S  c
  3.         /* Make sure the list item is not recorded as being on a list. */
    ; @, d2 w" Y; w- B
  4.         pxItem->pvContainer = NULL;9 H$ y. \4 K+ d# Q4 r: H+ f
  5. }
复制代码
我是酱油哥 回答时间:2015-1-12 19:45:54
不错 不错
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版