主要记录一些硬件架构方面的知识和底层介绍并用形象的比喻进行理解;另外对寄存器和位操作使用困惑的解释;裸机模块的介绍。
目的要求:熟悉某种(S5PV210)开发板的硬件启动流程,能做什么产品,有什么没研究过的,大公司需要的,嵌入式开发:通过手册明确做什么功能(哪部分硬件要被设置),根据IO口快速找到对应寄存器进行设置使用
开发板通用开发模型与流程
1.芯片手册看接口(了解大体结构)
2.结合需求使用相关模块(找到对应接口并赋值)
3.使用的注意事项和后期维护(工程级)
首先提两个重要的学习方法:1.先自己设计一个认为合理的CPU结构(考虑性能 效率 容量);2.最好能找到3D演示效果的CPU结构图(文档-TI 烂,瑞星 ON 还好,(瑞芯微的RK3368),三星 旧风格)
ARM的体系结构与指令(周期)
8051指令各有1.2.4字节长度不等的指令
指令周期:震荡 机器 时间
S5PV210启动过程
1.当上电/复位时,从0X0地址取指令执行.0x0地下被映射到IROM(64K),IROM已经samsung固化了一段初始化软硬件环境的程序代码.
2.BL0从启动设备(flash/SD)中拷贝 BL1代码到iRAM(BL1代码最大是16K),BL1现从启动设备拷贝BL2代码到IRAM(96K-16k)
3.BL2先初始化外接原DRAM(内存)(512M),BL2从启动设备里面把OS拷贝到DRAM,再跳到OS的开始地址那里开始运行.
4.OS跑到后面,就会把根文件系统挂起来(根文件系统文件存在启动设备里面的)
流水线
三级:中断处理,线程保护,保存执行级别的内容(实质保存计数器)
寄存器
方法:用图加以描述,大脑有一个清晰的软件流程,厂商定义好的->理解为什么这样定义(如何:ARM生产厂商是如何让某位设置某个数就能产生某种功能的)是中央处理器组成之一,同速,比(L1 L2 DDR2)快
①通过设置相对应寄存器来控制开发板相关功能
②寄存器(正常工作模式 掉电模式)
特殊功能寄存器[控制引脚,其他为通用] (通过配置这些寄存器的时候能够实现对硬件的控制)
GPA0DRV电流输出大小能力(区别高级和低级平台)
CON配置引脚功能 DAT设置引脚电平/读取 PUD配置引脚是否使用上下拉电阻
③不同的功能组的操作步骤说明(参考源代码 芯片手册)
GPIO口(可设置第二功能)multi-functional port
④GPJ2CON DAT(LED使用到):看数据手册的描述(功能需要,自己总结) 组 [芯片所有源代码参考 看芯片手册(猜测)]
位操作
定义:直接对位进行操作
作用:置0初始化 置1取值 左移对第几位赋值
取反与或:不能直接写等号怕影响其他比特位(精准)
例:rGPJ2CON &=~0xF;//不能直接位或:因为不知道寄存器是否被使用过
快速运算2的n次方:左乘右除,例:*256->左移8位
前提:参与|运算的两个二进制位有一个为 1 时,结果就为 1
总结:按位与运算通常用来对某些位清 0,或者保留某些位
按位或运算可以用来将某些位置 1,或者保留某些位。
注意:区分16进制还是2进制
学习思路:进制转换的几种方法(0xF) 快速取值
http://c.biancheng.net/cpp/html/101.html
汇编与反汇编(dis文件)
生成反汇编:arm-linux-objdump -D start.elf>start.dis
反汇编查看delay作用 点亮LED
http://www.cnblogs.com/klcf0220/archive/2013/06/02/3113783.html
目标:年薪50万 PLC 大小写不敏感 弄个模板 收集一些案例
基本指令使用(写法:先实现C代码 )
小霸王游戏是用什么语言开发的?->C和汇编语言混合编写
0.规范 文件.S
当前汇编是第一个执行 格式必须如下
.text(开头标志)
.global _start
_start:
//添加代码
循环 函数
.end(结尾标志)
执行:
1.立即数寻址:标志性#
subs r0,r0,#1;r0=r0-1,并影响CPSR标志位
mov r0,#0xff000;r0=0xff000
3.寄存器间接寻址 标志性[] --【PPT】ARM的指令库
4.偏移寻址-左右移
5.基址变址寻址:原来地址再次改变地址 !重复之前的动作
6.压栈指令 push {r0,r1,r2} push{r0-r2} 使用场景:有可能使用到这几个寄存器先保护起来到内存当中;//r0-14都可以
出栈指令 从内存当中恢复寄存器 pop{r0-r2}
7.比较指令 CMP CMN TST TEQ 需要背(不需要加s,能够直接影响CPSR标志位) ZXCV是什么?
8.代码优化等级影响延时真实值(推荐二级优化)-编译器会影响同样代码的质量
9.汇编调用C语言 汇编调用汇编 C语言调用汇编 extern 超过4个参数用栈传递(4个及内都是依次用r0-3)-慢 uboot启动内核会调用空函数theKernel
extern关键字用法:https://blog.csdn.net/xingjiarong/article/details/47656339
10.相关笔记
//配置GPJ2_0~GPJ2_3引脚为输出模式
//使用模型:r0储存转换后的值,r1为真实地址值
//r2存储临时更改值
//ldr万能加载-数值 地址和寄存器,mov不能加载数值 0 x 1 2 3
ldr r1,=rGPJ2CON //int *r1 = 0xE0200280
ldr r0,[r1] //r0 = *r1
ldr r2,=0xFFFF
bic r0,r0,r2 //bic低4位清0
ldr r2,=0x1111 //对上面使用过的重新赋值,不会影响
orr r0,r0,r2 //简写:博客园 跑马灯 嵌入式 即刻出发
str r0,[r1] //*r1 = r0
//堆栈大小 中级嵌入式考证 试题 要求:会看和改 UBoot源代码
ARM:.text 代码段 sub减法指令 push压栈
用得比较多的指令:bl调用(带指令的跳转-函数指针也可以) Load加载寄存器值(指令) Store存储指令 STR改写寄存器值 ldr/str bx跳转指令
远程更新管理:不带操作系统的网络下载 flash分区 bootloader(初始化网络模块)-汇编实现
精简指令集依赖库的实现(不要写太多除法-用左右移)
写代码:CPSR是什么 翻译C语言来写汇编
汇编代码:标志位
反汇编:可获取程序执行地址,看到指令和寄存器,不同工作模式(类似Linux的权限)
*ARM一上电默认是管理模式(方便设置各种模式堆和栈)
重要:ARM工作流程(1.上电设置DDR2 *.外部中断模式(识别然后跳转到对应的堆和栈地址[烧错代码等,不同模式对应不同堆栈地址]))
0.设置类模式
管理(最高权限)设置各种模式堆和栈
1.正常工作类模式(用户和系统模式,同一级别)
2.异常类模式
未定义(当前指令未定义,例:单片机代码烧到ARM);
中止(取指令或数据出错);
普通(外部)中断IRQ(定时器 串口 SPI 外部引脚中断等)[ARM自动切换到该模式];快速中断FIQ()[原理:压栈数少]
http://www.eepw.com.cn/article/201611/318203.htm
注意:以下不能任意赋值,代码自动计算(不需要操作)
R13
R14子程序链接寄存器
R15->PC值记录当前程序位置
CPSR当前程序状态寄存器
SPSR
*现场保护->追踪指令
跳转指令
中断与现场保护恢复
软中断:内核机制触发事件引起 硬中断由外设引起
视频-教师机(16:10左右具体过程描述) 5.26 14:23
何为中断 http://www.21ic.com/jichuzhishi/mcu/interrupt/2013-02-28/159436.html
学习问题:电子入门读物推荐-对中断,定时器这些由来不清楚
掌握移位操作(可记常用场景的设置,例:标志位写1清0) 与单片机区别
外部中断引脚变为第二功能引脚 触发方式 中断处理函数 使能开关
分类数量与优先级
自动跳转(由硬件实现)
IRQ中断处理相关内容
1.现场保护(普通中断r0-12,14,cpsr)[新一代硬件可自动完成]
2.判断中断源:检查当前是哪个硬件触发中断
3.跳转到该硬件中断服务函数执行 (除了这里其他都是汇编)
4.现场恢复(r0-12,pc,cpsr...原来地方)
总中断打开(7设置为0值)
现场恢复:0-12 14恢复 cpsr从spsr恢复
保护:0-12 14 cpsr从spsr保存
不同VIC(2用到音频中断)用到不同的中断
VIC0->定时器 中断号与寄存器关系
存储类型 大小端模式
大端:tcp socket 低字节放高地址
小端:
GEC-A8没有L3缓存
时钟源
HCLK VCLK-LCD
芯片手册Timing时间参数
异常处理结构 中断向量 视频-教师机(16:30左右具体过程描述)
中断入口地址 自动指向 硬件指定(图上的向量地址)-软件不能修改
上电复位:PC 指向0x00000000地址
ARM启动方式与流程 (1、芯片支持的启动方式2、地址布局3、启动流程)教师机10:50启动流程讲解
启动方式:具体采用哪种取决于OM0、OM1两个引脚的状态
http://blog.csdn.net/a627088424/article/details/9149671
http://blog.csdn.net/ly56086566/article/details/4814310
0.不论是arm的何种处理器,其都是从0x0 0地址处开始执行程序
启动流程图
1.初始化 400M时钟
BootLoader介绍与作用
UBoot源码结构与注释 http://blog.csdn.net/reille/article/details/6554038
1.bootloader的作用是初始化必要的硬件,引导内核启动
*硬件映射(向量中断):
中断
预备知识:看门狗 ADT 定时器等位数指的是计数值位数,区别于CPU的位长;(字长/时长又是什么?)
###1.ADC(模数转换模块)
使用遵循以下步骤:
###2.PWM(32位)
###3.watchdog看门狗
看门狗就是定期的查看芯片内部的情况,一旦发生错误就向芯片发出
重启信号的电路。看门狗命令在程序的中断中拥有最高的优先级;
作用:嵌入式系统受干扰([偶然的]电源波动 电磁干扰 硬件异常)而跑飞/死机造成不能
正常工作用来重启系统(从故障恢复)[提高系统稳定性(单片机没有)];
使用遵循以下步骤:
看门狗使用(与中断有关)注意:
公式:t_watchdog = 1/(PCLK/(Prescaler value+1)/Division_factor) //频率值
与所需时间比对获得WTDAT的值 (Hz = 1/T) 第一分频值自己设定,二(4选1)
打开看门狗(分开处理) 记得喂狗
其它介绍
是一个定时器电路,一般有一个输入,叫喂狗
(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的
时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂
狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果
到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造
成系统复位,所以在使用有看门狗的芯片时要注意清看门狗
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程
中,我们要在定时时间到之前对定时器进行复位。如果出现死循环,或者说PC指针不能
回来,那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等。
单片机32个IO口(51不带看门狗,52可能带) 51单片机(高)电平复位:51单片机是由
reset引脚控制复位的,与高电平相接24个震荡周期后,芯片进入复位状态
相关书籍收集
0.汇编语言:基于x86处理器
1.汇编语言第三版 王爽 汇编书目 http://bbs.csdn.net/topics/330122713
2.计算机组成与嵌入式系统(原书第六版)
Computer Organization and Design, 4th Ed, D. A. Patterson and J. L. Hennessy CSDN
3.国内或豆瓣评分8.0上的书(照建议的读和学,遇到问题逐步解决[论坛 群])
课堂笔记
①指令和数据存放在存储器(内存-"创见"4G)
②按键加上拉电阻:引脚防止悬空(积累电荷会损坏器件) 电流喜欢流向阻值小的地方
(面试)单片机io接口加上拉电阻起一个嵌位灌流的作用,提高驱动同时也限制电流,电阻的选择根据io口的接口电路选择。关于这个你可以看看吴鉴鹰吧里面关于上啦电阻的文章!按键使用上拉电阻起到如上所说得作用,还有一个可以消除按键抖动,加上拉会改变上升下降沿的反应速度!具体的可以参考吴鉴鹰贴吧里面文章
课外知识补充
1.DSP(数字信号处理)一般是给自动化电子等专业的研究生博士研究算法的(机械专业不包括),有专门的浮点运算单元。
2.存储器(指令)指令决定寄存器(数据),(地址)存放在哪?
3.USB很少人懂,CISC/RISC 傅里叶变换 哈夫曼编码 JPEG编解码
4.晶振12M与11.0592MHz区别:12定时器
5.苹果基于ARM框架进行改造的A系列性能了解
6.代码规范-变量放前面(部分编译器不支持放后面)
UBoot要4.4.1编译器才能编译通过
7.如何挑选CPU:架构 主频 二级缓存越大越好,这也是为什么赛扬系列的CPU主频虽然比较高,但是在实际应中却没有奔腾系列要好的原因(二级缓存对于AMD来说就不像英特尔那么重要,因为AMD除了有二级缓存之外还有三级缓存) 工艺(发热和稳定性) 核心数(玩游戏还是首选英特尔的CPU,因为在单核性能上英特尔比AMD要强,不过价格要贵许多)
8.notepad++ 视图可查看函数列表
手册阅读笔记
地址(内存 寄存器):29/2095地址分布图
面试会问到的一些问题
1.看图识结构(选型 知道性能 成本等)
辨别依据:总线的关系
2.8051指令周期(微机)
物理相关
按键消抖 http://www.cnblogs.com/tanr-study/p/4617291.html
好的方案:定时器扫描按键 系统睡眠10毫秒usleep(10*10000)代替延时:挂起
智能手环-单片机(操作系统函数用睡眠函数,不可以用延时,裸机没有睡眠函数->定时器扫描按键) 大学生代码->工程师代码