基础概念


1)CPU核心

  • SIMD: SIMD全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。
  • NEON : Neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。
  • Cache: Cache存储器:电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(Dynamic Random Access Memory)之间,规模较小,但速度很高的存储器,通常由SRAM(Static Random Access Memory 静态存储器)组成。它是位于CPU与内存间的一种容量较小但速度很高的存储器。
  • MMU:存储管理单元

2) 系统外围

  • RTC : 实时时钟(Real-Time Clock)是PC主板上的晶振及相关电路组成的时钟电路的生成脉冲,RTC经过8254电路的变频产生一个频率较低一点的OS(系统)时钟TSC,系统时钟每一个cpu周期加一,每次系统时钟在系统初起时通过RTC初始化。
  • PLL :PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。
  • PWM Timer :脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
  • Watch dog Timer : watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定时间不喂狗(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环或者说程序跑飞。
  • DMA :DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。
  • Keypad :输入按钮
  • ADC:Analog-to-Digital Converter的缩写,指模数转换器。即将模拟信号转变为数字信号。

3) 连接

  • USB Host/OTG

USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一。
硬件上,它是用插头连接。一边是公头(plug),一边是母头(receptacle)。例如,PC上的插座就是母头,USB设备使用公头与PC连接。
目前USB硬件接口分三种,普通PC上使用的叫Type;原来诺基亚功能机时代的接口为Mini USB;目前Android手机使用的Micro USB。

Host
USB是由Host端控制整个总线的数据传输的。单个USB总线上,只能有一个Host。
OTG
On The Go,这是在USB2.0引入的一种mode,提出了一个新的概念叫主机协商协议(Host Negotiation Protocol),允许两个设备间商量谁去当Host。

  • UART:UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。并行入,串行出
  • IIC:
    I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
    主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。
  • SPI:SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。
    SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。
  • Modem IF:通信连接
  • GPIO:GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0-P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
  • Audio IF:音频连接
  • Storage IF

4) 多媒体

  • Camera IF/MIPI CSI
  • Coder/Decoder
  • 2D/3D Graphics
  • TV aut/HDMI
  • JPEG Codec
  • LCD Controller

5) 存储接口

  • SRAM:静态RAM(SRAM)SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。

缓冲。

  • OneNand:拥有norflash 和nandflash两者的特点
  • SLC/MLC Nand 两种nandflash,单层单元flash和多层单元flash.
  • DDR:动态内存(DRAM)的一种,可以在一个时钟读写两次数据,这样就使得数据传输速度加倍了。这是目前电脑中用得最多的内存

6) 电源管理

  • CLock Gating:时钟门
  • Power Gating:电源门
  • Frequency Scaling:电源频率

存储器层级关系

MMU

总结MMU三大作用:

  • 1.虚拟地址到物理地址的转换
  • 2.Cache缓存控制
  • 3.内存访问权限保护

Linux内核使用了三级页表PGD、PMD和PTE,对于许多体系结构而言,PMD这一级只有一个入口。
CPU访问内存时的硬件操作顺序

CPU访问内存时的硬件操作顺序,各步骤在图中有对应的标号:

