Cortex-M4 线程切换

;/*
; * void hw_context_switch_to(uint32 to);
; * r0 --> to
; * this fucntion is used to perform the first thread switch
; */
hw_context_switch_to    PROC
    EXPORT hw_context_switch_to
    ; set to thread
    LDR     r1, =interrupt_to_thread
    STR     r0, [r1]

    IF      {FPU} != "SoftVFP"
    ; CLEAR CONTROL.FPCA
    MRS     r2, CONTROL             ; read
    BIC     r2, #0x04               ; modify
    MSR     CONTROL, r2             ; write-back
    ENDIF

    ; set from thread to 0
    LDR     r1, =interrupt_from_thread
    MOV     r0, #0x0
    STR     r0, [r1]

    ; set interrupt flag to 1
    LDR     r1, =thread_switch_interrupt_flag
    MOV     r0, #1
    STR     r0, [r1]

    ; set the PendSV and SysTick exception priority
    LDR     r0, =NVIC_SYSPRI2
    LDR     r1, =NVIC_PENDSV_PRI
    LDR.W   r2, [r0,#0x00]       ; read
    ORR     r1,r1,r2             ; modify
    STR     r1, [r0]             ; write-back

    ; trigger the PendSV exception (causes context switch)
    LDR     r0, =NVIC_INT_CTRL
    LDR     r1, =NVIC_PENDSVSET
    STR     r1, [r0]

    ; restore MSP
    LDR     r0, =SCB_VTOR
    LDR     r0, [r0]
    LDR     r0, [r0]
    MSR     msp, r0

    ; enable interrupts at processor level
    CPSIE   F
    CPSIE   I

    ; ensure PendSV exception taken place before subsequent operation
    DSB
    ISB

    ; never reach here!
    ENDP

用于执行第一次线程切换。

LDR r1,=interrupt_to_thread
STR r0,[r1]

将参数to的值存储到全局变量,interrupt_to_thread中
IF {FPU} != "SoftVFP"
是一个条件判断,如果处理器支持浮点运算(FPU不是软件模拟的),则执行其中的指令块。
;CLEAR CONTROL.FPCA
在这个情况下,通过指令序列清除了 CONTROL.FPCA 标志,可能用于关闭浮点运算的自动上下文保存。
MRS     r2, CONTROL             ; read
BIC     r2, #0x04               ; modify
MSR     CONTROL, r2             ; write-back
ENDIF
LDR     r1, =interrupt_from_thread
    MOV     r0, #0x0
    STR     r0, [r1]

清空from线程信息
    ; set interrupt flag to 1
    LDR     r1, =thread_switch_interrupt_flag
    MOV     r0, #1
    STR     r0, [r1]

将中断标志“thread_switch_interrupt_flag”设置为1,表明线程切换正在进行
LDR     r0, =NVIC_SYSPRI2
    LDR     r1, =NVIC_PENDSV_PRI
    LDR.W   r2, [r0,#0x00]       ; read
    ORR     r1,r1,r2             ; modify
    STR     r1, [r0]             ; write-back

设置PendSV和SysTick优先级,通过读取和修改NVIC_SYSPRI2寄存器的值来实现
LDR r0, =NVIC_INT_CTRL
LDR r1, =NVIC_PENDSVSET
STR r1,[r0]

触发PendSV异常

PendSV异常处理

; r0 --> switch from thread stack
; r1 --> switch to thread stack
; psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from] stack
PendSV_Handler   PROC
    EXPORT PendSV_Handler

    ; disable interrupt to protect context switch
    MRS     r2, PRIMASK
    CPSID   I

    ; get thread_switch_interrupt_flag
    LDR     r0, =thread_switch_interrupt_flag
    LDR     r1, [r0]
    CBZ     r1, pendsv_exit         ; pendsv already handled

    ; clear thread_switch_interrupt_flag to 0
    MOV     r1, #0x00
    STR     r1, [r0]

    LDR     r0, =interrupt_from_thread
    LDR     r1, [r0]
    CBZ     r1, switch_to_thread    ; skip register save at the first time

    MRS     r1, psp                 ; get from thread stack pointer

    IF      {FPU} != "SoftVFP"
    TST     lr, #0x10               ; if(!EXC_RETURN[4])
    VSTMFDEQ  r1!, {d8 - d15}       ; push FPU register s16~s31
    ENDIF

    STMFD   r1!, {r4 - r11}         ; push r4 - r11 register

    IF      {FPU} != "SoftVFP"
    MOV     r4, #0x00               ; flag = 0

    TST     lr, #0x10               ; if(!EXC_RETURN[4])
    MOVEQ   r4, #0x01               ; flag = 1

    STMFD   r1!, {r4}               ; push flag
    ENDIF

    LDR     r0, [r0]
    STR     r1, [r0]                ; update from thread stack pointer

栈初始化

rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit)
{
	struct stack_frame *stack_frame;
	rt_uint8_t *stk;
	unsigned long i;

	stk = stack_addr + sizeof(rt_uint32_t);
	stk  = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);
    stk -= sizeof(struct stack_frame);

    stack_frame = (struct stack_frame *)stk;
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Cortex-M4是一种32位内核的微控制器处理器,由ARM公司推出。技术参考手册是为了帮助开发人员更好地了解和使用Cortex-M4处理器。 Cortex-M4技术参考手册详细介绍了Cortex-M4的体系结构、寄存器、指令集、中断控制和外设等方面的内容。通过阅读这本手册,开发人员可以深入了解Cortex-M4的各种功能和特性,从而更好地进行软件开发和系统设计。 首先,手册介绍了Cortex-M4的体系结构,包括处理器核心、存储器系统和总线接口等。开发人员可以了解到Cortex-M4的组成部分和各个模块的功能,从而能够更好地利用这些功能进行软件编程。 其次,手册提供了Cortex-M4的寄存器信息,包括通用寄存器、特权寄存器和系统控制寄存器等。开发人员可以通过查阅这些寄存器的描述和操作指南,实现对Cortex-M4内部状态的控制和管理。 指令集是处理器的核心部分,Cortex-M4的技术参考手册提供了详细的指令描述和执行规则。开发人员可以了解到Cortex-M4支持的指令类型和格式,以及各种运算和控制指令的具体作用和使用方法。 此外,手册介绍了Cortex-M4的中断控制系统和外设接口。开发人员可以学习如何配置和操作中断控制器,实现对外部事件的响应和处理。同时,手册还介绍了Cortex-M4支持的各种外设接口,如GPIO、UART、SPI等,开发人员可以根据手册提供的信息,进行外设的使用和配置。 总而言之,Cortex-M4技术参考手册是一本必要的参考资料,对于希望了解和使用Cortex-M4处理器的开发人员来说,具有重要的指导作用。通过阅读手册,开发人员可以全面了解Cortex-M4的体系结构和功能特性,从而能够更好地进行软件开发和系统设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值