参考资料
《嵌入式系统设计与开发 第二版 中国矿业大学出版社》
个人认为嵌入式开发是比互联网软开(如Java后端开发)开发是要难一些的。Java开发基本上是用户态
的,但是嵌入式
很多东西都深入了内核态
,难度就上去了。
博主认为嵌入式的繁琐与难主要体现在以下几个方面
博主小见
越往底层对人能力的锻炼就越高
,对于能力来说是在升维
。
嵌入式系统是以
应用
为中心、计算机技术
为基础
、软硬件可裁减
、适用于应用系统
对功能、可靠性、成本、功耗、体积
严格要求的专用计算机系统
。
本质是计算机系统,不过是专用计算机系统(满足应用系统特殊要求的计算机系统,特别针对某种功能
而设计
出来的)。
由此可知,嵌入式系统有两个重要特点
便于开发者进行嵌入式项目开发,嵌入式系统具有交叉编译的功能。
交叉编译
一种计算机环境
下的编译程序
编译
出在另一种计算机环境下运行
的代码支持
交叉编译嵌入式系统和计算机系统一样,都是由软件和硬件
组成。
微处理器
和外围设备
,其中以微处理器
为核心
固件
、嵌入式操作系统
和应用程序
等此博客主要介绍硬件的组成。
是嵌入式系统的核心
,一般只保留与用户紧密相关
的功能部件
,因此具有体积小
、重量轻、成本低
、可靠性高
等特点
通用CPU
中许多由主板
完后的任务集成
到芯片
内部,小型化
、高效率
、高可靠
两个关键词
嵌入式微处理器的分类
DSP算法
集成
到单一芯片
上几款常用的嵌入式微处理器系列
除了
中心控制部件
(MCU、DSP、EMPU、SoC,也就是几种微处理器),其它部件
都可以算作嵌入式外围设备
。
主要有存储
、通信
、IO
、调试
、显示
5大功能部件
存储设备
其中FLASH
【非易失型
存储器】凭可擦除次数多
、成本低
、速度快
、容量大
得到了广泛应用。
通信设备
大多数的通信设备都可以直接在嵌入式系统中使用。
嵌入式软件可以分为 固件、嵌入式操作系统和应用程序等。
分配
、回收
、控制
和协调
全部软硬件资源的并发活动
运行环境
与接口
运行
的基础
专用应用领域
嵌入式硬件平台
预期
功能的计算机软件
目前大部分嵌入式操作系统都是实时操作系统,而且大多是实时多任务
系统(Real-Time Operating System ,即RTOS)。
简单介绍
产生时
,能够接受并以足够快
的速度予以处理
,其处理的结果
又能在规定的时间之内来控制生产过程或
对处理系统做出快速响应
,调度一切可利用的资源完成实时任务
,并控制所有实时任务协调一致运行
的操作系统。只依赖于优先级的设计
常用的RTOS系统
专用于特定任务
多类型处理器和处理器系统支持
通常极其关注成本
一般是实时性系统
可剪裁性比较好
嵌入式系统的可靠性比较高。
由于部分嵌入式系统所承担的计算任务涉及产品质量、人身安全……,嵌入式系统对可靠性的要求极高。
大多有功能约束。
ARM是嵌入式领域中使用最为广泛的32位微处理器结构。
ARM微处理的系列
ARM微处理器采用RISC架构
不同系列的微处理器内核结构适应不同的应用领域
示例
系统的工作频率
很大程度上决定了ARM微处理器
的处理能力
。
不同芯片对时钟的处理不同,有的芯片只需要一个主时钟频率
,有的芯片内部时钟控制器
可以为不同的部件提供不同的频率的时钟
。
到多数ARM的微处理器的芯片内部存储器的容量都不太大,很多时候需要用户在设计系统是连接外部存储器
以满足存储空间的要求。
几乎所有的ARM芯片根据各自不同的引用领域扩展相关功能模块
,并集成
在芯片中,称为片内外围电路
。
ARM体系结构将存储器看做是从零开始的字节的线性组合。
32位处理器很多情况下是以字为单位进行处理的(一个字为4个字节,8位二进制代表一个字节,2位16进制代表一个字,4位8进制代表一个字,32位2进制代表一个字)
ARM为处理器支持两种方式存储字数据
低地址存放高字节
,即字转换成字节后,左端放在低地址中,形成大端】低地址存放低字节
,即字转换成字节后,右端放在低地址中,形成小端】低地址
而言的,便于记忆复位时
、异常返回时
会进入此模式,其中特权模和用户(非特权)模式代码
能够在线程模式下运行。
出现异常时
,微处理器进入处理模式
,在处理模式下,所有代码
都是特权
访问的。
ARM Cortex-M有两种工作状态
Thumb状态是16位和32位“半字对齐”的Thumb和Thumb-2指令
的执行状态
处理器停止
并进行调试
时所进入的状态
功能部件
的原理
及功能介绍
中断发生
时,自动取出
对应的服务例程入口地址
,直接进入
相应的服务例程,为缩短中断延迟
做出了比较大的贡献。中断嵌套
,允许通过提高中断的优先级
对某个中断进行提前处理
。重定位的向量表
,表中包含处理各个中断将要执行的函数的入口地址
,可供具体的中断处理器使用。在复位
时向量表
指向零
,通过编程
控制寄存器
可以使向量表重新定位到指定位置
。AHB互联
的网络
,通过它可以让数据
在不同的总线
之间并行传送
。通用寄存器R0~R15和一些特殊功能的寄存器
其中,R0~R12
是通用目的寄存器,都可以被32位指令
访问,而大多数16位指令
只能访问 R0~R7
。
所有指令
访问,复位
后的初始值不确定
所有32位指令
访问,复位
后的初始值不确定
分支和连接
指令(BL)或带有交换的分支和链接
指令(BLX)时,LR用于接收来自PC的返回地址。LR也用于异常返回
。程序计数器
,指向当前的程序地址
。改变程序计数器的值,就能实现改变程序执行流程的目的。控制异常
的使能
和禁止
除NMI
(不可屏蔽中断)外的所有中断所有错误
,但是NMI
依然不受影响
优先级不高于某个数值
的中断CONTROL
主要用于定义特权级别
和堆栈指针的选择
指令系统向后兼容
MOV R8,R3//把R3数据传送给R8
功能
LDR Rd,[Rn,#offset] //从地址Rn+offset处读取一个字送到Rd
//延伸
LDRB …… //……字节
LDRH …… //……半字,两个字节
功能
加载指令LDR把存储器
中的内容加载到寄存器
中。
STR Rd,[Rn,#offset] //把Rd的低字存储到地址Rn+offset处
//延伸
STRB …… //……字节
STRH …… //……半字,两个字节
STRD Rd1,Rd2,[Rn,#offset] //把Rd1(低32位,低字)和Rd2(高32位,高字)的双字存储到地址 Rn+offset处
功能
存储指令STR把寄存器的内容存到存储器中
MRS <gp_reg>,<special_reg> //`读`特殊寄存器到通用寄存器 读特
MSR <special_reg>,<gp_reg> //`写`通用寄存器到特殊功能寄存器 写特
对数据的各种运算处理
有ADD(加)、SUB(减)、MUL(乘)、UDIV/SDIV(除)这四种指令
ADD Rd,Rn,Rm; //Rd=Rn+Rm
SUB Rd,Rn.Rm;//Rd=Rn-Rm
MUL Rd,Rn.Rm;//Rd=Rn*Rm
UDIV Rd,Rn.Rm;//Rd=Rn/Rm
功能
用于算术四则运算
有ADD(按位与)、ORR(按位或) 、BIC(位段清零)、 ORN(按位或反码)、 EOR(按位异或)指令
AND Rd,Rn,Rm;//Rd=Rn&Rm
OCC Rd,Rn,Rm;//Rd=Rn|Rm
BIC Rd,Rn,Rm;//Rd=Rn&~Rm
ORN Rd,Rn,Rm;//Rd=Rn|~Rm
EOR Rd,Rn,Rm;//Rd=Rn^Rm
功能
逻辑运算
B Lable //跳转到Lable对应的地址
BX reg // 跳转到由寄存器reg给出的地址
BL Lable //跳转到Lable对应的地址,并将跳转前的下条指令地址保存在链接寄存器中LR
BLX reg //跳转到由寄存器reg给出的地址,并将跳转前的下条指令地址保存在链接寄存器中LR
ARM Cortex-M3支持4GB的寻址长度
只有一个的单一固定
的存储器映射
。
许多情况下,某种工作模式或者状态只需要1个二进制位来表示即可,ARM Cortex-M3 将这种位操作对应的存储单元集中
起来,构成了位带。
在程序中,可以个、访问位带别名区或者直接访问位带区来达到访存信息的目的。
位带区
:SRAM-0x20000000~0x200FFFFFF
和片内外设- 0x40000000~0x400FFFFF
位带别名区
:SRAM-0x22000000~0x23FFFFFF
和片内外设-0x42000000~0x43FFFFFF
映射公式
根据位带中的位计算其在位带别名区的字的地址
位带别名区中相应字的字节偏移量=【(所在字节在位带区中的地址-位带区的首地址)*8+位在该字节中的编号】*4
对位带区进行运算,求字节偏移量
片内外设
简化公式 外设位带别名区地址 = 0x4200 0000 + (A-0x40000000)X8X4+nX4
A是外设位带区某个比特 ,
n是位序号,范围是0~7
SRAM
简化公式 SRAM位带别名区地址 = 0x2200 0000 + (A-0x20000000)X8X4+nX4
A是外设位带区某个比特 ,
n是位序号,范围是0~7
位带区的首地址是0x20000000
根据别名区的字的地址计算位带中的位的位置
需要计算出所在字节的地址和位在该字节的编号
位编号=(字的地址-位带别名区首地址)/4
首地址为0x42000000
字节偏移量 =取整(位编号/8)
位在字节中的序号 字节内序号=位编号-字节偏移量*8
字节绝对地址=字节偏移量+位带首地址
直接访问别名区
向位带别名区写入一个字与对位带区对应的位所在的字执行【读-修改-写】的操作具有相同的作用
写入别名区的字的第0位决定了写入位带区的目标位的值,提高效率
直接访问位带区
能使用常规的读和写操作对该区域进行访问
当正常的程序执行流程发生暂时的停止时,称为异常。
处理异常之前,当前处理器的状态必须保留。
前者称为内部异常,后者称为外部中断。
对于内部异常
,在指令执行和访问存储器时产生,是可以预知的,对于ARM Cortex-M3内核来说是同步
的。
对于外部中断
,相应事件的发生是不可预知的,对于内核来说是异步
的。
异常的优先级数值越小
,则优先级越高
。
占先优先级
和次优先级
定期产生异常请求
,周期性的异常请求可以作为系统的时间基准。STM32支持多种内部和外部时钟源,任何一个都可以独立开启或者关闭,以优化芯片的能耗
HSE(高速外部时钟)
和HSI(高速内部时钟)
可以作为PLL(锁相环时钟)
的输入
,形成PLL时钟源
的输入。
每一个外设模块在这些寄存器中有相应的时钟使能位
,当该位为1
时,对应的时钟开启
且相应的外设开始工作
,当该位为0
时,对应的时钟关闭
从而相应的外设停止工作
。
后续整理
STM32 的通用输入/输出
(GPIO
)端口可以驱动LED
、产生PWD
、驱动蜂鸣器
等。
STM32F103VBT6总共有5组输入/输出(GPIO)端口,分别是GPIOA、GPIOB……GPIOE,每组IO口有16个IO,一共有16*5=80个IO端口。
每个端口可通过的最大电流是25mA,建议单个端口最好不要超过10mA。
特点
每个IO口有7个相关寄存器来控制
高2位为CNF
低2位为MODE
只读寄存器
,对应16个IO
(一组IO口)16
位形式读出某个位的状态
就行可读写
输出状态
或1置1,与0置0
AHB1ENR |= 1<<2;
1<<2 应该读作1向左移动2位,即AHB1ENR寄存器的第2位置1。
MODER &= ~(3<<(11*2));
32位
的每一位都映射为一个地址
,对寄存器的某一位的读-修改-写操作可以简化为把字
直接写入位带别名区对应地址
CM3内核支持256个中断,其中包含16个内核中断
和240个外部中断
STM32有84个中断,其中包括16个内核中断
和68个可屏蔽中断
键盘扫描方式有交叉扫描
和直接扫描
中断分组设置表
按位顺序
进行传输,将传输的数据的每个字符一位一位的传输通用异步收发传输器
(UART)是目前广泛使用的一种通用串行数据通信接口数据总线
向UART的控制寄存器写入控制字
,对UART进行初始化
。发送器
从处理器接收
并行数据,然后通过移位寄存器
把数据以串行异步
方式发出。接收器
可以从串行通信链路
接收串行数据,用移位寄存器
转换成8位并行数据
,送往接收寄存器
,等待处理器读取
。读取UART状态寄存器
的信息获得当前UART的状态
并由此产生相应的控制逻辑
。模数转换器(ADC)是将连续变化的模拟信号
转换为离散的数字信号
的器件。
通常的模数转换器
是把经过与标准量比较处理后
的模拟量
转换成以二进制数值
表示的离散信号的
转换器。故任何一个模数转换器都需要一个参考模拟量
作为转换的标准,比较常见的参考标准为最大的可转换信号大小
。而输出的数字量则表示输入信号相对于参考信号的大小。
看门狗(WDT)是嵌入式系统中的一个重要组成部分,实际上是一个计数器
。
倒计数
CPU发指令
给看门狗让其复位
重新
开始倒计数
倒数到0
就认为程序没有正常工作
,强制复位系统
独立的保护功能
,当系统出现故障时,在可控的时钟周期
内,看门狗将系统复位
或者将系统从休眠中唤醒
内部RC时钟
,并不是准确的40kHZ
只能说这份卷子我圧对了部分题,但是选择题可以说考的比较偏,比如哪些是ACD器件,哈佛结构和冯诺依曼结构的区别,其它还好,只是有点可惜,自己着重看的它没咋考。
简答题难度较低,都大差不差的答出来了。可是程序题,有一部分没压对,其实还好。也是对自己基础的一个警醒。
论述题格局打开,构想了一个集Aiot和5G技术的沉浸娱乐型无人驾驶汽车。集无人驾驶、情绪感知、虚拟沉浸为一体的智能车。
如果能够到达贾维斯时代,那该多好呀。