七 嵌入式ARM开发那些必须要知道的知识点总结

前言

本篇主要是对嵌入式开发过程中遇到的一些很小的知识点进行记录,就像阅读一篇英语文章,碰见一些不认识的,不熟悉的单词,语法,查阅资料搞懂记录下来,这些零碎的东西聚少成多,也是一笔客观的知识财富。以后会随着新的知识点的积累,扩充内容。

1.ARM架构分类
ARMv7-A架构 cortex-A 需要处理高端嵌入式系统(如ios,android,linux,windows)复杂应用的应用处理器,实际产品包括智能手机,平板电脑,电视及服务器
ARMv7-R架构 cortex-R 实时高性能的处理器,面向高端的实时市场,应用包括硬盘控制器,移动通信的基带控制器以及汽车系统
ARMv7-M架构 cortex-M 面向微控制器和混合信号设计等小型应用,注重低成本,低功耗(M3,M4)
ARMv6-M架构 M1(FPGA设计),M0,M0+(超低功耗,低成本微控制器)

2.开发组件中的多种工具
C编译器:将C程序文件编译为目标文件
汇编器:将汇编代码文件汇编为目标文件
链接器:合并多个目标文件,并且定义存储器配置

3.轮询与中断
轮询:适合简单的应用,但是能耗效率差,不需要服务时也会浪费很多能量
中断:为了解决轮询的缺点,几乎所有的微控制器都会提供某种休眠模式以降低功耗,在需要时通过中断唤醒

4.多任务系统
有些执行时间比较长的任务可能需要同步处理,要实现这一操作可以将处理器时间划分为多个时间片,并且将时间片分配给这些任务。
实时操作系统RTOS可用于处理任务调度,实现多进程同时执行,但是需要一个定时器来记录RTOS的时间,而且在每个时间片的最后,定时器会产生定时中断,它会触发任务调度器,且确定是否要执行上下文切换,许多RTOS都可用于cortex-M处理器。

5.C程序中的数据类型
C编程语言支持多种“标准”数据类型,不过数据在硬件中的表示方式要取决于处理器架构和C编译器,对于不同的处理器架构,某种数据类型的大小可能是不一样的。
由于特定数据类型大小的差异,将应用程序从8位或16位微控制器移植到ARM cortex-M上时可能需要修改源代码。
char,int8_t,uint8_t 8
short,int16_t,uint16_t 16
int,int32_t,uint32_t 32
float/long 32
double 64
long double 64
long long 64

6.在ARM编程中还可以将数据大小称为byte(字节8位),half word(半字16位),word(字32位)以及double word(双字64位)。
cortex-M处理器使用的指令集名为Thumb(包括16位的Thumb指令和32位的Thumb指令),M3和M4处理器允许16位和32位指令的混合使用,以获取更高的代码密度和效率

7.存储器系统:M3,M4处理器本身并不包含存储器(没有程序存储器,SRAM,缓存),它们具有通用的片上总线接口,因此微控制器供应商可以将它们自己的存储器系统添加到系统中,一般老说会将下面的部件添加到存储器系统,这样不同微控制器产品可能会具有不同的存储器配置,存储器大小和类型以及不同的外设

8.寄存器
对于ARM架构,若处理的是存储器中的数据,就需要将其从存储器加载到寄存器组中的寄存器里,在处理器内处理完后,若有必要,还要写回寄存器,这种方式称为“加载-存储架构”,
M3/M4中有16个寄存器,其中13个位32位通用目的寄存器,其他3个则有特殊用途R0–R15。
R0-R12 R0-R7称为低寄存器,许多16位指令只能访问低寄存器,高寄存器则可以用于32位指令和几个16位指令,R0-R12的初始值是未定义的。
R13 栈指针(SP) 可以通过PUSH和POP的操作实现栈存储的访问,物理上存在两个栈指针:主栈指针(MSP)为默认的栈指针,在复位后或处理器处于处理模式时。其会被处理器选择使用,另外一个栈指针(PSP名为进程栈指针),只能用于线程模式,
对于一般的程序,这两个寄存器只会有一个可见。
R14(LR) 又被称为链接寄存器,用于函数或子程序调用时返回地址的保存
R15(PC)程序计数器,读操作返回当前指令地址加4,写PC会引起跳转操作;由于指令必须要对齐到半字或字地址,PC的最低位(LSB)为0,不过在使用一些跳转/读存储器指令更新PC时,需要将新PC值得LSB置1以表示Thumb态,否则就会触发错误异常。

9.复位
上电复位: 复位微控制器中的所有部分,其中包括处理器,调试支持部件和外设
系统复位:只会复位处理器和外设,不包括处理器的调试支持部件
处理器复位:只复位处理器

10.数据对齐和非对齐
由于存储器系统为32位的,大小为32位(4字节或字)或16位(2字节或半字)可以是对齐或者非对齐的,对齐传输的意思是地址值为大小(以字节为单位)的整数倍,eg:字大小的对齐传输 0x00000000,ox00000004,0x00000012

11.嵌入式os
嵌入式OS可以是一个简单的任务调度器,也可以是LINUX等全特性OS,许多嵌入式OS都是实时操作系统RTOS,这就意味着当特定事件产生时,它可以在一定时间内触发相应的任务,RTOS一般体积较小,且可以进行快速的上下文切换。cortex-M处理器无法支持
Linux和windows等全特性OS,因为它们需要虚拟存储器系统的支持。
对于CORTEX-A等应用处理器,存储器管理单元MMU可以将每个进程的虚拟地址空间动态映射到系统的物理地址空间,虚拟存储器的管理会引入较大的延迟,因此使用虚拟存储器的操作系统无法保证实时响应。
许多应用根本不需要嵌入式OS,使用嵌入式OS的最大好处是在于它可以提供一个灵活的方法使得多任务可以并行运行,若任务比较短且多数时间内不会重叠,则可以通过中断驱动的方法里实现多任务。

12.截取浮点数小数长度
假如有一个float数a,那么可以定义另一个float b,然后通过sprintf格式化打印到b里面来截取小数点位数

13.ADC的分辨率和精确度
这是两个完全不同的概念,然而使用起来确经常混淆。现在假如VREF = 3.3v,以12位ADC为例讨论一下。
分辨率:即ADC采集数字值变化1,电压值的增量
12位ADC,相当于ADC表示的电压可以分为4096份,那么分辨率=3.3/4096 = 0.8mv,
精确度:表示的是实际值和理论值的差异,通常用实际有效位数来衡量

你可能感兴趣的:(STM32基础知识归纳系列,嵌入式,arm)