;/* ; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); ; * r0 --> from ; * r1 --> to ; */ rt_hw_context_switch_interrupt EXPORT rt_hw_context_switch_interrupt rt_hw_context_switch PROC EXPORT rt_hw_context_switch ; set rt_thread_switch_interrupt_flag to 1 LDR...
.globl rt_hw_context_switch_interrupt rt_hw_context_switch_interrupt: /** 1.判断rt_thread_switch_interrupt_flag变量的值是否为1 */ ldr r2, =rt_thread_switch_interrupt_flag/** 加载变量rt_thread_switch_interrupt_flag * 的地址到r2寄存器中 */ ldr r3, [r2] /** 读取rt_thread_switch_interr...
在Cortex-M 架构中,rt_hw_context_switch_interrupt() 的函数实现流程如下图所示,它将设置需要切换的线程 rt_interrupt_to_thread 变量,然后触发 PendSV 异常(PendSV 异常是专门用来辅助上下文切换的,且被初始化为最低优先级的异常)。PendSV 异常被触发后,不会立即进行 PendSV 异常中断处理程序,因为此时还在中断...
3#define RT_THREAD_PRIORITY_MAX 3 //这个是最大的优先级数,这个可以减少到3 4 5#define RT_USING_USER_MAIN //这个涉及到stdlib,所以留着可以节省空间 6 7#define RT_MAIN_THREAD_STACK_SIZE 128 //这个也是实验得来的数据 8 9#define RT_USING_CPU_FFS //这个选项可以将大数组__lowest_bit_bitmap...
线程上下文切换等功能,一般采用汇编格式编写,不同cpu架构实现方式肯定不同,为了使rt-thread系统能够在不同的CPU架构上都能运行,RT-thread提供了一套libcpu抽象层来适配不同的cpu,现在我们重点来说libcpu中的rt_hw_context_switch函数和rt_hw_context_switch_interrupt函数在cortex-m3架构上的实现。
4.1 rt_hw_context_switch_interrupt_do 中断处理过程中并不执行线程切换,只是通过函数rt_hw_context_switch_interrupt设置相关的全局变量。当中断处理完毕后,检查rt_thread_switch_interrupt_flag变量,若值不为1则正常返回;若值为1,则进行线程切换,实际的切换工作由中断入口函数中rt_hw_context_switch_interrupt_do部...
在Cortex-M 架构中,rt_hw_context_switch_interrupt() 的函数实现流程如下图所示,它将设置需要切换的线程 rt_interrupt_to_thread 变量,然后触发 PendSV 异常(PendSV 异常是专门用来辅助上下文切换的,且被初始化为最低优先级的异常)。PendSV 异常被触发后,不会立即进行 PendSV 异常中断处理程序,因为此时还在中断...
对于rt_hw_context_switch_to函数的其他行,依次分析如下: 168行至172行,处理浮点寄存器入栈控制,与Cortex M4内核的Lazy Stacking有关,但与本文主线无关,不做探讨。 176至178行,将rt_interrupt_from_thread变量清零。因此本次是RT-Thread第一次调度最高优先级线程,只有to,没有from。
*/.global rt_hw_context_switch_to.type rt_hw_context_switch_to,%function rt_hw_context_switch_to: 把全局指针变量放入R1,然后使其指向转入线程的栈指针。 LDR R1,=rt_interrupt_to_thread STR R0,[R1] 因为是第一次切换线程,所以from就是0。
而如果要进行线程切换,则会调用rt_hw_context_switch_interrupt() 函数进行上下文切换,这个函数主要是设置变量rt_interrupt_to_thread,然后触发PendSV中断。 在这里要注意一下:由于PendSV中断的优先级最低,不能进行中断抢占,因此即使触发了该中断,但由于此时还在用户中断处理函数里面,所以PendSV中断还处于等待阶段,只有...