线程

线程创建

  • 初始化上下文信息
  • 将栈初始化为 #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

rt_uint8_t *rt_hw_stack_init(void *tentry,

void *parameter,

rt_uint8_t *stack_addr,

void *texit)

{

struct stack_frame *stack_frame;

rt_uint8_t *stk;

unsignedlong i;


stk = stack_addr + sizeof(rt_uint32_t);

stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);

stk -= sizeof(struct stack_frame);


stack_frame = (struct stack_frame *)stk;


/* init all register */

for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++)

{

((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;

}


stack_frame->exception_stack_frame.r0 = (unsignedlong)parameter; /* r0 : argument */

stack_frame->exception_stack_frame.r1 = 0; /* r1 */

stack_frame->exception_stack_frame.r2 = 0; /* r2 */

stack_frame->exception_stack_frame.r3 = 0; /* r3 */

stack_frame->exception_stack_frame.r12 = 0; /* r12 */

stack_frame->exception_stack_frame.lr = (unsignedlong)texit; /* lr */

stack_frame->exception_stack_frame.pc = (unsignedlong)tentry; /* entry point, pc */

stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */


#if USE_FPU

stack_frame->flag =0;

#endif /* USE_FPU */


/* return task's current stack address */

return stk;

}

R0-R3: 这些寄存器在函数调用时通常用于传递参数。R0被设置为传入的参数,而R1到R3被初始化为0。这是因为在这个特定的上下文中,我们只需要一个参数。如果有更多的参数,它们会被放在R1,R2,和R3中。

LR (Link Register): 这个寄存器通常包含函数返回地址。LR被设置为texit,当任务完成时,它会跳转到这个地址。

PC (Program Counter): 这个寄存器包含下一条要执行的指令的地址。PC被设置为tentry,这意味着当任务开始时,它会从这个地址开始执行。

PSR (Program Status Register): 这个寄存器包含了关于程序状态的信息,如条件代码和中断禁用位。在这个函数中,PSR被设置为0x01000000L,这是一个特定的值,表示默认的状态

  • 初始化线程定时器

线程启动

  • 上锁

  • 该函数将恢复一个线程并将其放入系统就绪队列。

    • 停止线程定时器
    • 从挂起链表中移除,插入就绪链表中
  • 解锁并调度

线程挂起

  • 设置状态为挂起状态
  • 等待下一次触发时挂起

线程延时

  • 设置定时器超时时间并启动
  • 执行一次调度安排

rt_thread_delayrt_thread_delay_until delay是相对时间,delay_until是绝对时间

线程超时

  • 线程定时器超时后,从挂起链表中移除,插入就绪链表中

线程退出 && 线程删除

  • 线程退出

    • 设置线程状态为 RT_THREAD_CLOSE
    • 从就绪链表中移除
    • 释放线程资源