内核移植(五)--无来源线程切换

无来源线程切换

;/*
; * void rt_hw_context_switch_to(rt_uint32 to);
; *当一个汇编函数在C语言文件中调用的时候, 如果有一个形参,则执行的时候会将这个形参传入CPU寄存器r0,
; *如果有两个形参,第二个则传入到r1。
; * r0 --> to
; * this fucntion is used to perform the first thread switch 
; * 第一次线程切换 rthw.h中声明 
;
; rt_hw_context_switch_to 只有目标线程,没有来源线程。
; 1、开始
; 2、将参数 to 保存到 rt_interrupt_to_thread 变量
; 3、将 rt_interrupt_from_thread 变量设置为 0
; 4、将 rt_thread_switch_interrupt_flag 设置为 1
; 5、设置 PendSV 异常优先级
; 6、触发 PendSV 中断 
; 7、恢复 MSP 的默认值 
; 8、使能全局中断
; 9、结束
;
; */

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

你可能感兴趣的:(RT-Thread,内核移植,无来源线程切换,RT-Thread)