cmp r3, #1 @ 判断rt_thread_switch_interrupt_flag是否为1 beq _reswitch @ 若该变量值已经设为1,说明之前已经准备好线程切换了,此时只需设置新的换入线程即可。 ldr ip, =rt_interrupt_from_thread @ 将换入线程的栈顶指针存放在全局变量rt_interrupt_from_thread mov r3, #1 @ 设置rt_thread_switch_i...
; 设置 from 线程为空,表示不需要从保存 from 的上下文LDR r1, =rt_interrupt_from_threadMOV ...
rt_interrupt_to_thread = (*((unsigned long *)to)); /* 主动触发异常,进入Trap0,进行线程切换 */ __syscall( 0 ); rt_hw_interrupt_enable(level); } rt_hw_context_switch_interrupt()接口实现 void rt_hw_context_switch_interrupt(rt_ubase_t from, rt_ubase_t to) { if(rt_thread_switch_i...
94行-96行,判断rt_thread_switch_interrupt_flag的值,为0则退出,为1则继续; 99行-105行,rt_thread_switch_interrupt_flag清0,判断rt_interrupt_from_thread的值,为0表示OS第一次进行最高优先级就绪状态线程的运行,无需恢复psp,直接跳转到switch_to_thread;为1表示从from线程切换至to线程,需要恢复psp。Debug到...
EXPORT rt_hw_context_switch;set rt_thread_switch_interrupt_flag to 1LDR r2, =rt_thread_switch_interrupt_flag LDR r3, [r2]CMPr3, #1BEQ _reswitchMOVr3, #1STRr3, [r2] LDR r2, =rt_interrupt_from_thread;set rt_interrupt_from_threadSTRr0, [r2] ...
struct rt_thread { void *sp; /* 线程栈指针 */ void *entry; /* 线程入口地址 */ void *parameter; /* 线程形参 */ void *stack_addr; /* 线程起始地址 */ rt_uint32_t stack_size; /* 线程栈大小,单位为字节 */ rt_list_t tlist; /* 线程链表节点 */ ...
本文简单讨论RT-Thread在启动后,逐步进入到处于就绪态最高优先级main线程的全过程。部分内容涉及到汇编指令,但通俗易懂。通过简化工程,配合Debug过程,逐步观察寄存器的变化、绘制栈帧结构、绘制线程控制块和rt_interrupt_from_thread、rt_interrupt_to_thread等典型变量取值(指向,虽然是rt_uint32_t类型,但实际在汇编中...
LDR R1,=rt_interrupt_to_thread STR R0,[R1] 因为是第一次切换线程,所以from就是0。 设置切换标志为1,表示有线程准备切换。 这里设置PendSV和Systick为最低优先级。 接下来,就是触发中断了,通过设置ICSR寄存器的bit28位来触发PendSV中断。并且在进入中断时,要做些准备——把R0~R3、R12、PC、LR、xPSR这些...
*ARM当前处于IRQ工作模式,sp_irq指向的内存中保存了被中断线程的上下文r0-r12,lr*/rt_hw_context_switch_interrupt_do: mov r1, #0str r1, [r0] @;清除标记rt_thread_switch_interrtup_flag = 0 mov r1, sp @; r1保存irq模式下,指向r0~r3的属于被中断线程的环境 ...
rt_thread_switch_interrupt_flag 变量是指示 上下文切换动作 是否在PendSV中断中执行过,如果等于1,表示需要切换,需要在PendSV中断中执行,也就是还没有执行,那么也就不需要再更新rt_interrupt_from_thread变量,(在上一次调用过rt_hw_context_switch/rt_hw_context_switch_interrupt 函数之后还没来得及切换线程,即rt...