该函数在中断上下文中进行线程切换,为了不影响当前中断的执行,该例程将换入和换出线程的栈顶指针分别存放在全局变量rt_interrupt_from_thread和rt_interrupt_to_thread中,并设置rt_thread_switch_interrupt_flag为1;若该变量值已经设为1,说明之前已经准备好线程切换了,此时只需设置新的换入线程即可。等到中断处理完毕...
LDR r1, =rt_interrupt_to_thread STR r0, [r1] ; STR: 寄存器 =》 内存 ; 设置 rt_interrupt_from_thread 的值为 0,表示第一次线程切换 LDR r1, =rt_interrupt_from_thread MOV r0, #0x0 STR r0, [r1] ; 设置 rt_thread_switch_interrupt_flag 的值为1 LDR r1, =rt_thread_switch_interrupt_f...
PendSV_Handler:/* disable interrupt to protect context switch */MRS R2,PRIMASK//移动特殊寄存器到普通的寄存器 是一种寄存器到寄存器之间的传送指令CPSID I/* get rt_thread_switch_interrupt_flag */LDR R0,=rt_thread_switch_interrupt_flag LDR R1,[R0]CBZ R1,pendsv_exit/* pendsv aLReady handled *...
将 r0 寄存器的值保存到 rt_interrupt_to_thread 变量里LDR r1, =rt_interrupt_to_threadSTR ...
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) ...
本文简单讨论RT-Thread在启动后,逐步进入到处于就绪态最高优先级main线程的全过程。部分内容涉及到汇编指令,但通俗易懂。通过简化工程,配合Debug过程,逐步观察寄存器的变化、绘制栈帧结构、绘制线程控制块和rt_interrupt_from_thread、rt_interrupt_to_thread等典型变量取值(指向,虽然是rt_uint32_t类型,但实际在汇编中...
*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_hw_context_switch_interrupt()函数进行上下文切换,该函数跟 CPU 架构相关。 以Cortex-M 架构为例,rt_hw_context_switch_interrupt()函数的实现流程如下图所示。将设置需要切换的线程rt_interrupt_to_thread变量,然后触发 PendSV 异常。PendSV 异常是专门用来辅...
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,是第一次进行线程运行。
中断处理过程中需要进行线程切换,这种情况会调用 rt_hw_context_switch_interrupt() 函数进行上下文切换,该函数跟 CPU 架构相关,不同 CPU 架构的实现方式有差异,如下图所示: 在Cortex-M 架构中,rt_hw_context_switch_interrupt() 的函数实现流程如下图所示,它将设置需要切换的线程 rt_interrupt_to_thread 变量,...