在操作系统开启了一个用户程序后,通常都会让它在用户级下执行,从而使系统不会因某个程序的崩溃或恶意破坏而受损。可参照MQX中的超时函数中的,usermode进行理解。
嵌套向量中断控制器(NVIC)与内核紧密耦合。
特点:
z 可嵌套中断支持
z 向量中断支持
z 动态优先级调整支持
z 中断延迟大大缩短
z 中断可屏蔽
M3 内部有若干个总线接口,以使 CM3 能同时取址和访内(访问内存),它们
z 指令存储区总线(两条)
z 系统总线
z 私有外设总线
M3,M4有MPU。M0+没有MPU
M3只是用Thumb-2指令。允许32位指令和16位指令。
在过去,做 ARM 开发必须处理好两个状态。这两个状态是井水不犯河水的,它们是:32 位的ARM 状态和16 位的 Thumb 状态。当处理器在 ARM 状态下时,所有的指令均是 32 位的(哪怕只是个”NOP”指令),此时性能相当高。而在 Thumb 状态下,所有的指令均是 16 位的,代码密度提高了一倍。不过,thumb 状态下的指令功能只是 ARM下的一个子集,结果可能需要更多条的指令去完成相同的工作,导致处理性能下降。
伴随着 Thumb‐2 指令集的横空出世,终于可以在单一的操作模式下搞定所有处理了,再也没有 来回切换的事来烦你了。事实上,Cortex‐M3 内核干脆都不支持 ARM 指令,中断也在 Thumb 态下处理(以前的 ARM 总是在 ARM 状态下处理所有的中断和异常)。这可不是小便宜,它使 CM3 在好几个方面都比传统的 ARM处理器更先进:
M0+同样也支持THUMB-2指令集。
功耗低于0.19mw/MHZ
功耗用mw/MHZ来表示.
位带寻址操作。
R13 是堆栈指针。在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。
当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS,MSR指令) 。这两个堆栈指针分别是:
z 主堆栈指针(MSP) ,或写作 SP_main。这是缺省的堆栈指针,它由 OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
z 进程堆栈指针(PSP) ,或写作 SP_process。用于常规的应用程序代码(不处于异常服用例程中时)。
PUSH {R0} ; *(--R13)=R0。R13 是long*的指针
POP {R0} ; R0= *R13++
寄存器的 PUSH 和 POP 操作永远都是 4 字节对齐的
尽管 PC的 LSB 总是 0(因为代码至少是字对齐的),
读 PC时返回的值是当前指令的地址+4
如果向 PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器) 。CM3 中的指令至少是半字对齐的,所以 PC的 LSB 总是读回 0。然而,在分支时,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC的数值是奇数(即LSB=1) ,用以表明这是在Thumb状态下执行。倘若写了0,则视为企图转入ARM模式,CM3将产生一个fault异常。
特殊功能寄存器
z 程序状态寄存器组(PSRs或曰 xPSR)
z 应用程序 PSR(APSR)
z 中断号 PSR(IPSR)
z 执行 PSR(EPSR)
z 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及 BASEPRI)
z 控制寄存器(CONTROL)