|
计算代码如下. d6 c% a6 i& V& U+ ~' r0 y* \! a
% g( ?! v2 _+ `2 u- o2 W
while (*ptr == '#')ptr ++;& o, k7 f$ r2 z: l& u
rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
1 |/ d/ v3 U, ?$ u; ^ thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),, ^0 v+ k1 H8 }' L0 N
thread->stack_size,2 I( Q; p+ X* I7 G
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100
- R' g5 W! @6 ^ [3 O# t / thread->stack_size,
% s+ I( H! |: A3 O, @" \0 B6 j thread->remaining_tick,6 @5 l, j7 y' ^9 k
thread->error);
/ M0 Q! K7 d$ W' m/ v(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。
' B- E" v5 f& F
8 n7 O7 N: h4 v8 Q. W( E进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。. }& I2 Z7 J) `
9 X# k3 J! @$ m$ y, c5 ]9 J
在进一步分析 # 从何而来" l" O M# S3 [
7 w1 z- i+ Q3 ?6 P; X7 A( m
static rt_err_t _rt_thread_init(struct rt_thread *thread,
8 c! V' t0 o1 u9 o( }+ k, ]' y const char *name,
! a9 @/ S3 m1 x' q+ C& E void (*entry)(void *parameter),
: v& z0 b( `* m/ T5 ?2 l void *parameter,6 _. K1 b6 W5 \% h4 F
void *stack_start,1 _3 U* f1 p7 l6 G6 U& o
rt_uint32_t stack_size,+ I! S4 g8 }2 ^7 p& r
rt_uint8_t priority,
4 U6 ], T( W: m" u( e8 t rt_uint32_t tick)$ A5 H# d& P6 w1 d( Y
{. q R$ Y/ ^5 j% b
/* init thread list */: j9 w5 C. S0 A/ J: ]
rt_list_init(&(thread->tlist));
" R$ J* U5 l! _+ d$ l& ] thread->entry = (void *)entry;) U( W' m5 w$ P5 u- O
thread->parameter = parameter;
& \. y$ R0 p5 y/ o' A. I9 H /* stack init */6 O: L8 W0 G) I3 y
thread->stack_addr = stack_start;( R }' z1 A/ ]" W0 t
thread->stack_size = stack_size;; Y% c0 s s$ }. I l7 S
/* init thread stack */0 ?6 H' ^& c! ?; j( {
rt_memset(thread->stack_addr, '#', thread->stack_size);. u' g9 F5 Y& ~1 z+ ]& D! o8 e% y1 K
可以看到每个线程在初始化的会将整个栈空间设置为 #。
# V# U, M9 N" r% h |
|