- UID
- 1029342
- 性别
- 男
|
cortex-m3 是一款非常强大的单片机,和arm A系列(应用处理器)的确有很大的区别
但是还是很多相似之处,毕竟都是arm的东西
下面是阅读CM3权威指南的一些摘要:
1. P25 两个级别(user,svc),2个运行模式(handler,thread),3种组合(user没有handler mode)
handler ,thread 的区别可能就是(4)中的自动压栈
特权 | 用户
———————————————————————
异常(exp,irq)处理 handler | 错误
———————————————————————
主应用的代码 线程 | 用户
注意mode 切换图
[特权handler mode]
/ ^ \ ^
/ / \ \
/ / (异常返回) (触发异常)
(异常返回) (触发异常) \ \
/ / \ \________________
/ / \_____________ |
/ / | |
V / V |
复位---> [特权级thread mode]----(修改CONTROL REG)--->(用户级thread mode)
CM3:
handler mode (注意总是 MSP!)
thread mode, 可以使用 MSP
thread mode, 也可以使用PSP,通过control reg 设置
注意和ARM9 ARM A系统等比较
它们在各异常(Abort,Undefine,IRQ,FIQ),User,Supervisor 都有自己的SP(R13)
移值时注意这个巨大差异!!!
2. P27 内存的分布
3. P30 异常名称介绍,[-1]----[-3] 3个固定优先级,NMI[-2] 的作用不错
P43 11-SVCCall, 15-SysTick 可以关注下
4. P32 进入异常服务例程,自动压栈 R0-R3,R12,LR(R14),PSR,PC(R15)
5. P36 栈指针分MSP(SP_main), PSP(SP_process) ,push,pop 指令根据CONTROL[1](P40],自动判断当前那个SP
如果有特殊要求可以通过MRS/MSR 来指定访问
6. P38 注意读PC 时,当前支流+4 ,和 arm9上 (PC+8)有区别,
pc 奇数这句表示必须在thumb2 下
7. P39 特殊功能寄存器 MRS/MSR 读/写
PSR 分:
APSR 应用程序PSR (N,Z,C,V,Q)[31-27]
IPSR 中断号PSR (Exception Number) [8-0]
(如果是thread,那么值为0,因为没有0号异常)
EPSR 执行PSR (ICI/IT)[26:25] ,(T)[34],(ICI/IT)[15:10]
8. P39. 异常(中断) 控制register
PRIMASK 开关中断
FAULTMASK 开关异常
BASEPRI 优先级
9. P40 快速开关中断异常
CPSID I RIMASK=1 关
CPSIE I ; =0 开
CPSID F ;FAULTMASK 关
CPSIE F
10. P40 CONTROL register
CONTROL[1] 0---MSP (reset default) (handler mode 必须为0)
CONTROL[1] 1---PSP
CONTROL[0] 1---svc mode
CONTROL[0] 0---user mode
11. P41 复位后为 thread mode + svc mode
thread mode + svc mode 对系统空间阻止访问,MRS/MSR 也禁用,否则fault
注意user ,svc mode 的切换 (control[0] + user 发生异常(+SVCall)
12. P43 异常相量表
P109 ,16 个异常,240 IRQ
13. P46 使用满递减栈,双栈(svc,user),用于带kernel的 user ,kernel 切换很好
14. P47 奇特的复位过程,可以看下
1. 从0x0地址取MSP
2. 从0x4地址取PC的值,这个值是复位向量,LSB 必须为1,然后从这个地址所
对应的地址处取值
[reset] -->[0x0(MSP)][0x4(复位向量)]----->[Reset Vector] !
(0x0--开始是MSP,然后接下拉是向量表!!!)
(向量表中都是32bit 地址,比如0x4放的就是reset 执行指令位置)
P148 图3.18
15. P50 指令后缀使用:
S 更新APSR中标志 EQ,NE,LT,GT 等等
等只有B(跳转)指令才能任意用,其他指令引入IF-THEN 块,在这个块中才可以加后缀
16. P51 注意thumb 语法和thumb 2 以及arm 的区别 ,在UAL 下thumb2 和arm 基本相似
但也可以用thumb 语法明确 16bit 指令
或者通过 .N(16bit) .W(32bit) 来指定 16bit ,32bit
17. P59 自增自减,根据指令宽度, LDMIA Rd! ,{register list} 读后Rd 自增16bit
LDMIA.W RD! ,{register list} 读后Rd 自增32bit
18. P69 BX reg, 指令中reg 中最低位必须为1 (LSB=1) ,因为CM3 只在Thumb 中允许,否则fault
而BLX reg arm ,thumb 都支持,根据LSB=1 thumb LSB=0 arm
19. P71 大多数16bit 算术逻辑指令,直接更新标志位 ,除 ADD.N Rd,Rn,Rm
32bit 需要S 后缀来控制
20. P72 barrier 指令
DMB --- 数据访问指令等前面数据访问指令完成才执行
DSB --- 任何指令等前面数据访问指令完成才执行
(比如建立完所有向量后追加1条DSB P168)
ISB --- 任何指令等前面指令完成才执行
依次往下表现barrier 更严格
21. P73 带符号 饱和运算指令 SSAT.W Rd #imm5,Rn,{,shift}
不带符号饱和运算指令
22. P75 MRS/MSR 除APSR 可以在user级访问,其他必须特权级
23. P76 IF-THEN(IT)里最多有4条支流
IT <cond> ; 围起1条
IT<x> <cond> ; 围起2条
IT<x><y> <cond> ; 围起3条
IT<x><y><z> <cond> ; 围起4条
<x><y><z> =>为 T(then),E(else)
IT指令的意义:
当执行到跳转指令时,需要清洗流水线,处理器必须从跳转地址重新取指,
IT可以改善一些小跳转!!!
24. P76 比较跳转CBZ <Rn> , <lable> CBNZ <Rn> , <lable> ,但范围很小只有0-126
并且不会更新标志位
25. P80 跳转表指令TBB ,TBH
26. P84 CM3 存储映射
0x0-------------------------------------------------------------------------4G
|512M(代码)|512M(片上SRAM)|512M(片上设备)|512M(片外SRAM)|512M(片外设备)|512M|
/ |
---------------------------------- |
|内部私有外设总线|外部私有外设总线|其他|
0xE0000000 0xE0040000 0xE0100000 |
|