1 CPU内核(图中的ARM)发出VA请求读数据,TLB(translation lookaside buffer)接收到该地址,那为什么是TLB先接收到该地址呢?因为TLB是MMU中的一块高速缓存(也是一种cache,是CPU内核和物理内存之间的cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA的页表项就不必做translation table walk了,否则就去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数。

2 页表项中不仅保存着物理页面的基地址,还保存着权限和是否允许cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU内核。然后检查是否允许cache,如果允许cache就启动cache和CPU内核互操作。

3 如果不允许cache,那直接发出PA从物理内存中读取数据到CPU内核。

4 如果允许cache,则以VA为索引到cache中查找是否缓存了要读取的数据,如果cache中已经缓存了该数据(称为cache hit)则直接返回给CPU内核,如果cache中没有缓存该数据(称为cache miss),则发出PA从物理内存中读取数据并缓存到cache中,同时返回给CPU内核。但是cache并不是只去CPU内核所需要的数据,而是把相邻的数据都去上来缓存,这称为一个cache line。ARM920T的cache line是32个字节,例如CPU内核要读取地址0x300001340x3000137的4个字节数据,cache会把地址0x300001200x3000137(对齐到32字节地址边界)的32字节都取上来缓存。

址映射过程详述

关于页表:ARMv6的MMU进行地址映射时涉及到两种页表,一级页表(first level page table)和二级页表(coarse page table)。

关于映射方式:映射方式有两种,段映射页映射。段映射只用到一级页表,页映射用到一级页表和二级页表。

关于映射粒度:段映射的映射粒度有两种,1M section和16M supersection;页映射的映射粒度也有两种,4K small page和64K large page。

硬件在做地址转换时,如何知道当前是什么映射方式以及映射粒度是多少呢?

这些信息可以从页表的入口描述符中获得。

一级页表的入口描述符(first-level descriptor)格式如下:

第[1:0]位决定映射方式:

[1:0]=10b时,是段映射,此时只需作一级映射,描述符的最高12或8位存放的是段基址;

[1:0]=01b时,是页映射,此时虚拟地址转换为物理地址需要经历二级映射,描述符的最高22位存放的是二级页表的物理地址;

第[18]位决定段映射的粒度:

[18]=0b时,映射粒度为1M,描述符的最高12位存放段基址;

[18]=1b时,映射粒度为16M,描述符的最高8位存放段基址;

1.当映射方式为页映射时,我们用到二级页表,二级页表的入口描述符(second-level descriptor)格式如下:

第[1:0]位决定页映射的映射粒度:

[1:0]=10b或11b时,映射粒度为4KB,描述符的最高20位为页基址;

[1:0]=01b时,映射粒度为64KB,描述符的最高16位为页基址;

下面分4种情况对地址映射过程做详细描述:

1)段映射,映射粒度为1M

2)段映射,映射粒度为16M

3)页映射,映射粒度为4K

4)页映射,映射粒度为64K

2.1段映射,映射粒度为1M

当映射方式为段映射,且映射粒度为1M时,映射图如下:

虚拟地址到物理地址的映射过程如下:

虚拟地址的[31:20]位存放一级页表的入口index,[19:0]位存放段偏移;

从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;

一级页表基址+ VA[31:20] = 该虚拟地址对应的页表描述符的入口地址;

页表描述符的[31:20]位为该虚拟地址对应的物理段基址;

物理段基址+ VA[19:0]段偏移= 物理地址

由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个入口映射 2^20 大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^20,即4G。
2.2 当映射方式为段映射,且映射粒度为16M时,映射图如下:

虚拟地址到物理地址的映射过程如下:

虚拟地址的[31:24]位存放一级页表的入口index,[23:0]位存放段偏移;

从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;

一级页表基址+ VA[31:24] = 该虚拟地址对应的页表描述符的入口地址;

页表描述符的[31:24]位为该虚拟地址对应的物理段基址;

物理段基址+ VA[23:0]段偏移= 物理地址

由映射图可知,一个虚拟地址可以索引28个一级页表入口,每个入口映射224大小的内存,故虚拟地址可以映射的最大物理内存为:2^8 * 2^24,即4G。
2.3 页映射,映射粒度为4K

当映射方式为页映射,且映射粒度为4K时,映射图如下:

虚拟地址到物理地址的映射过程如下:

虚拟地址的[31:20]位存放一级页表的入口index,[19:12]位存放二级页表的入口index,[11:0]位存放页偏移;

从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;

一级页表基址+ VA[31:20] = 一级页表描述符的入口地址;

一级页表描述符的[31:10]位存放二级页表的基址;

二级页表基址+ VA[19:12] = 二级页表描述符的入口地址;

二级页表描述符的[31:12]位存放该虚拟地址在内存中的物理页基址;

物理页基址+ VA[11:0]页偏移= 物理地址

由映射图可知,一个虚拟地址可以索引212个一级页表入口,每个一级页表入口指向的二级页表最大可以有28个二级页表入口,每个二级页表入口映射212大小的内存,故虚拟地址可以映射的最大物理内存为:212 * 2^8 * 2^12 ,即4G。

2.4 页映射,映射粒度为64K

当映射方式为页映射,且映射粒度为64K时,映射图如下:

虚拟地址到物理地址的映射过程如下:

