参考arm_cortexm3_processor_trm以及其他网络上的资料整理
Cortex-M3是一种低功耗的处理器,具有门数低、中断延迟小和调试成本低的特点。
Cortex-M3处理器包含三个32位AHB-Lite总线接口和一个32位APB接口。
地址范围是0x00000000 到 0x1FFFFFFF,M3取指令通过该AHB-Lite接口,所有取指令都是使用32位数据宽度,Debug无法使用该接口。
地址范围是0x00000000 到 0x1FFFFFFF,M3或者Debug访问数据使用该AHB-Lite接口,M3访问数据的优先级高于Debug访问,即当同时有M3和Debug访问时,Debug访问将等待到M3访问完成。
ARM建议在ICode和DCode AHB总线接口之间进行任何外部仲裁,要确保DCode比ICode具有更高的优先级。
地址范围0x20000000 到 0xDFFFFFFF,0xE0100000 到 0xFFFFFFFF,M3取指令,M3或者Debug访问数据使用该AHB-Lite接口。
地址范围0xE0040000 到 0xE00FFFFF,M3或者Debug访问数据使用该APB接口。
External PPB (EPPB)空间地址范围0xE0040000 到 0xE0100000,应用于与coresight兼容的debug and trace组件。
The Cortex-M3 programmers model is an implementation of the ARMv7-M architecture.
M3有两种运行模式,Thread模式和Handler模式,区别是是否执行异常处理程序;有两种运行状态,Thumb状态和Debug状态,这个和执行的指令相关;有两种代码执行的权限,特权级和用户级,区别是访问资源的权限不同。
M3在复位或者异常返回时进入Thread模式。特权代码和用户代码都可以在线程模式下运行。
M3由于出现异常而进入Handler模式。所有代码在Handler模式下处于特权级执行。
Thread模式可以执行SVC指令进入异常,从而切换运行权限
Thumb状态,M3运行16位和32位Thumb指令时处于该状态。
Debug状态,M3在halt下处于该状态。
Handler 模式一定是处于特权级的,Thread模式可以处于特权级或者用户级。
从应用上看,操作系统运行在特权模式和用户模式,应用程序通常运行在用户模式,让操作系统给应用程序分配系统资源,并对其他进程和任务提供保护
The processor implements the ARMv7-M Thumb instruction set.
为了防止总线写数据处于wait cycle时M3停转,写数据会通过一个写缓冲区(Write buffer)到DCode总线和System总线。如果写缓冲区已满,则对总线的后续操作将停止,直到写缓冲区内的操作下发完成。
DMB和DSB指令会等待写缓冲区耗尽。如果在DMB或DSB等待期间出现中断,M3将在中断完成后返回到DMB或DSB之后的指令。这是因为中断处理充当了一个内存屏障操作(memory barrier)。
memory barrier,also known as membar or memory fence or fence instruction, is a type of barrier and a class of instruction which causes a central processing unit (CPU) or compiler to enforce an ordering constraint on memory operations issued before and after the barrier instruction.即等待之前的指令执行完成
通用寄存器R0-R12没有特殊定义的用途。寄存器R0-R7可通过所有指定通用寄存器的指令进行访问。寄存器R8-R12可通过所有指定通用寄存器的32位指令来访问,但不能被任何16位指令访问。
寄存器R13被用作堆栈指针。SP低两位不能写入,该寄存器是word对齐的。
该寄存器的复位值是0xFFFFFFFF。
Handler模式下使用SP_main,Thread模式会根据配置CONTROL.SPSEL使用SP_main或SP_process。
当执行跳转链接指令(BL)或跳转链接交换(BLX)指令时,LR存储当前PC的值。
Bit [0]总是0,该寄存器是word或者halfword对齐的
M3在异常输入和退出时更改IPSR的值,在Thread模式下,寄存器值为0;在Handler模式下,寄存器值为当前异常编号。
EPSR的T field,它被设置为1,表示处理器执行Thumb指令
ARM A和R架构有两个可选的指令集,ARM和Thumb。指令集状态标识当前的指令集,并且T位标识该状态。M只支持Thumb指令集,因此,只有当T位被设置为1时,处理器才能执行指令。设置为0会导致异常
异常掩码寄存器,一个1位的寄存器。如果将初始掩码设置为1,则会将执行优先级提升为0。
执行指令CPSID i,PRIMASK置1
执行指令CPSIE i,PRIMASK清0
基本优先级掩码,一个8位寄存器。BASEPRI更改了异常抢占所需的优先级级别。只有当BASEPRI的值低于当前执行的软件的未隐藏优先级时,它才会产生影响。在BASEPRI中实现的位数与在优先级寄存器的每个字段中实现的位数相同,并且BASEPRI与这些字段具有相同的格式。
故障掩码,一个1位的寄存器。将故障掩码设置为1,执行优先级提高为-1,即硬故障的优先级。只有在优先级低于-1时执行的特权软件才能将故障掩码设置为1。这意味着硬故障和NMI处理程序不能将故障掩码设置为1。从除NMI以外的任何异常返回都将清除故障掩码到0。
执行指令CPSID f,FAULTMASK置1
执行指令CPSIE f,FAULTMASK清0
软件可以使用MRS指令读取寄存器,并使用MSR指令写入寄存器。处理器会忽略用户级下的写访问。
软件必须使用ISB屏障指令,以确保在执行下一条指令之前,对CONTROL 寄存器的写入操作生效。
nPRIV, bit[0]
0 设置Thread模式下为特权级
1 设置Thread模式下为用户级
Handler模式下,会切换到特权级
SPSEL, bit[1]
0 使用SP_main
1 如果在Thread模式下,使用SP_process;在handler模式下,该位为保留位
Handler模式下,总是使用SP_main
FPCA, bit[2]
0 FP扩展未激活
1 FP扩展被激活
浮点支持
待更新