|
|
计算代码如下( P6 h7 Q- M! `+ Q$ G
' [) B/ j: }, i! N2 Y
while (*ptr == '#')ptr ++;
) `- b2 {( P; Y8 e& Z rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",6 o7 E, y! ^0 U# L' b9 _
thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
5 i& p+ L, b, H( ]( ? thread->stack_size,; R5 ?' X" L, w
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100; x# Z) N2 u! N# L
/ thread->stack_size,, H; @8 N/ n5 O9 m
thread->remaining_tick,* {. b# a' Q# {1 ^1 Q3 i
thread->error);9 Y9 O0 L5 {: O# m4 m8 d
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。( e3 c7 X O ~1 s+ p! m
9 X# g$ F/ \# {5 |! v. O进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。
8 v% S7 D1 u) B! V1 L0 X
% X! K# \9 b- f$ \3 c4 h8 k b! C, r在进一步分析 # 从何而来
& y/ S7 i+ H& T
! L! s- ^( `" E( hstatic rt_err_t _rt_thread_init(struct rt_thread *thread,
8 X1 a- j6 u. d C& q! w const char *name,
1 v7 {0 s7 F+ w4 l' S4 B7 g void (*entry)(void *parameter),
- f2 `. E* v' R+ B! [3 n2 O2 T, ] void *parameter,) u" A( {# V) M+ N; W
void *stack_start,+ |1 ~( o' P# v! A
rt_uint32_t stack_size,, `3 a9 D; f6 ]2 v* `
rt_uint8_t priority,8 U- t, K) I5 e3 p" `$ x" M
rt_uint32_t tick)
. B u6 d2 d) h, ]+ E; G: M. H{4 L1 P$ G- r" @
/* init thread list */
& j i/ C+ T6 x. D rt_list_init(&(thread->tlist));
2 H) Z, v& ^- t! k, M2 E1 O: `* a2 f thread->entry = (void *)entry;
1 y) l; h* R. a- @ thread->parameter = parameter;
( L; ~2 L" t9 r. l& p /* stack init */
$ j s' K; M. F5 o0 D" Q: f7 q7 Q thread->stack_addr = stack_start;4 W6 y( x" _( V3 r, r
thread->stack_size = stack_size;
0 C1 _6 T$ v) N$ h% p* Y6 m /* init thread stack */1 V) s6 e+ ^! D# u% h6 E
rt_memset(thread->stack_addr, '#', thread->stack_size);
s+ _' z4 Y {7 u可以看到每个线程在初始化的会将整个栈空间设置为 #。' H5 K% @* h$ l
|
|