LDR R1,[R0]CBZ R1,pendsv_exit/* pendsv aLReady handled *//* clear rt_thread_switch_interrupt_flag to 0 */MOV R1,#0STR R1,[R0]LDR R0,=rt_interrupt_from_thread LDR R1,[R0]CBZ R1,switch_to_thread/* skip register save at the first time */MRS R1,PSP/* get from thread stack p...
通用寄存器组里的 R13 作为堆栈指针寄存器 (Stack Pointer,SP);R14 作为连接寄存器 (Link Register,LR),用于在调用子程序时,存储返回地址;R15 作为程序计数器 (Program Counter,PC),其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(PSP)。 特殊功能寄存器包括程序状态字寄存器组(PSRs)、中断屏蔽寄存器...
以stm32的cotex-M3/M4为例,cotex-M3/M4中拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个: 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核,以及异常与中断处理。 进程堆栈指针(PSP):由用户的应用程序代码(如线程切换)使用。堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节...
Cortex-M 的堆栈寄存器 SP 对应两个物理寄存器 MSP 和 PSP,MSP 为主堆栈,PSP 为进程堆栈,处理模式总是使用 MSP 作为堆栈,线程模式可以选择使用 MSP 或 PSP 作为堆栈,同样通过 CONTROL 特殊寄存器控制。复位后,Cortex-M 默认进入线程模式、特权级、使用 MSP 堆栈。
struct rt_thread { void *sp; /* 线程栈指针 */ void *entry; /* 线程入口地址 */ void *parameter; /* 线程形参 */ void *stack_addr; /* 线程起始地址 */ rt_uint32_t stack_size; /* 线程栈大小,单位为字节 */ rt_list_t tlist; /* 线程链表节点 */ ...
99行-105行,rt_thread_switch_interrupt_flag清0,判断rt_interrupt_from_thread的值,为0表示OS第一次进行最高优先级就绪状态线程的运行,无需恢复psp,直接跳转到switch_to_thread;为1表示从from线程切换至to线程,需要恢复psp。Debug到此处,rt_interrupt_from_thread的值为0,是第一次进行线程运行。
PRIMASK, r2;由于cm3 内核发生中断时,堆栈指针使用的是msp,因此退出中断时,确保使用psp指针,实际操作...
1、RT-Thread代码启动过程 1.1 启动流程图 系统先从启动文件开始运行,然后进入 RT-Thread 的启动 rt...
为了方便将 RT-Thread 移植到不同 CPU 架构的芯片上运行,RT-Thread 提供了一个 libcpu 抽象层。该抽象层用来适配不同的 CPU 架构,起到承上启下的作用。 向上对内核提供统一的函数接口。包括全局中断的开关、线程初始化、上下文切换等等。 向下提供了统一的 CPU 架构移植接口,包括全局中断开关函数、线程上下文切换...
在特权模式下堆栈指针将使用MSP,非特权模式下可以被切换到PSP。RT-Thread操作系统就是这么做的。所以回过头来看,中断向量表第一项指定了MSP的栈起始地址,并被自动加载到MSP,第二项指定了复位向量地址,也被自动加载到PC并运行。这样一来开机后我们能通过debug看到PC指针最先指向复位向量的第一条指令上。我们看一下...