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

FreeRTOS源代码分析(tskTaskControlBlock)

[复制链接]
阿松松 发布时间:2015-1-13 14:58
本帖最后由 阿松松 于 2015-1-13 15:49 编辑 # U7 @: H2 g& `
" J' k% \3 H# Z% f) G: d
task.c中,关于TCB。
3 s' c! K) K2 g0 M# u4 ^0 @( I3 B! E
  1. /*每个任务创建的时候都会分配TCB(任务控制块)。9 Z) ?5 v! ]2 G/ Z
  2. TCB存储着任务状态信息,包括指向任务的上下文(- n+ z- ^7 q$ [/ B
  3. 任务的运行时刻的环境,包括寄存器的值)的指针。 */
    2 C+ D% {1 S' C  B
  4. typedef struct tskTaskControlBlock
    4 o  U0 n6 @  X5 D. x. y8 i! E
  5. {
    + [/ \: \9 V& ^0 h; D6 g3 U- I
  6. /*指向任务堆栈中最后一次存入的item,这个item必须是TCB结构体的第一个成员。*/! k" Q9 n2 j  R0 }1 Y' f
  7.         volatile portSTACK_TYPE        *pxTopOfStack;8 G6 ~% `* p+ g0 `' o9 [) V

  8. 9 @0 \  S* r$ r9 T) K$ y
  9. /*MPU设置被作为port layer(个人理解为平台层)的一部分。这个变量必须是TCB结构体的第二个成员。*/) [& l/ Q/ L/ U: ?1 I; |+ C
  10.         #if ( portUSING_MPU_WRAPPERS == 1 )% [! Q, W' ], W
  11.                 xMPU_SETTINGS xMPUSettings;5 M" {! I5 C$ ?  g0 r3 \
  12.         #endif
    . c3 ^$ j9 P7 Y( L: c+ v
  13. ( C# r5 g/ E. B$ A: @8 a8 F7 e
  14. /*任务的状态链表结点参考,指示任务的状态(Ready,Blocked,Suspended)*/% \0 m* b, F, F4 p+ K
  15.         xListItem                                xGenericListItem;
    4 u7 p7 Q4 U5 u1 J' }  G! ]

  16. ; h0 L; w& i0 W: c
  17. /*用来从事件链表中引用一个任务*/
    4 s, p1 I2 ]0 K
  18.         xListItem                                xEventListItem;' G. \. r6 L! G( K- Z6 ?4 S+ J/ ^8 F

  19. - z* f; _; b8 F; V; j: J0 f
  20. /*任务的优先级,0表示优先级最低*/) o6 p7 U5 w$ n; N
  21.         unsigned portBASE_TYPE        uxPriority;* R7 H& i) }& k! [: A# A( d
  22. 9 g) t. j4 e4 d& p5 m  R  ~
  23. /*指向堆栈的开始*/8 V0 @3 v9 H3 u8 y% _
  24.         portSTACK_TYPE                        *pxStack;
    * L1 s; q+ ]/ Z2 J9 I! Y

  25. * ?8 `- {" A7 I' _( Q) s* P0 L
  26. /*创建任务的时候给取的描述性名字。这个功能只用在debug模式。*/1 q' @/ R0 \+ B% b$ l
  27.         signed char                                pcTaskName[ configMAX_TASK_NAME_LEN ];
    5 a; F( q; L$ y# V# J$ [

  28. 9 D& g$ C- t4 N7 ?, A3 [* E
  29. /*如果堆栈是正生长的话,定义个指针指向堆栈架构的末尾*/
    3 m& R& y7 M$ S9 \4 p% k& l
  30.         #if ( portSTACK_GROWTH > 0 )* h) N/ k" q( h8 `3 M
  31.                 portSTACK_TYPE *pxEndOfStack;* D& P: W" z0 j" z  C' W( M
  32.         #endif
    3 w' J$ ]1 ^' A, L: p1 i- Q# C0 t
  33. 2 o* p; m* j7 d
  34. /*若允许临界区嵌套的话,定义嵌套计数器*/
    ' V! ^$ X! n# F# e3 v! e
  35.         #if ( portCRITICAL_NESTING_IN_TCB == 1 )
    9 g3 B+ v- W! r+ T. [
  36.                 unsigned portBASE_TYPE uxCriticalNesting;
    8 g# h3 W' ]( ]) {% J
  37.         #endif# x0 }/ o  M8 F2 M6 u; e4 m7 ^$ T

  38. 3 J5 s5 _( Y3 W* f8 f
  39. /*如果使能跟踪功能,会创建一个变量uxTCBNumber,4 K; U! F9 R1 B% J3 G+ S5 }8 k
  40. 当TCB创建的时候,变量值会自增。它用来帮助调试人员
      H& B) F4 r( ?/ k, W3 Q' H
  41. 判断任务是什么时候删除的,又是什么时候重新创建的。
    % W+ M" o, Z* u2 T. L
  42. 此外,还会创建一个变量uxTaskNumber,这个变量是专% s# X# V0 P: T  h1 B7 r- x1 V
  43. 门用来跟踪第三方代码的。*/1 Q6 |' ?8 a  C9 z
  44.         #if ( configUSE_TRACE_FACILITY == 1 )( _: u! n8 N3 c" D
  45.                 unsigned portBASE_TYPE        uxTCBNumber;        
    - K1 K0 X. q. M
  46.                 unsigned portBASE_TYPE  uxTaskNumber;
    , v* O# N. y0 A0 ^5 S. j
  47.         #endif9 c, y; ]+ [" ]' F+ m) t& J

  48. 6 ^, V5 c8 S- g9 o5 d' z2 n$ U
  49. /*如果使用互斥量,则定义一个变量保存任务最后被分配给的优先级,* Z) I: e* }6 ~0 d
  50. 这个变量为优先级继承机制使用(优先级继承是用来解决优先级反转的问题)*/+ Q/ g! ?6 R3 W! Z4 u+ Q
  51.         #if ( configUSE_MUTEXES == 1 ); v' \6 a  e! y' {
  52.                 unsigned portBASE_TYPE uxBasePriority;        
    ; ]. H4 t/ r( c5 f
  53.         #endif
    / c: D. D) g; A3 ~# d

  54. 4 ?' K* e. S( @+ y# N& C
  55. /*应用任务标签(还不知道用在哪儿)。*/2 J3 }8 E  S" Q/ p7 M
  56.         #if ( configUSE_APPLICATION_TASK_TAG == 1 )
    , O3 Z# P! v4 W: e* V+ X6 y
  57.                 pdTASK_HOOK_CODE pxTaskTag;3 H  c* T' W& v; s# L! N- X* i4 ~  T
  58.         #endif
    ; d  K* r! G3 ~) j5 P
  59. ! D; f; A/ d$ h
  60. /*如果生成运行时间状态的话,创建个变量,用来存储任务在运行状态中已经耗费的时间。*/, B- k* E9 Q: f1 O
  61.         #if ( configGENERATE_RUN_TIME_STATS == 1 )1 D' P% t- l- ^; O4 z" T8 o- B
  62.                 unsigned long ulRunTimeCounter;
    ' C" O3 J4 v+ \* }) Q. y) _2 Z
  63.         #endif
    . G6 y3 K& _8 B- m& b
  64.   X* P% I; S3 U5 T# E( P/ y1 G
  65. /*(这个特性,不太明白哎,后续补充了。)*/
    # h) Z9 t, \6 x  r  r
  66.         #if ( configUSE_NEWLIB_REENTRANT == 1 )
    & Y$ S6 s8 s- C$ |/ z) f# j
  67.                 /* Allocate a Newlib reent structure that is specific to this task.
    - C7 y$ z1 d; m! Z, Y. g
  68.                 Note Newlib support has been included by popular demand, but is not
    , _# W5 E6 l  J# `7 _( }
  69.                 used by the FreeRTOS maintainers themselves.  FreeRTOS is not
    # Z# S" a( H% ^1 j
  70.                 responsible for resulting newlib operation.  User must be familiar with3 W/ U* |& b+ P5 X2 x% B8 {: ^
  71.                 newlib and must provide system-wide implementations of the necessary2 g4 D3 g4 d- C; c% ~
  72.                 stubs. Be warned that (at the time of writing) the current newlib design
    " Q0 D6 F; o- J; ~' ], a
  73.                 implements a system-wide malloc() that must be provided with locks. */
    9 o" A* x0 W! s. L: [7 G
  74.                 struct _reent xNewLib_reent;; z1 h, I2 ]% S6 b5 ?/ q, C( O
  75.         #endif' U! t. A7 p' e  }1 @' u

  76. 9 F& X& J  Z2 N% t8 v" r# c
  77. } tskTCB;
复制代码
Enjoy!) A, ]  ?1 r( q( n
赞 收藏 评论6 发布时间:2015-1-13 14:58

举报

6个回答
fjjjnk1234 回答时间:2015-1-13 15:28:38
感谢分享!
阿松松 回答时间:2015-1-13 15:50:14
fjjjnk1234 发表于 2015-1-13 15:28' k6 w& ]; d- j+ v
感谢分享!
* T* k, a  c+ V! \: ?, Q
谢捧场。。
flintlovesam 回答时间:2015-2-11 22:34:02
连优先级翻转也知道 冲这点赞一个
feel-376797 回答时间:2015-2-16 07:24:20
谢谢分享
党国特派员 回答时间:2015-2-16 10:29:02
谢谢分享
foxglove 回答时间:2015-2-16 10:47:49
tskTaskControlBlock
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版