|
|
计算代码如下
7 N; R: |; e, |. G: ^
! ?; F8 o* \6 c1 t9 H1 S. C1 P% t while (*ptr == '#')ptr ++;& o8 s `% d% p- w5 H [
rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
) J0 w9 |, v* `4 F e thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
- d; |* b% G% ?; k7 x/ ~ thread->stack_size,
& A; ]0 a6 Y1 }# |% t4 `' [4 Z (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100
3 M: E8 |: p& C. x) f! j* l/ E0 T / thread->stack_size,( o+ C" N3 _3 ~
thread->remaining_tick,
9 O/ ?. n; u9 L7 r F8 f thread->error);3 P. f9 \" F# n/ w
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。% w; G( b7 _+ d' ?5 q- }
( E* s, W" ]3 Z进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。6 [) I ~7 U2 `
0 X: r$ t3 Q4 y在进一步分析 # 从何而来+ }7 e- `* m- o1 Q* a; x
/ W$ i; W1 Y& ~; i* ?static rt_err_t _rt_thread_init(struct rt_thread *thread,
; p3 Z8 c6 w: M, `- V const char *name,. J. \2 k5 M0 L" ~9 k7 m" N
void (*entry)(void *parameter),, Q5 U0 n. U- O- w
void *parameter,& Z) J- g. c4 U2 p4 ]0 A
void *stack_start,
1 d' i4 q4 w! p2 w! c1 y' j' C+ d5 h rt_uint32_t stack_size,
2 ]$ B! w# ` |$ l rt_uint8_t priority,1 E# w+ B; }; E1 T) J, U+ q
rt_uint32_t tick)
3 q: _, o' }! |7 V* N; |{
' F4 f/ y8 \5 |8 |" @ /* init thread list */
! ]2 c# v1 t' E rt_list_init(&(thread->tlist));8 o8 a1 [! b: s5 [( P
thread->entry = (void *)entry;( }, Z: I8 v2 ?- V) W
thread->parameter = parameter;
& ?1 j5 f" l* k) \, y /* stack init */
& I6 p/ w/ ] c0 N0 @. ~ thread->stack_addr = stack_start;8 X# A7 s7 ~4 @5 Z* k6 Y
thread->stack_size = stack_size;
8 a F! i5 y5 N# O8 m /* init thread stack */8 o r) M6 ?6 n+ l. Y( k6 I z
rt_memset(thread->stack_addr, '#', thread->stack_size);
& ^$ p; b# F0 C- H1 a可以看到每个线程在初始化的会将整个栈空间设置为 #。
9 e e( J0 r! ` |
|