|
|
计算代码如下7 E4 `) }/ s: D I6 n
4 o3 V4 z6 A7 \ M) {
while (*ptr == '#')ptr ++;
6 H1 n) z0 z- o3 `# C4 A# r rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
4 q9 s j, v! K i; V8 `& G thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
5 ]" q, E, T# ~8 O; O% \ thread->stack_size,, Y0 t. o! g5 F/ d4 F9 \
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100
3 p0 A! }3 y. m* g) H / thread->stack_size,
' u% v% J# `2 l2 h) L' V. Y thread->remaining_tick,2 t h0 Z' A% c9 W4 b7 d
thread->error);
! N+ e+ ^% d; b, U# S& p! C(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 可以看出是线程栈的大小 减去 ptr 相对于 栈起始地址的大小 然后得到一个 百分比。
- Z W+ h. E' V
/ K, }0 j9 k8 e9 L+ _进一步分析 ptr 的位置在哪里,通过上面的代码第一行可以看到,通过 # 来进行的判断。
5 G- X* N9 N7 m+ y6 A# M6 {
* a$ c7 t' L0 f, a6 I3 p在进一步分析 # 从何而来
K6 u: M- E; v0 j+ [* t. D- M
' ]) t1 d" R! w4 T) e* u& Hstatic rt_err_t _rt_thread_init(struct rt_thread *thread,
; o/ v m6 e) k! Z8 N const char *name,, z' H; H. n& u' z) q( ^7 w
void (*entry)(void *parameter),
( H, X y! k* H7 f. r void *parameter,3 W- ]& H' E4 l9 n
void *stack_start,
1 z9 C& F: g4 n0 X# \% f rt_uint32_t stack_size,
- l' L# ^6 J3 q5 q: i% e% f rt_uint8_t priority,
+ O8 s4 v* Y# k* x# o2 b9 Q; h" ` rt_uint32_t tick)* x! b- G O4 j G9 i
{
8 I7 h2 X: k9 d6 C /* init thread list */
! W+ |7 n& A; L/ E" B7 L' v rt_list_init(&(thread->tlist));3 X4 h* b. t/ ^" J M0 Q
thread->entry = (void *)entry;( K( I" S4 D* C8 ]' U
thread->parameter = parameter;
6 Q3 J$ N7 r5 o8 h5 V* P8 p /* stack init */1 G2 Y4 S8 t' O" ^ O1 H9 E5 `8 |
thread->stack_addr = stack_start;
6 y, ~9 O) e% y2 y thread->stack_size = stack_size;
9 C, @2 L+ q% R: c' ~7 W- f /* init thread stack */
* H3 L: [4 p: h$ ]0 z/ |7 ` rt_memset(thread->stack_addr, '#', thread->stack_size);
2 ?" k9 M3 g: O; [0 e可以看到每个线程在初始化的会将整个栈空间设置为 #。; T8 y* i5 y+ h, A
|
|