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

FreeRTOS源代码分析(tskTaskControlBlock)

[复制链接]
阿松松 发布时间:2015-1-13 14:58
本帖最后由 阿松松 于 2015-1-13 15:49 编辑
$ S3 C* B  F% S+ Z
( u' F0 ^" W  c# L. @/ r! `task.c中,关于TCB。: G3 S% {- y+ n( G4 G
( ^  p: Z+ a( d* l8 C
  1. /*每个任务创建的时候都会分配TCB(任务控制块)。
    6 y8 A5 ?8 R7 e& S
  2. TCB存储着任务状态信息,包括指向任务的上下文(
    5 O: U3 H) }9 E) ^
  3. 任务的运行时刻的环境,包括寄存器的值)的指针。 */
    + ]; _$ p( B0 a) X& z4 \' ]
  4. typedef struct tskTaskControlBlock8 I0 O% u" {, v+ Y1 V, v
  5. {
    1 b" r9 A5 S3 B
  6. /*指向任务堆栈中最后一次存入的item,这个item必须是TCB结构体的第一个成员。*/
    ' K  x: [1 A. i9 D! B/ ]+ T2 D
  7.         volatile portSTACK_TYPE        *pxTopOfStack;
    + a3 U& H9 l. H% E

  8. " s$ X* _9 v( D5 w  U. r" k" Q# K
  9. /*MPU设置被作为port layer(个人理解为平台层)的一部分。这个变量必须是TCB结构体的第二个成员。*/
    9 M: Z: O3 O9 v' ?) k* Z
  10.         #if ( portUSING_MPU_WRAPPERS == 1 )
    1 E  _0 u* ~; C3 j8 r
  11.                 xMPU_SETTINGS xMPUSettings;" \7 w8 P4 f2 e, W1 [
  12.         #endif5 K1 b7 r# D# @) w7 o- i4 D: y/ r

  13. & B3 N5 u, F/ D
  14. /*任务的状态链表结点参考,指示任务的状态(Ready,Blocked,Suspended)*/2 @$ M9 e+ _  ^
  15.         xListItem                                xGenericListItem;
    2 B; ]. r, V- V$ _5 B: \

  16. , Q: _5 {# R& {4 u. E( b3 l8 i) ?
  17. /*用来从事件链表中引用一个任务*/0 u0 |: O& a. [1 N5 t, U
  18.         xListItem                                xEventListItem;) x2 J1 v  ~& U* r
  19. - _- x. ^2 M4 p3 \' p, h
  20. /*任务的优先级,0表示优先级最低*/$ E+ a9 L+ v! V* [  R+ z5 K4 y6 G0 O
  21.         unsigned portBASE_TYPE        uxPriority;
    # z+ Q5 ^0 R3 k# m/ Z6 t) D
  22. 0 i: b: h% P# O. W
  23. /*指向堆栈的开始*/
    0 ~8 O6 o$ t3 B
  24.         portSTACK_TYPE                        *pxStack;: U+ [- Z' V9 A2 g/ {7 g3 e2 y$ J
  25. 0 z) A( q; |# o1 P$ F: |) I
  26. /*创建任务的时候给取的描述性名字。这个功能只用在debug模式。*/
    7 h- a' b$ o" b% Y
  27.         signed char                                pcTaskName[ configMAX_TASK_NAME_LEN ];3 m3 d5 r/ G3 S7 q7 C
  28. ; g; o* R  t; ^  u$ L* Z0 R
  29. /*如果堆栈是正生长的话,定义个指针指向堆栈架构的末尾*/. |+ m1 x4 S, z) M2 Q# p( V) @
  30.         #if ( portSTACK_GROWTH > 0 )
    9 C! j* W1 }4 }/ W% X9 m) [
  31.                 portSTACK_TYPE *pxEndOfStack;
    % K* x+ a% e" Q: B1 y. ?9 x
  32.         #endif0 z2 ?0 Y1 s' f- ]4 [& A7 {
  33. ; l7 P6 c( ~( l4 d) g2 S5 r1 ^
  34. /*若允许临界区嵌套的话,定义嵌套计数器*/) d  W( F. ~% i4 j2 L/ n3 A! E
  35.         #if ( portCRITICAL_NESTING_IN_TCB == 1 )
    / F* `; Q: ~9 j& x* i3 g# |2 l, `4 l
  36.                 unsigned portBASE_TYPE uxCriticalNesting;
    * Z( \/ u* N% w8 `# Q
  37.         #endif5 ^. V& N" b5 g6 f

  38. % b1 R( H' f# S9 e4 F9 @
  39. /*如果使能跟踪功能,会创建一个变量uxTCBNumber,6 Z$ F* D. b' K  D  _
  40. 当TCB创建的时候,变量值会自增。它用来帮助调试人员$ i% {, i! W5 g" Q: a; M' ]# G& f
  41. 判断任务是什么时候删除的,又是什么时候重新创建的。
    ' a8 p7 \# T& I
  42. 此外,还会创建一个变量uxTaskNumber,这个变量是专  H! O% b5 a9 a
  43. 门用来跟踪第三方代码的。*/" M, G1 ]6 N0 S% {8 @1 }9 t
  44.         #if ( configUSE_TRACE_FACILITY == 1 ), p: Z! J  w( Y$ P
  45.                 unsigned portBASE_TYPE        uxTCBNumber;        8 U7 p" l* e+ d; o0 o. S3 v' U0 u- K
  46.                 unsigned portBASE_TYPE  uxTaskNumber;
    7 k- Z9 M8 _( X. `8 _' U& h
  47.         #endif
    0 X9 f. C( i8 w& D

  48. ' m3 ]  n8 h" t' L! \: ?
  49. /*如果使用互斥量,则定义一个变量保存任务最后被分配给的优先级,: v' ~* m" H& Q( P" }
  50. 这个变量为优先级继承机制使用(优先级继承是用来解决优先级反转的问题)*/2 c1 g5 d: H+ J, s
  51.         #if ( configUSE_MUTEXES == 1 )
    2 z+ Z8 Q) n: x  ]
  52.                 unsigned portBASE_TYPE uxBasePriority;        
    7 }( l! z; J* _* W
  53.         #endif
    : X+ B. p3 E4 f( P0 }% I& W8 w
  54. 4 {9 y; e3 Z; \+ B1 O& ?
  55. /*应用任务标签(还不知道用在哪儿)。*/
    3 \2 K% @5 x( u, G8 p: q
  56.         #if ( configUSE_APPLICATION_TASK_TAG == 1 )
    2 u1 w" ~0 J! c" r3 U* z' J; b
  57.                 pdTASK_HOOK_CODE pxTaskTag;
    1 [& J# ]7 I0 a' O/ ?# T2 q6 Q# K8 L! l
  58.         #endif
    . ?4 ]9 I7 v( V4 Q" J

  59. ( ^  S, a* N3 Z0 ~
  60. /*如果生成运行时间状态的话,创建个变量,用来存储任务在运行状态中已经耗费的时间。*/+ y, b8 X2 z7 N! f. s) m: o, l
  61.         #if ( configGENERATE_RUN_TIME_STATS == 1 )
    2 Q- i3 ?5 d3 D  \1 i
  62.                 unsigned long ulRunTimeCounter;
    4 e6 F, Q& |7 |: i7 m
  63.         #endif& f. m9 |2 j7 d2 D3 i0 ^
  64. $ W' ?0 v: k- T
  65. /*(这个特性,不太明白哎,后续补充了。)*/
    ' c' ]8 a% @4 Q6 U3 y# j! h( }
  66.         #if ( configUSE_NEWLIB_REENTRANT == 1 )$ O) E1 z0 T5 @6 P* E
  67.                 /* Allocate a Newlib reent structure that is specific to this task.
    ' j, ~' X0 w3 f! Y
  68.                 Note Newlib support has been included by popular demand, but is not
    , _* U: {8 Z) V, I
  69.                 used by the FreeRTOS maintainers themselves.  FreeRTOS is not4 E% {$ n4 t6 w8 N/ e
  70.                 responsible for resulting newlib operation.  User must be familiar with
    % m1 r& v1 [! P- h8 b
  71.                 newlib and must provide system-wide implementations of the necessary, ~* F2 u+ A& V: T
  72.                 stubs. Be warned that (at the time of writing) the current newlib design5 a+ {; ^2 t! F+ K/ K9 X& X7 K
  73.                 implements a system-wide malloc() that must be provided with locks. */
    ) z  C7 L4 }8 D' q* j
  74.                 struct _reent xNewLib_reent;6 L( q& y/ }6 ]
  75.         #endif" J% Y8 L! f6 N' E  |7 x8 d
  76. ; p7 V- _2 Z2 p* F# \* j
  77. } tskTCB;
复制代码
Enjoy!
* }+ B+ ]0 i! O; S: k
收藏 评论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( P! J$ _; u+ ~
感谢分享!

; x# d2 [" E7 g$ ^谢捧场。。
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版