本帖最后由 阿松松 于 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
- /*每个任务创建的时候都会分配TCB(任务控制块)。9 Z) ?5 v! ]2 G/ Z
- TCB存储着任务状态信息,包括指向任务的上下文(- n+ z- ^7 q$ [/ B
- 任务的运行时刻的环境,包括寄存器的值)的指针。 */
2 C+ D% {1 S' C B - typedef struct tskTaskControlBlock
4 o U0 n6 @ X5 D. x. y8 i! E - {
+ [/ \: \9 V& ^0 h; D6 g3 U- I - /*指向任务堆栈中最后一次存入的item,这个item必须是TCB结构体的第一个成员。*/! k" Q9 n2 j R0 }1 Y' f
- volatile portSTACK_TYPE *pxTopOfStack;8 G6 ~% `* p+ g0 `' o9 [) V
9 @0 \ S* r$ r9 T) K$ y- /*MPU设置被作为port layer(个人理解为平台层)的一部分。这个变量必须是TCB结构体的第二个成员。*/) [& l/ Q/ L/ U: ?1 I; |+ C
- #if ( portUSING_MPU_WRAPPERS == 1 )% [! Q, W' ], W
- xMPU_SETTINGS xMPUSettings;5 M" {! I5 C$ ? g0 r3 \
- #endif
. c3 ^$ j9 P7 Y( L: c+ v - ( C# r5 g/ E. B$ A: @8 a8 F7 e
- /*任务的状态链表结点参考,指示任务的状态(Ready,Blocked,Suspended)*/% \0 m* b, F, F4 p+ K
- xListItem xGenericListItem;
4 u7 p7 Q4 U5 u1 J' } G! ]
; h0 L; w& i0 W: c- /*用来从事件链表中引用一个任务*/
4 s, p1 I2 ]0 K - xListItem xEventListItem;' G. \. r6 L! G( K- Z6 ?4 S+ J/ ^8 F
- z* f; _; b8 F; V; j: J0 f- /*任务的优先级,0表示优先级最低*/) o6 p7 U5 w$ n; N
- unsigned portBASE_TYPE uxPriority;* R7 H& i) }& k! [: A# A( d
- 9 g) t. j4 e4 d& p5 m R ~
- /*指向堆栈的开始*/8 V0 @3 v9 H3 u8 y% _
- portSTACK_TYPE *pxStack;
* L1 s; q+ ]/ Z2 J9 I! Y
* ?8 `- {" A7 I' _( Q) s* P0 L- /*创建任务的时候给取的描述性名字。这个功能只用在debug模式。*/1 q' @/ R0 \+ B% b$ l
- signed char pcTaskName[ configMAX_TASK_NAME_LEN ];
5 a; F( q; L$ y# V# J$ [
9 D& g$ C- t4 N7 ?, A3 [* E- /*如果堆栈是正生长的话,定义个指针指向堆栈架构的末尾*/
3 m& R& y7 M$ S9 \4 p% k& l - #if ( portSTACK_GROWTH > 0 )* h) N/ k" q( h8 `3 M
- portSTACK_TYPE *pxEndOfStack;* D& P: W" z0 j" z C' W( M
- #endif
3 w' J$ ]1 ^' A, L: p1 i- Q# C0 t - 2 o* p; m* j7 d
- /*若允许临界区嵌套的话,定义嵌套计数器*/
' V! ^$ X! n# F# e3 v! e - #if ( portCRITICAL_NESTING_IN_TCB == 1 )
9 g3 B+ v- W! r+ T. [ - unsigned portBASE_TYPE uxCriticalNesting;
8 g# h3 W' ]( ]) {% J - #endif# x0 }/ o M8 F2 M6 u; e4 m7 ^$ T
3 J5 s5 _( Y3 W* f8 f- /*如果使能跟踪功能,会创建一个变量uxTCBNumber,4 K; U! F9 R1 B% J3 G+ S5 }8 k
- 当TCB创建的时候,变量值会自增。它用来帮助调试人员
H& B) F4 r( ?/ k, W3 Q' H - 判断任务是什么时候删除的,又是什么时候重新创建的。
% W+ M" o, Z* u2 T. L - 此外,还会创建一个变量uxTaskNumber,这个变量是专% s# X# V0 P: T h1 B7 r- x1 V
- 门用来跟踪第三方代码的。*/1 Q6 |' ?8 a C9 z
- #if ( configUSE_TRACE_FACILITY == 1 )( _: u! n8 N3 c" D
- unsigned portBASE_TYPE uxTCBNumber;
- K1 K0 X. q. M - unsigned portBASE_TYPE uxTaskNumber;
, v* O# N. y0 A0 ^5 S. j - #endif9 c, y; ]+ [" ]' F+ m) t& J
6 ^, V5 c8 S- g9 o5 d' z2 n$ U- /*如果使用互斥量,则定义一个变量保存任务最后被分配给的优先级,* Z) I: e* }6 ~0 d
- 这个变量为优先级继承机制使用(优先级继承是用来解决优先级反转的问题)*/+ Q/ g! ?6 R3 W! Z4 u+ Q
- #if ( configUSE_MUTEXES == 1 ); v' \6 a e! y' {
- unsigned portBASE_TYPE uxBasePriority;
; ]. H4 t/ r( c5 f - #endif
/ c: D. D) g; A3 ~# d
4 ?' K* e. S( @+ y# N& C- /*应用任务标签(还不知道用在哪儿)。*/2 J3 }8 E S" Q/ p7 M
- #if ( configUSE_APPLICATION_TASK_TAG == 1 )
, O3 Z# P! v4 W: e* V+ X6 y - pdTASK_HOOK_CODE pxTaskTag;3 H c* T' W& v; s# L! N- X* i4 ~ T
- #endif
; d K* r! G3 ~) j5 P - ! D; f; A/ d$ h
- /*如果生成运行时间状态的话,创建个变量,用来存储任务在运行状态中已经耗费的时间。*/, B- k* E9 Q: f1 O
- #if ( configGENERATE_RUN_TIME_STATS == 1 )1 D' P% t- l- ^; O4 z" T8 o- B
- unsigned long ulRunTimeCounter;
' C" O3 J4 v+ \* }) Q. y) _2 Z - #endif
. G6 y3 K& _8 B- m& b - X* P% I; S3 U5 T# E( P/ y1 G
- /*(这个特性,不太明白哎,后续补充了。)*/
# h) Z9 t, \6 x r r - #if ( configUSE_NEWLIB_REENTRANT == 1 )
& Y$ S6 s8 s- C$ |/ z) f# j - /* Allocate a Newlib reent structure that is specific to this task.
- C7 y$ z1 d; m! Z, Y. g - Note Newlib support has been included by popular demand, but is not
, _# W5 E6 l J# `7 _( } - used by the FreeRTOS maintainers themselves. FreeRTOS is not
# Z# S" a( H% ^1 j - responsible for resulting newlib operation. User must be familiar with3 W/ U* |& b+ P5 X2 x% B8 {: ^
- newlib and must provide system-wide implementations of the necessary2 g4 D3 g4 d- C; c% ~
- stubs. Be warned that (at the time of writing) the current newlib design
" Q0 D6 F; o- J; ~' ], a - implements a system-wide malloc() that must be provided with locks. */
9 o" A* x0 W! s. L: [7 G - struct _reent xNewLib_reent;; z1 h, I2 ]% S6 b5 ?/ q, C( O
- #endif' U! t. A7 p' e }1 @' u
9 F& X& J Z2 N% t8 v" r# c- } tskTCB;
复制代码 Enjoy!) A, ] ?1 r( q( n
|
谢捧场。。