Cortex-M3那点事

一:寄存器组

Cortex-M3处理器拥有R0-R15的寄存器组:

R0-R12是通用寄存器。

R13作为堆栈指针SP有两个,但在同一时刻只有一个起作用。

(MSP: 复位后默认使用的堆栈指针,用于操作系统内核以及异常处理例程,PSP: 由用户的应用程序代码使用)

R14: 连接寄存器。

R15:程序寄数器,指向当前的程序地址。

特殊功能寄存器:

● 程序状态寄存器组(PSR)

● 中断屏蔽寄存器组(PRIMASK,FAULTMASK,BASEPRI)

● 控制寄存器(CONTROL)

Cortex-M3中有专门的指令复责堆栈操作——PUSH和POP,其汇编语法如下:

PUSH{R0}; *(–R13) = R0

POP{R0}; R0 = *R13++

注意注释:何谓“向下增长的满栈”?在PUSH新数据时,堆栈指针先减一个单元,通常在进入一个子程序后,第一件事就是把寄存器的值先PUSH入堆放栈中,在子程序退出前再POP曾经PUSH的那些寄存器。在程序中可以直接把R13写作SP。

R15又叫作“PC”,读PC时返回的值是当前指令的地址+4。

特殊功能寄存器组专用的访问指令:

MRS R0 , PC;读特殊功能寄存器的值到通用寄存器

MSR PC ,R0;写通用寄存器的值到特殊功能寄存器

二:操作模式和特权级别

两种特权操作模式:handler mode 和 thread mode

特权的分级:特权级和用户级

Thread mode可以使用特权级也可以用用户级,但异常服务例程必须使用特权级。

复位后,处理器默认进入thread mode,特权级访问。

从用户级到特权级的唯一途径就是异常,特权级可以通过修改CONTROL寄存切换到用户级。

三:总线接口

Cortex-M3内部有若干条总线接口,使CM3能同时取址和访问内存,它们是:

● 指令存储区总线(若干条)

● 系统总线

● 私有外设总线

两条代码存储区总线负责对代码存储区的访问,分别是I-Code 总线和我D-Code,前者用于取指,后者用于查表等操作,它们按最佳执行速度进行优化。

系统总线用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。

私有外设总线负责一部分私有外设的访问,主要是访问调试组件。它们是系统级存储区。

四:中断和异常

ARMv7-M开创了一个全新的异常模型,这种异常模型跟传统的ARM处理器使用完全是两码事。新的异常模型“使能”了非常高效的异常处理,它支持16-4-1=11种系统异常,外加240个外部中断输入,在CM3中取消了FIQ的概念,这是因为有了更新的更好的机制——中断优先级管理以及嵌套中断支持,它们被纳入CM3的中断管理逻辑中,因此,支持嵌套中断的系统就更容易实现FIQ。

CM3的所有中断机制都由NVIC实现。

五:向量表

CM3响应一个发生的异常后,对应的异常服务例程就会执行,为了决定异常服务程序入口地址,CM3使用“向量表查询机制”。向量表其实是一个WORD数组。

六:常见部分汇编指令(移植操作系统时用)

1.后缀的使用:

● S 更新APSR的相关标志

● EQ,NE,LT,GT等:EQ = Euqal, NE = Not Equal, LT = Less Than ,GT = Greater Than.

2.APSR的5个标志:N: 负数标志(Negative);

Z: 零结果标志(Zero);

C: 进位/借位标志(Carry);

V:溢出标志(oVerflow);

              S: 饱和标志;

3.ADC:带进位的加法

4.ASR: 算术右移

5.BIC: 按位清0

6.CMP: 比较(更新标志)

7.EOR: 近位异或

8.LSL: 算术左移

9.ORR: 按位异或

10.ROR: 圈圈左移

11.SBC: 带借位的减法

12.SUB: 减法

13.TST: 测试

14.BL: 转移并链接

15.CBZ: 比较,如果结果为0就转移

16.LDR: 从存储器中加载一个字到一个寄存器中

17.LDRH 加载半字

18.LDRB: 加载一个字节

19.STR:

20.STRH:

21.STRB:

22.TST: 测试(执行按位与操作,并且根据结果更新Z)

     (其本质就是AND指令,只是不写`回运算结果,只更新标志位)

23.TEQ: 测试是否相等(对两个数妨行异或,更新标志但不存储结果)

24.IF THEN 指令

例:CMP RO,R1

ITTEEEQ:如果R0 == R1,Then-then-Else-Else

ADDEQ

ADDEQ

ADDNE

ADDNE

七:异常

Cortex-M3在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中编号1-15的对的应系统异常,大地等于16的则全是外部中断。

(细分中断和异常:240个外部中断对CM3核来说都是是“意外的突发事件”——也就是说,该诸求信号来自CM3内核的外面,来自各种外部片上外设和外扩的外设,对CM3来说是“异步”的,而异常则是因CM3内核的活动产生的——在执行指令或访问存储器时产生,因此对CM3来说是“同步”的)

当发生了异常并且要响应它时,CM3需要定位其服务例程的入口地址,这些入口地址存储在所谓的“异常向量表”中。

八:SVC和PendSV

SVC(系统服务调用)和PendSV(可挂起系统调用)多用在操作系统的软件开发中。SVC用于产生系统函数的调用请求,例如:操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数,让用户程序使用SVC发出对系统服务函数的调用请求,以这种方式调用它们来直接访问硬件。因此,当用户程序想要控制特定硬件时,就要产生一个SVC异常,然后操作系统提供的SVC异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。

这种“提出要求——得到满足”的方式,很好,很强大,很方便,很灵活,很能可持续发展。首先,它使用户程序从控制硬件的繁文缛节中解脱出来,由OS负责控制具体的硬件。第二,OS的代码可以经过充分的测试,从而使系统更加健壮和可靠。第三,它使用户程序无需在特权级下执行,用户程序无需承担因误操作而瘫痪整个系统的风险。第四,通过SVC的机制,用户程序变得与硬件无关,因此在开发应用程序时无需了解硬件的操作细节,从而简化了开发的难度和繁琐度,并且使应用程序跨平台移植成为可能。

SVC异常通过执行SVC指令来产生。该指令需要一个立即数充当系统调用代号。SVC异常服务例程序稍后会提取出此代号,从而获知本次调用的具体要求,再调用相应的服务函数。

另一个相关的异常是PendSV,它和SVC协同使用。一方面,SVC异常是必须执行SVC指令后立即得到响应的,应用程序执行SVC时都是希望所需的请求立即得到响应是。另一方面,PendSV则不同,它可以像普通的中断一样被挂起,OS可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作,挂起PendSV的方法是:手工往NVIC的PendSV挂起寄存器中写1,挂起后,如果优先级不够高,则将缓期执行。

(参见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值