2019年9月21日计算机三级嵌入式考试即要开战!都要加油呀!!
今天这篇文章主要指针对计算机三级嵌入式综合题的解析,对于没有单片机基础的同学来说配置寄存器有些困难,所以今天我就给大家分享一下我的经验,希望这篇文章可以帮助到大家,如有错误欢迎指正!!
首先来分析矩阵键盘:
看下面的分析之前可以先看一下这篇文章:计算机三级嵌入式系统考试之矩阵键盘
以第三套试题为例:按键原理图如下图所示
按键代码如下,空已经填好,接下来就是分析为什么那样填:
#define KEYOUTPUT (*(VOLATILE int8u *)0X56000044)
#define KEYINPUT (*(VOLATILE int8u *)0X56000044)
INT16U ScanKey()
{
INT16U key = 0xFFFF;
INT16U i;
INT8U temp=0xFF, output;
rGPECON = ((rGPECON & 0xFFFFFF00) | 【0x00000055】); //初始化GPE0~GPE3为输出
rGPECON = rGPECON & 【0xFFFF00FF】; //初始化GPE4~GPE7为输入
//判断键盘中是否有键按下
for(i=1; ((i<=8) && (i>0)); 【i<<=1】)
{
output |= 0xFF;
output &= (~i);
KEYOUTPUT = output;
temp = KEYINPUT;
if((temp & 0xF0) != 【0xF0】)//判断列信号是否全部为1
{
key = (~i);
key <<= 8;
key |= ((temp & 0xF0)|0x0F);
return key;
}
}
return 0xFFFF;
}
//key返回判断哪个按键的方法:最高4位和最低四位都是1,
//即 1111 ---- ---- 1111,然后次高字节是行,再次高是列,
//比如第2行第3个按键按下, 对应为 1111 1101 1011 1111 - 0xFDBF
先来看寄存器格式表
GPE0[1:0]代表第0位-第1位控制GPE0的功能,00输入,01输出,10=IISLRCK,11保留。
题意为初始化GPE0~GPE3为输出,由表可知[7:0]为0101 0101,所以转化为十六进制(BCD码 8 4 2 1)就是答案:0x00000055。
同理可得初始化GPE4~GPE7为0xFFFF00FF,有人就会产生疑惑,为什么上面一个空不填0xFFFFFF55,其他位不用不是应该置为11吗?
原因是rGPECON = ((rGPECON & 0xFFFFFF00) | 【0x00000055】); //初始化GPE0~GPE3为输出这条语句中有与操作和或操作,最终结果也是其他位为11。
接下来就是按键扫面了,详细的扫面过程在上面提到的文章里。这里主要分析for循环的几个条件如何填写。
for(i=1; ((i<=8) && (i>0)); 【i<<=1】),由按键的原理图可知一共四行,所以要想扫描一遍需要循环四次,刚开始i为1------->(0001)二进制,“<<”为C语言里面的左移位操作,因此循环过程为0001-->0001 0-->0001 00-->0001 000 循环四次后(二进制转换为十进制)值为8,所以i<=8。再来看一下第九套,里面让填i的初始值for(i=【】; ((i<=128) && (i>0)); 【i<<=1】),给了i的范围,我们可以倒推(进行右移操作),将128转化为十六进制为0x80,在转化为二进制为10000000 ,右移四次10000000-->1000000-->100000-->10000,在转换为十进制为16,即i的初始值。。
接下来继续看怎么确定哪个按键被按下(首先把上面提到的文章看懂)。
我们已知无按键按下返回值为0xFFFF---->(1111 1111 1111 1111) ,当按键原理图如上时,[11:8]代表行,[7:4]代表列,每一位代表一行或一列(按下为0,反之为1),比如“6”按键,2行3列,因此返回的二进制为 (1111 1101 1011 1111),转换为十六进制为0xFDBF,即为答案。前面说了,原理图为上图时是[11:8]代表行,[7:4]代表列,显然还有另一种情况。如下图(第九套):
此时[15:12]代表行,[3:0]代表列,其他同上,比如按键“8”,2行4列,返回值则为(1101 1111 1111 0111),即为0xDFF7。
以上是矩阵按键的所有分析了,如若还有疑问,可以留言或者QQ联系我,QQ:993983320。
接下来分析定时器的配置:
以第二套习题为例,主要还是要能看懂寄存器格式表。
首先看第一个空,要求Timer0预分频系数选择为3,其他无关为均为0,由TCFG0的为功能表可知,[7:0]确定Timer0,Timer1的预分频系数。十进制3转化为十六进制为0x00000003,因此第一个空填0x00000003.其他定时器同理,都是将预分频系数转化为十六进制,控制位一定要看清楚!!!
第二个空要求Timer0分频器值为16,其他无关位均为0,由TCFG1的为功能表可知,[3:0]确定Timer0分频器值。0011=16,因此答案为0x00000003。第三个空要求设置计数常数,由上表的公式可知,我们要先算出 定时器输入时钟频率=264MHz/(3+1)/16=4125000Hz,计数器常数=0.01/(1/4125000)=41250,将41250转换为十六进制为0xA122,即为答案。
最后一个空要求更新TCNTB0,TCMPB0,其他无关为均为0,由上表可知第[1]位控制其要求功能,所以十六进制为0x00000002,即为答案。
配置定时器都是以上的套路。
接下来介绍串口的配置:
以第五套为例,如图。
题意要求配置UART1_Init(),由端口H控制寄存器的格式可知,由[11:8]位控制,初始化端口GPH5,GPH4引脚为串口功能,需要把相应位置为10 10,即答案为(0000 0000 0000 0000 0000 1010 0000 0000)----->0x00000A00。
设置线路控制寄存器,题意要求波特率:115200 数据格式要求:8位数据位,1位停止位,偶校验,主频PCLK。由控制寄存器表可知[1:0]=11=8位,[2]=0=1位停止位,[5:3]=101=偶校验,[6]=0=正常工作模式,[7]=0=保留,即[7:0]=0010 1011,题中给的语句是
rULCON1 = (【】<<3)| (0<<2) | (【】);这条语句意思为rULCON1=某个值左移3位 或上 0左移2位 或上 某个值,显然我们知道最终结果为 0010 1011,谁左移3位 或上 0左移2位 或上 谁 等于它呢。一步步分析,由优先级可知先算小括号里面的,我们用逆向思维,先将0010 1011右移3位得 0010 1 ,0左移2位 0000 00 ,显然0<<2| 某个值 低三位应该为 011,把三部分进行或操作 0010 1 | 0000 00 |011--->0010 1011,正是我们要的最终结果,因此我们可知第一个空为 0010 1--->5,第二个空为011---->3。以上就是如何推导两个空的值。
有时候还会涉及到计算串口每秒钟做多传输得字节,公式为:传输字节=波特率/(8+3)或者 传输字节=波特率/(8+2),奇校验用第一个公式,偶检验用第二个公式。
以上的搞懂操作题应该就不是问题,希望对大家有帮助 。
一下是一些自己总结的知识点:
嵌入式处理器内核的分类
- 按照字长可以分为:8/16/32/64 位结构
- 按照存储可以分为:冯诺依曼和哈佛(程序和数据分开存储)结构
- 按照指令集可以分为:CISC、 RISC结构
- CISC(complex instruction set computer 复杂指令集)
- RISC(reduced instruction set computer 精简指令集)
电源管理模块
- 正常模式
- 慢速模式
- 休眠模式 - 仅断开RAM内核时钟FCLK,CPU处于休眠模式,仍为外围硬件组件提供时钟。
- 掉电模式 - 切断内部电源,除非唤醒逻辑有效,否则内核不产生功耗
- 正常模式下,电源管理模式为内核及RAM芯片内部所有硬件组成提供时钟源,用户可以通过软件控制暂时不用的内置硬件组件处于关闭状态降低功耗。
RAM常考寄存器
- R13 - SP (堆栈指针)
- R14 - LR(链接寄存器)
- R15 - PC(程序计数器)
- xPSR - (CPSR 和 SPSR)状态寄存器
CPSR寄存器
- CPSR(当前程序状态寄存器)在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。
- RAM中表示程序状态的寄存器是CPSR,其中状态位T的作用是在RAM状态与Thumb状态间进行切换,当T = 1时处理器处于的状态是Thumb状态。
- N为符号标志位 - N=1表示运算结果为负,否则运算结果为正
- F为禁止快读中断为 - F=1表示禁止快速中断控制位,否则允许!
- V为溢出标志位,等于1表示溢出
- Z为全0标志,运算结果为0
SPSR寄存器
- 每一种处理器模式下(看下面的其中运行模式)都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。
- 当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。
- 由于用户模式和系统模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。
ARM微处理器的七种运行模式
- 用户模式:user :正常程序执行的模式
- 系统模式 – SYS: 用于运行特权级的操作系统任务
- 快速中断模式 – FIQ :用于高速数据传输和通道处理、高速中断!
- 外部中断模式 – IRQ :用于通常的中断处理
- 管理模式 – SVC :又称特权模式,操作系统使用的一种保护模式
- 终止模式 – ABT :用于虚拟存储及存储保护,处理存储器故障
- 未定义指令模式 – UND :用于支持通过软件方针硬件的协处理器
经典ARM的七种异常
- 复位RESET
- 未定义指令 UND
- 软件中断 SWI
- 指令预取终止 PABT
- 数据访问终止 DABT
- 外部中断请求 IRQ
- 快速中断FIQ
实时操作系统与非实时操作系统
实时系统
- 民航导航系统
- 防空预警系统
- 电力输送控制系统
非实时
- 视频播放系统
- 手机交互式城市交通导航系统
实时操作系统
- RTOS响应中断请求并且完成相应的中断服务子函数的时间非常快!精细衡量这个时间一致性变化的术语是抖动!
- 中断服务子函数也是可以调用函数然后进行事件处理的,中断服务子程序返回的最后一步执行中断返回指令。
RTOS特征(不包括轮转调度)
- 异步IO和中断处理能力
- 任务切换时间和中断延迟时间确定
- 优先级中断和调度
- 抢占式调度
- 内存锁定
- 连续文件
- 同步
RTOS的实时性能主要由三个指标衡量
- 响应时间(包括中断延迟时间和任务切换时间)(任务切换时间又包括人物抢占时间)
- 吞吐量
- 生存时间
- 响应时间有两个指标 - 中断延迟时间和任务切换时间
- 实时系统对时间约束要求的严格性,使可预测性成为实时系统的一项重要性能要求,它是指RTOS能够对外部事件的响应时间和实时任务的执行时间进行判断,以确定被时间触发的实时任务能否在规定的时间内完成。
- 一般按照相应时间能将实时系统分为三类:强实时系统,其相应时间一般在ms级或us级;普通实时操作系统一般在s级,弱实时系统一般在数十s级。
- 任务时限有两种
- 截止时间:任务开始执行时间到任务必须完成的时间间隔。
- 任务执行预设:又叫任务最快完成时间,这是在无中断响应情况下的任务最快执行时间。
指令的条件码总结
- EQ - 相等
- NE - 不等
- MI - minus负数
- PL - plus正数或0
- vs - overflow set溢出
- vc - overflow clear未溢出
- GT - greater than带符号数大于
- GE - greater and equal带符号数大于或等于
- LT - lower than带符号数小于
- LE - lower equal带符号数小于或等于
- HI - high无符号数大于
- CS - carry same无符号数大于或等于
- CC - carry clear无符号数小于
- LS - low and same无符号数小于或等于
常考指令
- LDR 字数据加载指令(存储器到寄存器的数据传送指令)
- LDRB 字节数据加载指令
- LDRH 半字数据加载指令
- STR 字数据存储指令
- STRB 字节数据存储指令
- STRH 半字数据存储指令
- STR R0, [R1] - 将R0中一个字的数据,存入以R1的值为地址的存储器中。
- LDR R0, [R1] - 以R1的值为地址的存储器中的字数据(为32位)读入寄存器R0
- LDRH R0, [R1] -以R1的值为地址的存储器中的半字数据(为16位)读入寄存器R0
- LDRB R0, [R1] -以R1的值为地址的存储器的字节数据(为8位)读入寄存器R0
- ADC R1, R2, R3 表示 R1 = R2+R3+C(C表示进位)(ADD表示加法)(ADC表示带进位加法)
汉字编码
- GB2312 – 两字节编码(每个字节最高位默认为1),包含常用的中国汉字和图形符号。
- GB18030 与国际Unicode相兼容。单字节对应ASCII,双字节对应汉字(GB2312在这完全适用,但是比它范围广),其余四字节对应其他字符。
Unicode
- UTF-8 – 单字节可变长编码。
- UTF-16 – 双字节可变长编码。