本帖最后由 阿松松 于 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
- /*每个任务创建的时候都会分配TCB(任务控制块)。
6 y8 A5 ?8 R7 e& S - TCB存储着任务状态信息,包括指向任务的上下文(
5 O: U3 H) }9 E) ^ - 任务的运行时刻的环境,包括寄存器的值)的指针。 */
+ ]; _$ p( B0 a) X& z4 \' ] - typedef struct tskTaskControlBlock8 I0 O% u" {, v+ Y1 V, v
- {
1 b" r9 A5 S3 B - /*指向任务堆栈中最后一次存入的item,这个item必须是TCB结构体的第一个成员。*/
' K x: [1 A. i9 D! B/ ]+ T2 D - volatile portSTACK_TYPE *pxTopOfStack;
+ a3 U& H9 l. H% E
" s$ X* _9 v( D5 w U. r" k" Q# K- /*MPU设置被作为port layer(个人理解为平台层)的一部分。这个变量必须是TCB结构体的第二个成员。*/
9 M: Z: O3 O9 v' ?) k* Z - #if ( portUSING_MPU_WRAPPERS == 1 )
1 E _0 u* ~; C3 j8 r - xMPU_SETTINGS xMPUSettings;" \7 w8 P4 f2 e, W1 [
- #endif5 K1 b7 r# D# @) w7 o- i4 D: y/ r
& B3 N5 u, F/ D- /*任务的状态链表结点参考,指示任务的状态(Ready,Blocked,Suspended)*/2 @$ M9 e+ _ ^
- xListItem xGenericListItem;
2 B; ]. r, V- V$ _5 B: \
, Q: _5 {# R& {4 u. E( b3 l8 i) ?- /*用来从事件链表中引用一个任务*/0 u0 |: O& a. [1 N5 t, U
- xListItem xEventListItem;) x2 J1 v ~& U* r
- - _- x. ^2 M4 p3 \' p, h
- /*任务的优先级,0表示优先级最低*/$ E+ a9 L+ v! V* [ R+ z5 K4 y6 G0 O
- unsigned portBASE_TYPE uxPriority;
# z+ Q5 ^0 R3 k# m/ Z6 t) D - 0 i: b: h% P# O. W
- /*指向堆栈的开始*/
0 ~8 O6 o$ t3 B - portSTACK_TYPE *pxStack;: U+ [- Z' V9 A2 g/ {7 g3 e2 y$ J
- 0 z) A( q; |# o1 P$ F: |) I
- /*创建任务的时候给取的描述性名字。这个功能只用在debug模式。*/
7 h- a' b$ o" b% Y - signed char pcTaskName[ configMAX_TASK_NAME_LEN ];3 m3 d5 r/ G3 S7 q7 C
- ; g; o* R t; ^ u$ L* Z0 R
- /*如果堆栈是正生长的话,定义个指针指向堆栈架构的末尾*/. |+ m1 x4 S, z) M2 Q# p( V) @
- #if ( portSTACK_GROWTH > 0 )
9 C! j* W1 }4 }/ W% X9 m) [ - portSTACK_TYPE *pxEndOfStack;
% K* x+ a% e" Q: B1 y. ?9 x - #endif0 z2 ?0 Y1 s' f- ]4 [& A7 {
- ; l7 P6 c( ~( l4 d) g2 S5 r1 ^
- /*若允许临界区嵌套的话,定义嵌套计数器*/) d W( F. ~% i4 j2 L/ n3 A! E
- #if ( portCRITICAL_NESTING_IN_TCB == 1 )
/ F* `; Q: ~9 j& x* i3 g# |2 l, `4 l - unsigned portBASE_TYPE uxCriticalNesting;
* Z( \/ u* N% w8 `# Q - #endif5 ^. V& N" b5 g6 f
% b1 R( H' f# S9 e4 F9 @- /*如果使能跟踪功能,会创建一个变量uxTCBNumber,6 Z$ F* D. b' K D _
- 当TCB创建的时候,变量值会自增。它用来帮助调试人员$ i% {, i! W5 g" Q: a; M' ]# G& f
- 判断任务是什么时候删除的,又是什么时候重新创建的。
' a8 p7 \# T& I - 此外,还会创建一个变量uxTaskNumber,这个变量是专 H! O% b5 a9 a
- 门用来跟踪第三方代码的。*/" M, G1 ]6 N0 S% {8 @1 }9 t
- #if ( configUSE_TRACE_FACILITY == 1 ), p: Z! J w( Y$ P
- unsigned portBASE_TYPE uxTCBNumber; 8 U7 p" l* e+ d; o0 o. S3 v' U0 u- K
- unsigned portBASE_TYPE uxTaskNumber;
7 k- Z9 M8 _( X. `8 _' U& h - #endif
0 X9 f. C( i8 w& D
' m3 ] n8 h" t' L! \: ?- /*如果使用互斥量,则定义一个变量保存任务最后被分配给的优先级,: v' ~* m" H& Q( P" }
- 这个变量为优先级继承机制使用(优先级继承是用来解决优先级反转的问题)*/2 c1 g5 d: H+ J, s
- #if ( configUSE_MUTEXES == 1 )
2 z+ Z8 Q) n: x ] - unsigned portBASE_TYPE uxBasePriority;
7 }( l! z; J* _* W - #endif
: X+ B. p3 E4 f( P0 }% I& W8 w - 4 {9 y; e3 Z; \+ B1 O& ?
- /*应用任务标签(还不知道用在哪儿)。*/
3 \2 K% @5 x( u, G8 p: q - #if ( configUSE_APPLICATION_TASK_TAG == 1 )
2 u1 w" ~0 J! c" r3 U* z' J; b - pdTASK_HOOK_CODE pxTaskTag;
1 [& J# ]7 I0 a' O/ ?# T2 q6 Q# K8 L! l - #endif
. ?4 ]9 I7 v( V4 Q" J
( ^ S, a* N3 Z0 ~- /*如果生成运行时间状态的话,创建个变量,用来存储任务在运行状态中已经耗费的时间。*/+ y, b8 X2 z7 N! f. s) m: o, l
- #if ( configGENERATE_RUN_TIME_STATS == 1 )
2 Q- i3 ?5 d3 D \1 i - unsigned long ulRunTimeCounter;
4 e6 F, Q& |7 |: i7 m - #endif& f. m9 |2 j7 d2 D3 i0 ^
- $ W' ?0 v: k- T
- /*(这个特性,不太明白哎,后续补充了。)*/
' c' ]8 a% @4 Q6 U3 y# j! h( } - #if ( configUSE_NEWLIB_REENTRANT == 1 )$ O) E1 z0 T5 @6 P* E
- /* Allocate a Newlib reent structure that is specific to this task.
' j, ~' X0 w3 f! Y - Note Newlib support has been included by popular demand, but is not
, _* U: {8 Z) V, I - used by the FreeRTOS maintainers themselves. FreeRTOS is not4 E% {$ n4 t6 w8 N/ e
- responsible for resulting newlib operation. User must be familiar with
% m1 r& v1 [! P- h8 b - newlib and must provide system-wide implementations of the necessary, ~* F2 u+ A& V: T
- stubs. Be warned that (at the time of writing) the current newlib design5 a+ {; ^2 t! F+ K/ K9 X& X7 K
- implements a system-wide malloc() that must be provided with locks. */
) z C7 L4 }8 D' q* j - struct _reent xNewLib_reent;6 L( q& y/ }6 ]
- #endif" J% Y8 L! f6 N' E |7 x8 d
- ; p7 V- _2 Z2 p* F# \* j
- } tskTCB;
复制代码 Enjoy!
* }+ B+ ]0 i! O; S: k |
谢捧场。。