From a2f9cdf4f754ef574aab14c0501ac14ec701e208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=BF=97=E8=BF=9C?= <1468728718@qq.com> Date: Sat, 14 Aug 2021 11:23:00 +0800 Subject: [PATCH 1/2] add porting for cortex-m --- .../porting/cortex-m/figures/10stack.png | Bin 0 -> 13419 bytes .../rt_hw_context_switch_interrupt.png | Bin 0 -> 26160 bytes .../figures/rt_hw_context_switch_to.png | Bin 0 -> 28942 bytes .../porting/cortex-m/figures/xpsr.png | Bin 0 -> 16079 bytes .../porting/cortex-m/port-cortex-m.md | 325 ++++++++++++++++++ 5 files changed, 325 insertions(+) create mode 100644 rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/figures/10stack.png create mode 100644 rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/figures/rt_hw_context_switch_interrupt.png create mode 100644 rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/figures/rt_hw_context_switch_to.png create mode 100644 rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/figures/xpsr.png create mode 100644 rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md diff --git a/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/figures/10stack.png b/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/figures/10stack.png new file mode 100644 index 0000000000000000000000000000000000000000..029cb880ee58cb2828dbe209cb366688f4da75de GIT binary patch literal 13419 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⁡{ph!IH>1GMG+4#n}BwQa`p-pC^rR< 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 literal 0 HcmV?d00001 diff --git a/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md b/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md new file mode 100644 index 0000000..20fc215 --- /dev/null +++ b/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md @@ -0,0 +1,325 @@ +# cortex-m移植 + +## 知识储备 + +### 常用寄存器 + +PRIMASK寄存器 + +* PRIMASK寄存器为1位宽的中断屏蔽寄存器。在置位时,它会阻止不可屏蔽中断(NMI)和HardFault异常之外的所有异常(包括中断)。实际上,它是将当前异常优先级提升为0,这也是可编程异常/中断的最高优先级。 + +FAULTMASK寄存器 + +* FAULTMASK与PRIMASK相类似,但同时它能屏蔽HardFault异常,它实际上是将异常优先级提升到了-1 + +程序状态寄存器(xPSR) + +* xPSR包含: + + * 应用PSR(APSR) + + * 执行PSR(EPSR) + + * 中断PSR(IPSR) + +* ![image-20210813143737666](figures/xpsr.png) + + *GE在Cortex-M4等ARMv7E-M处理器中存在,在Cortex-M3处理器中则不可用。 + +* | 位 | 描述 | + | -------- | ------------------------------------------------------------ | + | N | 负标志 | + | Z | 零标志 | + | C | 进位(或者非借位)标志 | + | V | 溢出标志 | + | Q | 饱和标志(ARMv6-M中不存在) | + | GE[3:0] | 大于或等于标志,对应每个字节通路(只存在于ARMv7E-M, ARMv6-M或Cortex-M3中则不存在) | + | ICI/IT | 中断继续指令(ICI)位,IF-THEN指令状态位用于条件执行(ARMv6-M中则不存在) | + | T | Thumb状态,总是1,清除此位会引起错误异常 | + | 异常编号 | 表示处理器正在处理的异常 | + +中断向量表 + +* Cortex-M系列处理器的中断向量表位于0x00000000, 但Cortex-M3/4系列提供了Vector table offset register (SCB_VTOR),所以,中断向量表的位置位于0x00000000 + SCB_VTOR。 + +### 常用汇编指令 + +#### 异常相关指令 + +| 指令 | 操作 | +| ------- | --------------------------------------------- | +| CPSIE I | 使能中断(清除PRIMASK) | +| CPSID I | 禁止中断(设置PRIMASK),NMI和HardFault不受影响 | +| CPSIE F | 使能中断(清除FAULTMASK) | +| CPSID F | 禁止中断(设置FAULTMASK),NMI不受影响 | + + + +## 移植过程 + +在嵌入式领域有多种不同 CPU 架构,例如 Cortex-M、ARM920T、MIPS32、RISC-V 等等。为了使 RT-Thread 能够在不同 CPU 架构的芯片上运行,RT-Thread 提供了一个 libcpu 抽象层来适配不同的 CPU 架构。libcpu 层向上对内核提供统一的接口,包括全局中断的开关,线程栈的初始化,上下文切换等。 + +RT-Thread 的 libcpu 抽象层向下提供了一套统一的 CPU 架构移植接口,这部分接口包含了全局中断开关函数、线程上下文切换函数、时钟节拍的配置和中断函数、Cache 等等内容。下表是 CPU 架构移植需要实现的接口和变量。 + +libcpu 移植相关 API + +| **函数和变量** | **描述** | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| rt_base_t rt_hw_interrupt_disable(void); | 关闭全局中断 | +| void rt_hw_interrupt_enable(rt_base_t level); | 打开全局中断 | +| rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit); | 线程栈的初始化,内核在线程创建和线程初始化里面会调用这个函数 | +| void rt_hw_context_switch_to(rt_uint32 to); | 没有来源线程的上下文切换,在调度器启动第一个线程的时候调用,以及在 signal 里面会调用 | +| void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); | 从 from 线程切换到 to 线程,用于线程和线程之间的切换 | +| void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to); | 从 from 线程切换到 to 线程,用于中断里面进行切换的时候使用 | +| rt_uint32_t rt_thread_switch_interrupt_flag; | 表示需要在中断里进行切换的标志 | +| rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; | 在线程进行上下文切换时候,用来保存 from 和 to 线程 | + +要对CPU进行移植,只需实现上述接口。 + +### 关闭全局中断 + +rt_base_t rt_hw_interrupt_disable(void); + +``` assembly +/* + * rt_base_t rt_hw_interrupt_disable(); + */ + .global rt_hw_interrupt_disable + .type rt_hw_interrupt_disable, %function +rt_hw_interrupt_disable: + MRS R0, PRIMASK ;将PRIMASK当前值(关中断前的状态)存入R0,并作为函数返回值返回 + CPSID I ;关闭中断 + BX LR +``` + +### 打开全局中断 + +``` assembly +/* + * void rt_hw_interrupt_enable(rt_base_t level); //level是调用关中断函数时的返回值,代表关中断前PRIMASK的值 + */ + .global rt_hw_interrupt_enable + .type rt_hw_interrupt_enable, %function +rt_hw_interrupt_enable: + MSR PRIMASK, R0 ;将level写入PRIMASK寄存器,恢复关中断前的状态 + BX LR +``` + +### 实现线程栈初始化 + +在动态创建线程和初始化线程的时候,会使用到内部的线程初始化函数_rt_thread_init(),_rt_thread_init() 函数会调用栈初始化函数 rt_hw_stack_init(),在栈初始化函数里会手动构造一个上下文内容,这个上下文内容将被作为每个线程第一次执行的初始值。上下文在栈里的排布如下图所示: + +![stack](figures/10stack.png) + +``` C +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; + + /* init all register */ + for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++) + { + ((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef; + } + + /* 根据 ARM APCS 调用标准,将第一个参数保存在 r0 寄存器 */ + stack_frame->exception_stack_frame.r0 = (unsigned long)parameter; /* r0 : argument */ + /* 其他参数寄存器初始化为0 */ + stack_frame->exception_stack_frame.r1 = 0; /* r1 */ + stack_frame->exception_stack_frame.r2 = 0; /* r2 */ + stack_frame->exception_stack_frame.r3 = 0; /* r3 */ + /* 将 IP(Intra-Procedure-call scratch register.) 设置为 0 */ + stack_frame->exception_stack_frame.r12 = 0; /* r12 */ + /* 将线程退出函数的地址保存在 lr 寄存器 */ + stack_frame->exception_stack_frame.lr = (unsigned long)texit; /* lr */ + /* 将线程入口函数的地址保存在 pc 寄存器 */ + stack_frame->exception_stack_frame.pc = (unsigned long)tentry; /* entry point, pc */ + /* 设置 psr 的值为 0x01000000L,表示默认切换过去是 Thumb 模式 */ + stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */ + + /* return task's current stack address */ + return stk; +} +``` + +### 实现上下文切换 + +在 Cortex-M 里面上下文切换都是统一使用 PendSV 异常来完成。为了能适应不同的 CPU 架构,RT-Thread 的 libcpu 抽象层需要实现三个线程切换相关的函数: + +1) rt_hw_context_switch_to():没有来源线程,切换到目标线程,在调度器启动第一个线程的时候被调用。 + +2) rt_hw_context_switch():在线程环境下,从当前线程切换到目标线程。 + +3) rt_hw_context_switch_interrupt ():在中断环境下,从当前线程切换到目标线程。 + +#### PendSV_Handler + +产生PendSV异常时,Cortex-M系列处理器硬件会自动将from线程的PSR、PC、LR、R12、R3-R0压栈,因此在PendSV_Handler中,我们需要把from线程的R11~R4压栈,并把to线程的R11~R4弹出。修改PSP为to线程的栈地址,在退出PendSV中断时,硬件会自动弹出to线程的R3-R0、R12、LR、PC、PSR寄存器。 + +``` assembly +/* R0 --> switch from thread stack + * R1 --> switch to thread stack + * psr, pc, LR, R12, R3, R2, R1, R0 are pushed into [from] stack + */ + .global PendSV_Handler + .type PendSV_Handler, %function +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 */ ;判断是否已经在rt_hw_context_switchx中置位 + + /* clear rt_thread_switch_interrupt_flag to 0 */ + MOV R1, #0 + STR R1, [R0] + + LDR R0, =rt_interrupt_from_thread + LDR R1, [R0] + CBZ R1, switch_to_thread /* skip register save at the first time */ + ;判断from线程是否为空(判断是否是rt_hw_context_switch_to) + MRS R1, PSP /* get from thread stack pointer */ ;将from线程的堆栈地址读入R1 + STMFD R1!, {R4 - R11} /* push R4 - R11 register */ ;将from线程的数据寄存器R4-R11压栈 + LDR R0, [R0] ;将最新的栈指针存回rt_interrupt_from_thread + STR R1, [R0] /* update from thread stack pointer */ + +switch_to_thread: + LDR R1, =rt_interrupt_to_thread + LDR R1, [R1] + LDR R1, [R1] /* load thread stack pointer */ + + LDMFD R1!, {R4 - R11} /* pop R4 - R11 register */ ;将to线程的数据寄存器R4-R11弹出 + MSR PSP, R1 /* update stack pointer */ + +pendsv_exit: + /* restore interrupt */ + MSR PRIMASK, R2 + + ORR LR, LR, #0x04 + BX LR +``` + +#### rt_hw_context_switch_to + +![rt_hw_context_switch_to](figures/rt_hw_context_switch_to.png) + +``` assembly +/* + * void rt_hw_context_switch_to(rt_uint32 to); + * R0 --> to + */ + .global rt_hw_context_switch_to + .type rt_hw_context_switch_to, %function +rt_hw_context_switch_to: + LDR R1, =rt_interrupt_to_thread ;将传入的目标线程栈存入rt_interrupt_to_thread + STR R0, [R1] + + /* set from thread to 0 */ + LDR R1, =rt_interrupt_from_thread + MOV R0, #0 + STR R0, [R1] + + /* set interrupt flag to 1 */ + LDR R1, =rt_thread_switch_interrupt_flag ;设置rt_thread_switch_interrupt_flag, PendSV中会判断该标志来确定是否进行上下文切换 + MOV R0, #1 + STR R0, [R1] + + /* set the PendSV and SysTick exception priority */ + LDR R0, =SHPR3 ;System handler priority register 3 (SCB_SHPR3),其中Bits[23:16]为Priority of system handler 14, PendSV + LDR R1, =PENDSV_PRI_LOWEST ;PENDSV_PRI_LOWEST即0xFFFF0000,作为其mask + LDR.W R2, [R0,#0] /* read */ + ORR R1, R1, R2 /* modify */ + STR R1, [R0] /* write-back */ + + LDR R0, =ICSR /* trigger the PendSV exception (causes context switch) */ + LDR R1, =PENDSVSET_BIT ;0x10000000,ICSR的第28位为PendSV set-pending bit. + STR R1, [R0] ;Writing 1 to this bit is the only way to set the PendSV exception state to pending. + + /* restore MSP */ + LDR r0, =SCB_VTOR ;设置SCB_VTOR的地址 + LDR r0, [r0] ;读取中断向量表的位置 + LDR r0, [r0] ;读取SP初始值 + NOP + MSR msp, r0 ;将SP初始值赋给MSP + + /* enable interrupts at processor level */ + CPSIE F + CPSIE I + + /* never reach here! */ +``` + +#### rt_hw_context_switch / rt_hw_context_switch_interrupt + +![rt_hw_context_switch_interrupt](figures/rt_hw_context_switch_interrupt.png) + +``` assembly +/* + * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); + * R0 --> from + * R1 --> to + */ + .global rt_hw_context_switch_interrupt + .type rt_hw_context_switch_interrupt, %function + .global rt_hw_context_switch + .type rt_hw_context_switch, %function +rt_hw_context_switch_interrupt: +rt_hw_context_switch: + /* set rt_thread_switch_interrupt_flag to 1 */ + LDR R2, =rt_thread_switch_interrupt_flag + LDR R3, [R2] + CMP R3, #1 ;判断rt_thread_switch_interrupt_flag是否已经被置位 + BEQ _reswitch ;如果已经被置位,则跳转到_reswitch + MOV R3, #1 + STR R3, [R2] ;rt_thread_switch_interrupt_flag = 1 + + LDR R2, =rt_interrupt_from_thread /* set rt_interrupt_from_thread */ + STR R0, [R2] ;将传入的from线程存入rt_interrupt_from_thread变量 + +_reswitch: + LDR R2, =rt_interrupt_to_thread /* set rt_interrupt_to_thread */ + STR R1, [R2] + + LDR R0, =ICSR /* trigger the PendSV exception (causes context switch) */ + LDR R1, =PENDSVSET_BIT + STR R1, [R0] + BX LR +``` + +### 实现时钟节拍 + +要实现时间片轮转调度、软定时器、rt_thread_delay()等功能,必须要保证rt_tick_increase()被周期性调用。在Cortex-M系列MCU中,可以使用系统滴答定时器来对其周期性调用。 + +``` C +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} +``` + +## 参考文档 + +[1] [Procedure Call Standard for the Arm Architecture - ABI 2020Q2 documentation](https://developer.arm.com/documentation/ihi0042/j/) + +[2] Joseph Yiu著. ARM Cortex-M3 与 Cortex-M4 权威指南(第3版). 吴常玉等译. 清华大学出版社 + -- Gitee From d9dde4ae920c0e5ebaac58b0e834c4beee5e58eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=BF=97=E8=BF=9C?= <1468728718@qq.com> Date: Mon, 16 Aug 2021 01:01:59 +0000 Subject: [PATCH 2/2] =?UTF-8?q?update=20rt-thread-version/rt-thread-standa?= =?UTF-8?q?rd/application-note/porting/cortex-m/port-cortex-m.md.=20?= =?UTF-8?q?=E5=B0=86~=E6=94=B9=E4=B8=BA-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application-note/porting/cortex-m/port-cortex-m.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md b/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md index 20fc215..6b20885 100644 --- a/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md +++ b/rt-thread-version/rt-thread-standard/application-note/porting/cortex-m/port-cortex-m.md @@ -165,7 +165,7 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, #### PendSV_Handler -产生PendSV异常时,Cortex-M系列处理器硬件会自动将from线程的PSR、PC、LR、R12、R3-R0压栈,因此在PendSV_Handler中,我们需要把from线程的R11~R4压栈,并把to线程的R11~R4弹出。修改PSP为to线程的栈地址,在退出PendSV中断时,硬件会自动弹出to线程的R3-R0、R12、LR、PC、PSR寄存器。 +产生PendSV异常时,Cortex-M系列处理器硬件会自动将from线程的PSR、PC、LR、R12、R3-R0压栈,因此在PendSV_Handler中,我们需要把from线程的R11-R4压栈,并把to线程的R11-R4弹出。修改PSP为to线程的栈地址,在退出PendSV中断时,硬件会自动弹出to线程的R3-R0、R12、LR、PC、PSR寄存器。 ``` assembly /* R0 --> switch from thread stack -- Gitee