无来源线程切换
;
rt_hw_context_switch_to PROC ;PROC 用于定义子程序,与 ENNP 成对使用,表示 rt_hw_context_switch_to() 函数的开始
EXPORT rt_hw_context_switch_to ;EXPORT 声明一个标号具有全局属性,可被外部的文件使用
;r0 的值是一个指针,该指针指向 to 线程的线程控制块 SP 成员
; set to thread 设置rt_interrupt_to_thread的值
LDR r1, =rt_interrupt_to_thread ;将 rt_interrupt_to_thread 变量的地址加载到 r1 寄存器
STR r0, [r1] ;将 ro 寄存器的值,传送到地址为 r1 的(存储器)内存中,即将 r0 的值存储到 rt_interrupt_to_thread 变量中
; set from thread to 0 设置 rt_interrupt_from_threa d的值为 0,表示启动第一次线程切换 不需要保存 from 的上下文
LDR r1, =rt_interrupt_from_thread ;将 rt_interrupt_from_thread 变量的地址加载到r1寄存器
MOV r0, #0x0 ;配置 r0 等于 0
STR r0, [r1] ;将 ro 寄存器的值,传送到地址为 r1 的(存储器)内存中,即将 r0 的值存储到 rt_interrupt_from_thread 变量中
; set interrupt flag to 1 设置中断标志位 rt_thread_switch_interrupt_flag 的值为1 表示需要切换,这个变量将在 PendSV 异常处理函数里切换的时候被清零
LDR r1, =rt_thread_switch_interrupt_flag ;将 rt_thread_switch_interrupt_flag 变量的地址加载到 r1 寄存器
MOV r0, #1 ;配置 r0 等于1
STR r0, [r1] ;将 ro 寄存器的值,传送到地址为 r1 的(存储器)内存中,即将 r0 的值存储到 rt_thread_switch_interrupt_flag 变量中
; set the PendSV exception priority ;设置 PendSV 异常的优先级
LDR r0, =NVIC_SYSPRI2 ;系统优先级寄存器(2)
LDR r1, =NVIC_PENDSV_PRI ;PendSV 优先级值(lowest)
LDR.W r2, [r0,#0x00] ; read
ORR r1,r1,r2 ; modify
STR r1, [r0] ; write-back
; trigger the PendSV exception (causes context switch) ;触发 PendSV 异常 (产生上下文切换) 将执行 PendSV 的异常处理程序
LDR r0, =NVIC_INT_CTRL
LDR r1, =NVIC_PENDSVSET
STR r1, [r0]
; restore MSP 放弃芯片启动到第一次上下文切换之前的栈内容,将 MSP 设置启动时的值
LDR r0, =SCB_VTOR
LDR r0, [r0]
LDR r0, [r0]
MSR msp, r0
; enable interrupts at processor level 使能全局中断和全局异常,使能之后将进入 PendSV 异常处理函数
CPSIE F
CPSIE I
; never reach here! 不会执行到这里
ENDP