|
计算代码如下" {5 |2 S' [$ j0 Y# e8 L9 r7 i. C
+ H3 K) v7 [6 i, _
while (*ptr == '#')ptr ++;
6 J+ S0 z- a$ V; K/ Q) H. `2 z" w+ h rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
2 c( U0 V$ @& t5 I4 W7 p- D thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
0 m- }! S: y4 P thread->stack_size,% ]- I2 Z) e, z3 Z L4 D4 `# K5 i- c
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100$ R! u9 H/ M) S6 _+ y$ F
/ thread->stack_size,
I% i% [) P; ?" G f4 Y; b+ [& d thread->remaining_tick,
, D- ~$ Q: P# H. {& O thread->error);* X) @+ z7 s N
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。$ I. K2 O( c# R+ b% ?( f% c- _) c
, o1 N. g/ h5 S8 U% i: a5 H
进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。& }! \) A! q' Y0 u# p9 V, {1 r
, A! l% N% s! P在进一步分析 # 从何而来
, R# |, Y$ x1 W/ L2 x0 `
3 z9 n; h8 T; c! B3 F" Qstatic rt_err_t _rt_thread_init(struct rt_thread *thread,6 O" p" u2 Q) w( _2 y
const char *name,
; J# E0 a8 c3 J2 K6 ] void (*entry)(void *parameter),/ z. a B- w$ x# |& H! y1 E
void *parameter,( S* I* u1 Y9 k
void *stack_start,
. A J$ [. k' m3 W: w+ X rt_uint32_t stack_size,! W, T" C4 H4 V. c1 v
rt_uint8_t priority,
3 L2 `, ~/ s% n+ k rt_uint32_t tick)
. Q; n+ I$ |' M: R! g0 z{
b2 |$ o! L! F /* init thread list */3 y7 G4 Q V* W, u) d, U6 s/ X
rt_list_init(&(thread->tlist));- }+ g/ y# U7 v: l
thread->entry = (void *)entry;
! O# _/ X2 C1 P% U* x4 Q3 l thread->parameter = parameter;, K% E6 D3 p3 \* b1 i; _
/* stack init */
/ e0 ]3 K3 |' k. b6 }( A& Z thread->stack_addr = stack_start;
: T, p6 |9 i ]6 j2 B$ M! | thread->stack_size = stack_size;2 J% }8 U2 S9 E, k" s" f0 i, i) z
/* init thread stack */
0 O3 w' f3 z6 o. O rt_memset(thread->stack_addr, '#', thread->stack_size);) j# B) Q2 A/ O6 W% L4 k. T
可以看到每个线程在初始化的会将整个栈空间设置为 #。 d, B* i$ n% O; U
|
|