ARM Cortex-M3知识

Cortex-M3是一个32位处理器内核,内部数据路径是32位的,寄存器是32位的,存储器接口也是32位的,采用了哈佛结构,拥有独立指令总线和数据总线,让取指和数据访问并行不悖。 系统控制块(SCB)是内核外设的主要模块之一,提供系统控制以及系统执行信息,包括配置,控制,报告系统异常等

Untitled

Cortex-M3处理器拥有R0-R15的寄存器组 R0-R12都是通用寄存器,用于数据操作,绝大部分16位Thumb指令只能访问R0-R7,而32位Thumb-2指令可以访问所有寄存器。 R13是MSP主堆栈指针,PSP进程堆栈指针。MSP主堆栈指针,复位后缺省使用的堆栈指针,main函数运行时用的MSP,main函数运行前,启动文件会分配一个堆栈空间,用于保存main函数里的变量,MSP就指向该堆栈的首地址。PSP进程堆栈指针由用户的应用程序代码使用 R14是连接寄存器(LR),记录函数跳转前的PC指针指向位置的下一条指令地址,函数调用完后就可以令PC等于LR的值,跳转继续运行调用函数后的语句。 R15程序计数器(PC),存储程序当前运行的位置,对PC指针赋值可以实现程序的跳转,例如函数调用

特殊寄存器 程序状态字寄存器组(xPSR)、中断屏蔽寄存器、控制寄存器(CONTROL),通过MRS和MSR指令访问特殊寄存器

Untitled

xPSR寄存器记录(算数逻辑单元)ALU标志,包括了应用PSR(APSR)、执行PSR(EPSR)、中断PSR(IPSR)三个状态寄存器。其中24位置1表示处于Thumb状态

三个寄存器合起来的功能位

三个寄存器合起来的功能位

各个位的作用

各个位的作用

中断屏蔽寄存器

Untitled

CPSID    I    ;PRIMASK=1,关中断
CPSIE    I    ;PRIMASK=0,开中断
CPSID    F    ;FAULTMASK=1,关异常    
CPSIE    F    ;FAULTMASK=0,开异常

CONTROL寄存器用来定义特权状态,并且决定使用哪一个堆栈指针。在特权级线程模式下,才可以写CONTROL[1],而在异常返回时,也可以通过修改LR的位1和位2实现模式切换和指针选择,例如RTOS中的SVC中断服务函数vPortSVCHandler(void)orr r14, #0xd

Untitled

操作模式:处理器模式(handler mode)和线程模式(thread mode)用于区别普通应用程序和异常服务例程的代码(包括中断服务例程的代码) 特权级别:特权级和用户级,提供存储器访问保护机制,使得普通用户不能意外地甚至恶意地执行涉及要害的操作,用户级不能访问特殊功能寄存器,特权级可以访问所有范围的存储器,并执行所有指令。 CM3运行主应用程序时(线程模式)可以是特权级也可以是用户级,但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权级访问。特权级可以通过修改CONTROL寄存器切换到用户级,而用户级想切换到特权级就需要申诉,执行系统调用指令(SVC),然后在SVC异常服务例程中批准,然后服务例程中修改CONTROL寄存器才能重返特权级。用户级返回特权级唯一途径就是异常。在RTOS中的线程一般运行在用户级(多线程,可防止一个线程异常导致系统崩溃),而裸机一般在特权级(相当与单个线程用户级就没多大意义)。

NVIC(嵌套向量中断控制器)是CM3在内核水平上搭载的中断控制器,提供①可嵌套中断支持 ②向量中断支持 ③动态优先级调整支持 ④中断延迟大大缩短 ⑤中断可屏蔽。访问地址是0xe000e000

中断和异常

中断/异常的响应序列 ①入栈:把8个寄存器的值压入栈,自动保存现场,依次把xPSR,PC,LR,R12和R3-R0由硬件自动压入堆栈,压入R0-R3是为了编译器优先使用来保存中断服务例程中的结果。 ②取向量:从向量表中找出对应的服务程序入口地址 ③选择堆栈指针,更新SP,更新连接寄存器LR和程序计数器PC,LR寄存器在异常返回时使用,最低四位用来决定程序使用的堆栈指针、模式、状态。

向量表:当发生异常时并且要响应时,CM3需要定位其处理例程的入口地址,这些入口地址存储在所谓的”(异常)向量表“中,缺省情况下,CM3认为该表处于零地址处,且各向量表占用4字节