学习心得之ARM (STM32F207)

来源:互联网 发布:linux启动过程 编辑:程序博客网 时间:2024/06/03 17:15

上一篇专门有提到MSC51的汇编,有MSC51的就应该有对应其它平台的汇编,现在详解ARM下的。

首先讲下两者的区别:

1.C51所用的指令集应用于所有X86架构的系统,被称为CISC(复杂指令集),对应的ARM系列指列集为RSIC(精简指令集),一个指令集复杂,另一个简单。

讲讲ARM简单之处,首先ARM指令集每条指令都是固定长度,32位,这样方便CPU取指,提高速率;另外,ARM指令的种类相对较少,操作却灵活方便,如LDR除了简单的传送一个操作数外还可以实现成批数据的传送,如加法指令ADD,除了简单两数相加,还能实现更灵活的应用,ADD R0,R1,#21H,且每条指令都能随用户选择是否影响标志位。这样使得原来由很多条指令才能完成的功能,一条就可以实现;寻址方式相对而言较少,少了部分对存储器寻址的寻址方式。

ARM的汇编虽然相对C51有这样那样的优点,但是基本实现的功能都一样:数据传送,运算,跳转。。

2.系统资源不一样。ARM的通用寄存器都是32位的,总共有31个,地址寄存器32位的,这样可以实现访问4GB的存储空间包括内部存储器及I/O端口。

3.寄存器数量多,大部分操作都在寄存器中完成,从而提高处理速度。(而CISC有相当一部分在存储器中完成的:寄存器间接寻址,基址加变址寻址,相对寄存器寻址,相对基址加变址寻址等这些寻址方式都是对存储器进行操作的)。

4.新增几种异常处理模式,即发生异常时,会自动跳入到相应的异常中断中去。

现就基于contex_m3内核的ARM讲一下其内部资源:

1.中断

一个中断的优先级特点由抢占优先级和子优先级来描述,所谓抢占优先级主要针对中断嵌套中断的情况,即当正在执行一个低先级的中断,出现高优先级中断时,可以打断当前中断,转而执行高优先级中断,实现抢占机制;子优先级主要是针对,在执行非中断程序时,同时出现多个中断,选择优先级高的中断执行的情况;对一个中断资源的优先级进行设置时,需设置一个四位的优先级寄存器,来决定这两个优先级各自的大小,而优先级组号,定义了抢占优先级的位数,如当使用优先级组1时,表示四位寄存器仅最低位1位来决定抢占优先级的大小,当此位为0时,表示,抢占优先级大小为0,为1时亦然。其余的三位用于表示子优先级的大小,可表示从0~7任何优先级数,

注意:优先级数越低,优先级也低。因此可推算优先级组1可表示,两种抢占优先级,每种分别对应8种子优先级,共16个优先级别。另外,由于有些系统跑OS需要用到tick时钟,从而实现时间片轮转进行任务调试,且时间片轮转必须是抢占模式,因此,针对这种情况,不能使用优先级组0,因其0个位表示抢占优先级,即不支持抢占优先级。

2.时钟

根据速度及片内片外情况,分为HSE高速外部时钟;HSI调整内部时钟,LSE低速外部时钟,LSI低速内部时钟;共四个时钟源。

其中

HSE:一般通过外接一个3~25MHZ晶振产生,可作为系统时钟。

HSI:内部自带时钟,系统的默认时钟源,大小为8MHZ.

LSE:通过外接一个32.768KHZ的晶振产生,可作为RTC的时钟源;

LSI:内部自带时钟,大小为40Khz的晶振,一般将其32分频后作为内部看门狗的时钟源;

由于系统不同的设备需要的时钟大小可能不同,因此,需要根据实际情况对上述时钟源进行,分频或者倍频处理,当系统时钟最大支持72MHZ,因此如果外接8MHZ的调整外部时钟时,可通过PLL倍频9后得到,或者通过内部时钟倍频后得到;而分频器,主要针对时钟频率较低的内部设备,系统根据设备的支持速度进行分类,即速度要求相近的归为一类,总共分为三类,为这三类分别指定了三种分频器,为AHB,APB1,APB2,分别产生HCK,PLK1,PLK2三种时钟频率,用户可根据需求设备其分频大小,此处的分频,主要是针对系统频率的分频。这三类时钟频率中,有时候,根据用户使用情况及设备的限制,需要对其中某类中的某个设备设定另外指定的频率,如APB2的ADC最大支持14MHZ,当用户设置APB2超过此频率时,则需要对其进行强制更改;如USB它并没有归类为三类中的任何一种,因为它的速率要求比较高为48MHZ,可通过72MHZ的系统频率1.5分频后获得;

3.内存

不仅ARM,所有的嵌入式设备均将系统内存根据编译情况,分为代码段(CODE),只读数据段(RO),读写数据段(RW),未初始化读写数据段(ZI),堆(HEAP),栈(STACK),

它们的使用情况,可以通过编译后的.map文件来获取,方便发现内存溢出等异常情况。其中的code,RO,RW,ZI等段在下载代码后,会对应的映射到flash中,一旦设备上电后,首先会将RW,ZI复制到系统对应的RAM区,而HEAP/STACK是程序在运行过程中装载的。