|
|
计算代码如下8 i. r" Y ^. _* Z/ a* u: r
9 _! G! |/ _- z) z( E* Y) V1 x
while (*ptr == '#')ptr ++; m8 r5 N6 s$ T- J4 r: S
rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
7 T2 Y. e/ j* U3 w thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), M+ [1 p7 e& f4 Q* P# T2 I, P9 G1 R
thread->stack_size,) N0 E4 i; C" J1 Y* g% w
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100: M$ _9 p. l+ p* P+ H
/ thread->stack_size,4 n y# I( s8 a5 f7 L
thread->remaining_tick,
" s9 o# M5 {( n# I% M( M) I thread->error);
9 C. |1 P# w) ~/ [& E( B7 k9 _(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。. l6 a& V/ _! l
1 a% E. s: c6 `* r; J, o进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。
' }4 P% H# G9 y- Q( A' P: R9 X* F) w, k
在进一步分析 # 从何而来
9 b- M! m6 Q k: h6 L. O! D5 e$ v- C6 w
static rt_err_t _rt_thread_init(struct rt_thread *thread," Z3 ?! L0 o) X) z" u
const char *name,
4 g4 ^8 h& Y H0 U \ void (*entry)(void *parameter),* I) {) ~; H) X9 n5 J" S" R8 Z8 T2 }
void *parameter,
5 d* X( Y6 I& |6 G4 d8 [2 q void *stack_start,
* g; W: S/ h0 E4 M5 Q7 z* E! _ rt_uint32_t stack_size,
! S# R+ k. u1 r" E" q% k" P rt_uint8_t priority,
) v8 F# u% B3 i5 C7 b# h rt_uint32_t tick)
; Z+ j3 ^+ w$ | c7 W{; i+ R6 K7 S/ c' C
/* init thread list */% w; b! C' L0 l4 Z
rt_list_init(&(thread->tlist));
- p9 s9 ^% n5 K) ^7 a/ I thread->entry = (void *)entry;( [1 f. U: H# w' r3 `) P! a! @, r
thread->parameter = parameter;9 I: w4 Y; I: ~4 f3 p
/* stack init */
8 f7 K4 [/ _# o; a, v thread->stack_addr = stack_start;
. a3 [$ j1 r! i# L thread->stack_size = stack_size;
2 M) X0 x. F3 N* A6 C1 _ /* init thread stack */. D1 P3 I4 R. w& i! \% D, T
rt_memset(thread->stack_addr, '#', thread->stack_size);: @8 {" E+ ^+ t0 x, a6 O
可以看到每个线程在初始化的会将整个栈空间设置为 #。
& H0 O7 X) _" _" }( | |
|