|
|
计算代码如下
# B* J6 U I; L$ e7 J, ?! ]7 Q- c; p Q' P
while (*ptr == '#')ptr ++;# s, H. |& |: z, @3 W* b
rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
/ ~! ?1 a7 p# f2 } thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),5 x4 s/ k) G9 U
thread->stack_size,
& q" d0 L, c# \3 A. ]# ]3 s. S$ x( |8 X (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100& x& b) U* t1 |% t5 O! M: a5 Y' J
/ thread->stack_size,
0 r1 X% \! G. L) l, \2 S thread->remaining_tick,. V0 r' ?9 n4 x5 w8 ]! ^
thread->error);$ ]3 v. }" w$ R9 q( U- K
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。% ~: Q* s: U% [9 g3 ^; r1 ?) Q
! {3 V/ Y$ a6 C& B进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。
9 }" e' @: Q" s$ l& `( m; B# F g+ U/ N! ~: \: o* f. B
在进一步分析 # 从何而来
1 |6 p2 {. z& N9 H# ^% n! I2 g& {( w7 X( S
static rt_err_t _rt_thread_init(struct rt_thread *thread,
1 A0 R1 m+ V& }0 X, |/ x) W4 r const char *name,
: I0 w7 y( }; t" l; Y# Y* R void (*entry)(void *parameter),8 L$ E1 ^3 O# ^! |& R
void *parameter,
; }5 O8 f% e4 I6 D/ `& F void *stack_start,
: X" \4 G1 O8 ]0 Y3 F8 n rt_uint32_t stack_size,
t" q, j& l, `5 T" O rt_uint8_t priority,2 x" ^8 F( O9 P' F( F8 E- h8 Z, }
rt_uint32_t tick)# h$ n; S1 a$ \8 z2 b
{* w: p1 h' o+ u$ J) i
/* init thread list */
+ l' o; P/ T; X `. H- v7 g. ?1 K rt_list_init(&(thread->tlist));
/ W+ G1 _# A, |3 ?4 S" J; E4 f thread->entry = (void *)entry;
3 v/ O' r8 M0 V# k4 |( @ thread->parameter = parameter;
1 ]. w; B; z+ I& a) p8 | /* stack init */( E9 g+ b/ h# ]! Q* |
thread->stack_addr = stack_start; |1 Z8 h, w3 n; X8 I/ d5 P
thread->stack_size = stack_size;
: X6 O% I2 S n7 i+ |. W: Q /* init thread stack */
* R+ G* p$ `0 a4 H rt_memset(thread->stack_addr, '#', thread->stack_size);8 j E2 L: E: }" W7 _) m( {% c+ ~
可以看到每个线程在初始化的会将整个栈空间设置为 #。( `1 q0 @5 k/ c# r+ ]) d( E
|
|