Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830915
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: 嵌入式

2017-01-03 16:13:08

1. 可编程器件的编程原理

电子器件的发展方向:
    模拟器件 -> 数字器件
    ASIC     -> 可编程器件
    
可编程器件的特点:
    CPU在固定频率的时钟控制下节奏运行。
    CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行。
    这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,
    本质上是一串由1和0组成的数字。这就是CPU的汇编指令集
    
整个编程及运行过程:
    程序员用汇编指令编程 --经汇编器汇编成二进制可执行程序文件-->二进制文件被CPU读取进去
    -->CPU内部电路对二进制文件解码-->解码通过则CPU执行指令、完成指令动作。
    
    如果程序员用C语言等高级语言编程,则编译器先将C语言程序编译为汇编程序,再进行上面的后续部分。
    预处理  -- 编译 -- 汇编 -- 链接 -> 可执行文件ELF: Executable and Linkable Format.

2. 指令集对CPU的意义

汇编语言与C等高级语言的差异:
    汇编难写,C好写
    汇编无可移植性,C语言有一定可移植性,Java等更高级语言移植性更强。
    汇编语言效率最高,C语言次之,Java等更高级语言效率更低。
    汇编不适合完成大型复杂的项目,更高级语言更适合完成更大、更复杂的项目。
    
汇编语言的本质:
    汇编的实质是机器指令(机器码)的助记符,是一种低级符号语言。
    [解释:机器码都是01不好记录和编写,所以就有了汇编语言作为机器码的助记符,便于程序员开发。]

    机器指令集是一款CPU的编程特征,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能。
    机器指令集就好象CPU的API接口一样。
    
编程语言的发展过程:
    纯机器码编程
    汇编语言编程
    C语言编程
    C++语言编程
    Java C#等语言编程
    脚本语言编程
    
总结:
    汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征。
    不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU间互相移植。
    使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要用汇编处理。

3. RISC和CISC的区别

CISC:
    complex instruction set computer复杂指令集CPU
    CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、
    工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计。
    [注释:任何的运算,处理等等,都能用最少的指令来完成,这会导致CPU设计复杂。]

RISC:
    Reduced Instruction-Set Computer精简指令集CPU
    RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集中只有很少的指令,
    这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了。

CPU设计方式发展:
    早期简单CPU,指令和功能都很有限
    CISC年代 —— CPU功能扩展依赖于指令集的扩展,实质是CPU内部组合逻辑电路的扩展。
    RISC年代 —— CPU仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用
    基础架构来灵活实现。
    
RISC与CISC指令数对比:
    一般典型CISC CPU指令在300条左右
    ARM CPU常用指令30条左右
    
发展趋势:
    没有纯粹的RISC或CISC,发展方向是RISC与CISC结合,形成一种介于2者之间的CPU类型。

4. 统一编址&独立编址 & 哈佛结构&冯诺依曼结构

什么是IO?什么是内存?
    内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元。
    IO(input and output)是输入输出接口,是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。
    一般的,IO就是指CPU的各种内部或外部外设。

内存的访问方式:
    内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写。
    CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的。
    内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问快,缺点是资源有限,扩展性差。

IO的访问方式:
    IO指的是与CPU连接的各种外设
    CPU访问各种外设有2种方式:
    一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问
内存相同的方式来操作外设,叫IO与内存统一编址方式;
    另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址。

对比:
    由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。
    IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限
    资源。
    IO与内存独立编织方式,优势是不占用CPU地址空间,缺点是CPU设计变复杂了。

程序和数据:
    程序运行时两大核心元素:程序 + 数据
    程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,
    所以程序是只读的。
    数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改变数据的值。
    
冯诺依曼结构与哈佛结构:
    程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
    程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)均采用哈佛
    结构。
优劣对比:
    冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单。
    哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,
    缺点是软件处理复杂一些(需要统一规划链接地址等)

5. 软件编程控制硬件的关键-寄存器

什么是寄存器:
    寄存器属于CPU外设的硬件组成部分
    CPU可以像访问内存一样访问寄存器
    寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”
    正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,
    其实就是编程读写该硬件的寄存器。

寄存器的演示:
    请看S5PV210 datasheet

    编程操作寄存器类似于访问内存
    寄存器中每个bit位都有特定含义,因此编程操作时需要位操作。
    单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率
两类寄存器:
    SoC中有2类寄存器:通用寄存器和SFR
    通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。
    SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控
    这个外设,这就是硬件编程控制的方法。
编程访问寄存器的方法
    ldr r1, =0xE0200280
    str r0, [r1]
    mov r0, #0

    int *p = (int *)0x30008000;
    *p = 16;

6. ARM体系结构要点总结

ARM是RISC架构:
    常用ARM汇编指令只有二三十条
    ARM是低功耗CPU
    ARM的架构非常适合单片机、嵌入式,尤其是物联网领域;而服务器等高性能领域目前主导还是Intel

ARM是统一编址的:
    大部分ARM(M3 M4 M7 M0 ARM9 ARM11 A8 A9等)都是32位架构
    32位ARM CPU支持的内存少于4G,通过CPU地址总线来访问
    SoC中的各种内部外设通过各自的SFR编程访问,这些SFR的访问方式类似于访问普通内存,这叫IO与内存统一编址。

ARM是哈佛结构的:
    常见ARM(除ARM7外)都是哈佛结构的
    哈佛结构保证了ARM CPU运行的稳定性和安全性,因此ARM适用于嵌入式领域
    哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;
    对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多

阅读(846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~