CORTEX-M4知识点总结

发布时间 : 星期三 文章CORTEX-M4知识点总结更新完毕开始阅读

在异常入口处被压入栈空间的数据块为栈帧。不具有浮点单元的M4处理器,栈帧是8个字大小。带浮点的栈帧可能是8个或26个字大小。与上一个小节中所说的异常处理期间保存的寄存器为8个是一个意思。

AAPCS要求栈指针的数值在函数入口和出口处应是双字对齐的,双字栈对齐特性可编程,该特性可以关闭。M0中不可设置。压栈的xPSR的第9位表示栈指针的数值是否调整过,0未调整,1调整过,也就是会自动插入一个字的空间。所以,栈帧最大为9或27个字。

6.3 EXC_RETURN

6.1小节中说到过,处理器进入异常时,LR存储的是EXC_RETURN,这里说明一下,EXC_RETURN的具体细节。

EXC_RETURN是一个字大小,位域表示如下

位 31:28 27:5 4 描述 EXC_RETURN 指示 保留全为1 栈帧类型 (M0中无) 3 返回模式 数值 0xF 0Xefffff 1:8字 0:26字 1:返回线程模式 0:返回处理模式 2 返回栈 1:返回线程栈 0:返回主栈 1 0 EXC_RETURN的合法值

返回处理模式,总使用主栈 返回线程模式,返回后使用主栈 返回线程模式,返回后使用进程栈 __asm void vPortSVCHandler( void ) {

保留 保留 0 1 浮点未使用FPCA=1 浮点使用FPCA=0 0XFFFFFFE1 0XFFFFFFE9 0XFFFFFFED 0XFFFFFFF1 0XFFFFFFF1 0XFFFFFFFD PRESERVE8

ldr r3, =pxCurrentTCB

/* Restore the task stack pointer. */ /* Restore the context. */

ldr r1, [r3] }

ldr r0, [r1]

ldmia r0!, {r4-r11} msr psp, r0 isb mov r0, #0 msr basepri, r0

orr r14, #0xd /*或上0b1101,返回线程栈,线程模式*/ bx r14

6.4异常流程 6.4.1 异常进入和压栈

当异常产生且被处理器接受时,压栈流程会将寄存器压入栈中并组织栈帧。要注意的是,压栈期间的栈访问顺序和栈帧中的顺序不同,首先压栈的是PC和xPSR,这样在取向量时会尽快更新PC。

这里再复习一下主栈与进程栈的使用,在处理模式,必须使用主栈,在进程模式,由CONTROL寄存器控制使用主栈还是进程。

在处理器处于进程模式并且使用进程栈时,压栈操作使用进程栈,然后就进入了处理模式,直到异常返回之前,一直使用的是主栈,如异常嵌套的情况,在一个异常中又进入了另一个异常,仍然使用的是主栈进行压栈。

另外,我们在使用OS的时候会有两个栈空间,系统栈空间和任务栈空间,系统栈空间是在启动文件中进行了设置,如图6-1,这个栈空间是留给异常使用的,也就是处理模式下的MSP;而在创建任务的时候都会有对栈空间的设置,我们称为任务栈空间,也就是在线程模式下的PSP。

进入异常时,会将R0-R3,R12,LR和返回地址(带浮点单元时包括S0-S15和FPSCR)硬件自动压栈保存,其他的(R4-R11)需要软件保存。

6.4.2 异常返回和出栈

出栈时就是对EXC_RETURN数值的判断,也就是EXC_RETURN中位域所表示的那几项,用什么栈进行压栈的仍返回什么栈,操作模式和栈帧类型也类似。出栈操作结束时,还要检查xPSR的第9位,若置1则去除压栈时插入的额外空间。 对于栈空间中的数据,同入栈一样,R0-R3,R12,和LR(带浮点单元时包括S0-S15和FPSCR)是自动出栈的,其余的需要软件出栈。

7低功耗和系统控制特性

7.1 低功耗模式

CORTEX-M系列处理器提供两种休眠模式:休眠模式和深度休眠模式。由系统控制寄存器SCR控制。

处理器提供了两个用于进入休眠模式的指令:WFI,进入休眠模式,等待中断,可由中断、调试、复位唤醒。WFE:等待事件,条件进入休眠模式。内部事件寄存器为0,进入休眠,否则内部事件寄存器被清除,处理器继续执行,除了中断、调试、复位唤醒外,还能由事件唤醒。

WFE中的事件唤醒包括事件输入信号脉冲(RXEV)。该信号属于事件通信接口特性的一部分。处理器还存在一个名为TXEV(发送事件)的输出信号,当执行SEV(发送事件)指令时,TXEV会输出一个周期的脉冲信号。

事件通信接口的主要设计目标位,在一个特定事件发生前让处理器一直处于休眠模式。例如:

· 允许外设和处理器之间的通信 · 允许多个处理器间的通信

7.1 SysTick定时器

Cortex-M处理器内集成了一个小型的名为Systick的定时器,它属于NVIC的一部分,可以产生Systick异常。Systick为简单的向下计数的24位计数器。 Systick的主要作用是用于在OS中任务管理和上下文切换,处理器可以在不同时间片内处理不同任务。

设计这个定时器的目的是为了增加软件的可移植性。所有CORTEX-M系列的芯片都有相同的定时器。定时器的时钟可以是处理器时钟或者是外部参考时钟(STCLK)。

定时器的使用很简单,只有四个寄存器

地址 0XE000E010 0XE000E014 0XE000E018 0XE000E01C

寄存器 Systick控制和状态寄存器 Systick重装载值寄存器 Systick当前值寄存器 Systick校准值寄存器 作用 使能以及设置Systick Systick计时周期 Systick当前数值 校准设置

联系合同范文客服:xxxxx#qq.com(#替换为@)