虚拟地址的[31:20]位存放一级页表的入口index,[19:16]位存放二级页表的入口index,[15:0]位存放页偏移;

从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;

一级页表基址+ VA[31:20] = 一级页表描述符的入口地址;

一级页表描述符的[31:10]位存放二级页表的基址;

二级页表基址+ VA[19:16] = 二级页表描述符的入口地址;

二级页表描述符的[31:16]位存放该虚拟地址在内存中的物理页基址;

物理页基址+ VA[15:0]页偏移= 物理地址

由映射图可知,一个虚拟地址可以索引212个一级页表入口,每个一级页表入口指向的二级页表最大可以有24个二级页表入口,每个二级页表入口映射216大小的内存,故虚拟地址可以映射的最大物理内存为:212 * 2^4 * 2^16 ,即4G。

2.5 地址映射总图

《ARM1176 JZF-S Technical Reference Manual》中有一张对上述四种映射情况的汇总图:

参考博文:https://www.cnblogs.com/yangjiguang/p/7647801.html

ARM异常与中断

ARM体系结构中存在7种异常处理。以下是异常中断的向量表。

异常发生时CPU处理步骤

  1. 保存当前执行位置
  2. 保存当前执行状态
  3. 寻找中断入口,即向量表地址
  4. 执行中断处理模式
  5. 中断返回,继续之前的执行

异常发生时的伪代码:

R14_<exception_mode> = return link;
SPSR_<exception_mode> = CPSR;
CPSR[4:0] = Exception Mode Number;
CPSR[5] = 0;
if <exception_mode> == reset or FIQ thenCPSR[6] = 1    /*屏蔽快速中断FIQ*/CPSR[7] = 1 /*屏蔽外部中断IRQ*/PC = exception vector address

复位异常
当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处程序执行。复位异常中断通常用于系统上电和系统复位情况。

复位异常中断处理程序的主要功能:

  1. 设置异常中断向量表
  2. 初始化数据栈和寄存器
  3. 初始化存储系统,如MMU
  4. 初始化关键的I/O设备
  5. 使能中断
  6. 处理器切换到合适的模式
  7. 初始化C变量,跳转到应用程序执行

复位异常发生时伪指令:

R14_SVC = UNIPREDICTABLE value
SPSP_svc = UNPREDICTABLE value
CPSR[4:0] = ob10011 /*进入特权模式*/
CPSR[5] = 0
CPSR[6] = 1;
CPSR [7] = 1;
if high vectors configured thenPC = 0xffff0000;
else PC = ox00000000;

未定义异常

未定义异常发生时伪指令:

R14_und = address of next instruction after undefined instruction
SPSR_und = CPSR
CPSR[4:0] = 0b11011/*进入特权模式*/
CPSR[5] = 0
CPSR[7] = 1
if high vectors configures thenPC = 0xfffff0004
else PC = 0x0000004

快速中断

快速中断发生时伪指令:

R14_fiq = address of the next instruct to be executed + 4
SPSR_abt =CPSR
CPSR[4:0] = 0b10001 /*进入特权模式*/
CPSR[5] = 0
CPSR[6] =1
CPSR[7] = 1
if high vectors configured then PC = 0xffff0001c
else PC = 0x00000001c

异常优先级

Reset > Data Aort > FIQ > IRQ > prefetch Abort > SWI = Undefined instruction


嵌入式系统开发-麦子学院(11)——ARM Cortex A8 硬件基础(1)相关推荐

  1. 嵌入式系统开发-麦子学院(12)——ARM Cortex A8 硬件基础(2)

    S5PV210启动原理 ARM启动顺序 BL0(IROM)的作用 初始化系统时钟,设置看门狗,初始化栈和堆 加载BL1 BL1的作用 初始化RAM,关闭Cache,设置栈 加载BL2 BL2的作用 初 ...

  2. 嵌入式系统开发-麦子学院(4)——Linux C初级编程2

    上篇文章讲到了Linux C初级编程的C语言基础部分:https://blog.csdn.net/QiHsMing/article/details/84947781 下面接着Linux C初级编程的L ...

  3. arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解

    背景介绍 在日益信息化的社会中,各种各样的嵌入式系统已经全面渗透到日常生活的每一个角落.嵌入式系统的功能越来越复杂,这就使得一个嵌入式系统产品从市场需求立项到方案选择.样机研制.定型量产所需要的开发费 ...

  4. 嵌入式系统开发学习如何起步、如何深入?(转)

    学习有捷径吗?俺认为是有的,正确的道路就是捷径. 就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线. 有时候回首前尘,会谓叹,要是当 ...

  5. 嵌入式系统开发怎样快速度入门

    http://wenda.tianya.cn/wenda/thread?tid=392a249d9d6856c5 实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条 ...

  6. 嵌入式系统开发学习步骤(Linux高级编程学习顺序)

    2019独角兽企业重金招聘Python工程师标准>>> 嵌入式系统开发学习步骤(Linux高级编程学习顺序) 1.Linux 基础 安装Linux操作系统 Linux文件系统 Lin ...

  7. 嵌入式系统开发笔记0_0:目录

    本系列文章将向大家介绍嵌入式系统开发的各方面知识. 本系列文章所介绍的知识和内容,除电路图设计外,其它均采用开源系统,所以你不会在这个系列文章中看到Keil.IAR等软件. 本系列文章涉及C.C++. ...

  8. 面向对象嵌入式系统开发7-嵌入式系统的实现

    面向对象嵌入式系统开发7-嵌入式系统的实现  如果说嵌入式系统的面向对象分析与设计涉及到抽象.思考和经验的话,那么嵌入式系统的实现则涉及更多的实施细节.无论使用咋样前言的技术方法,最终都需要把整个系统 ...

  9. 嵌入式系统开发-学习路线

    嵌入式系统开发 课程链接 随着嵌入式设备的普及,嵌入式应用的需求量也随之增大,本课程将重点培养基于linux系统下的嵌入式应用开发,包括5个阶段,其中课程涵盖了linux系统下的多进程.多线程嵌入式开 ...

  10. 全面认识海思SDK及嵌入式层开发-第1/11季视频课程-朱有鹏-专题视频课程

    全面认识海思SDK及嵌入式层开发-第1/11季视频课程-592人已学习 课程介绍         本课程目标是学习海思SDK的结构,并且学会配置.编译整个SDK并部署到专用开发板上,启动Linux系统 ...

最新文章

  1. Too many open files错误与解决方法
  2. android EditText监听事件及参数详解
  3. android获取string.xml的值(转)
  4. Linux ftp 命令
  5. python3能做什么_你都用 Python 来做什么?
  6. 使用Bootstrap后,关于IE与Chrome显示字体的问题
  7. day03 Python字典dict的增删查改及常用操作
  8. Android-JNI开发系列《九》实战-Bitmap处理实现底片灰度化黑白化暖冷色调等效果
  9. 转载——如果让我完善几年前的一个项目,我会做哪些改进?
  10. 为SAP列表设置新的打印格式
  11. 主成分分析之数学推导
  12. 图解傅里叶变换(时域频域)
  13. golang fmt包格式化verb错误处理
  14. 微信商户平台 扣款测试规则
  15. 让聊天机器人来填平技术鸿沟吧!
  16. 如何俘获一个 IT 男的心,让他成为男友然后变成老公
  17. 卷积在深度学习中的作用(转自http://timdettmers.com/2015/03/26/convolution-deep-learning/)...
  18. 十三、买空卖空、融资融券、配资与杠杆
  19. 【线代】矩阵的秩和线性方程组的解的情况
  20. android 绘画笔迹回放_一种基于可缩放矢量图形的安卓平台笔迹回放方法及装置与流程...

热门文章

  1. linux gz he xz,gz与xz两种压缩格式的对比
  2. win7安装.Net Framework 4,出现错误码(1603,0x80070643)
  3. Carsim安装中遇到的一些坑(invalid license key)
  4. 面试官:淘宝七天自动确认收货,可以怎么实现?
  5. 【python 色情图片识别】python检测色情图片
  6. photoshop之CameraRaw
  7. unity3D professional专业主题——黑色主题设置
  8. GIF是什么格式的文件
  9. “大狼狗加密专家”使用简介
  10. Python selenium —— selenium与自动化测试成神之路