I/O 引脚使得微控制器能读取来自其他设备的按钮和状态信息,同时I/O 引脚也能够输出信号用来打开灯、运行电机和驱动显示设备。
定时器、通信模块和数/模转换模块能使微控制器执行特殊的任务,比如与PC 机进行通信,读取温度信息等。
从微观上说,微控制器是一个集成了成千上万电子开关的设备。正如编程的人目的是为了将复杂的 *** 作简化为逻辑和算术运算来完成任务那样,微控制器的设计人员必须决定使用什么电子设备来完成这些任务,比如,晶体管,FET 和二极管等。大多数的微控制器工作在二进制系统下,比如“1”或“0”,逻辑高或逻辑低,开或关。
Cypress 的微控制器系统称为可编程片上系统(Programmable System-on-Chip, PSoC) ,那是因为在单芯片上包含了CPU 内核、足够的模拟子系统和数字子系统资源。因此,在实现一个系统时,几乎不需要外部的电路。
1.1.1 微控制器的涵义如图1.1 所示,微处理器系统的CPU 通常需要和其他部件相连接,这样才能使其发挥作用。微处理器系统通常会使用到的功能部件包括以下内容。
图1.1 微处理器系统常用功能部件
(1)中央处理单元(CPU)
中央处理单元(Central Processing Unit, CPU )是系统的“大脑”,它知道如何和各种不同空间的存储器交换(读或写)信息。同时,也执行一些逻辑指令,最基本和最通用的有:加、减、逻辑“或”、逻辑“与”、逻辑“异或”、移位、移动和复制。一些处理器可能执行更加复杂的 *** 作,但这些 *** 作都是由最基本的 *** 作组合得到的。
CPU 由一些子系统构成,在这些子系统中最重要的是程序计数器(Program Counter, PC),指令译码器和算术逻辑单元(ArithmeTIc Logic Unit,ALU )部分。PC 指向Flash 存储器指定的地址,然后返回指令和数据。PC 用来确定送到指令译码器内的Flash 中的字段。指令译码器包含译码逻辑,这些逻辑将对从Flash 返回的数进行“翻译”,用来确定程序将执行的指令,这些指令将“告诉”CPU 下一步所做的逻辑 *** 作行为。
CPU 不但能实现运算 *** 作,也能修改程序运行的地址。如果在执行指令的过程中,并不是顺序的执行指令,比如遇到调转指令,那么PC 将加载新的所要运行指令的地址,并且从指向Flash 新的地址位置的地方执行程序。如果指令需要CPU 执行一些运算,那么相关的数将送到ALU 单元中。
此外,CPU 也能根据所接收到的指令对外设进行控制。
(2)高速缓存(Cache)
从位置和访问速度方面来说,高速缓存Cache 最靠近CPU。有时,将Cache 直接集成在同一芯片内。但并不是必须放在同一个硅片上,只是封装在同一个芯片内。
(3)随机访问存储器(RAM)
从CPU 访问速度来说,访问随机访问存储器(Random Access Memory, RAM )比访问高速缓存要慢。需要说明的是,这个词语已经失去了它的原本含义,这是由于现在大部分的存储器都能够以任何顺序进行访问。
(4)硬件驱动
从速度来说,是系统中最慢和最大的存储部分。它用来保存程序,并且是由非易失性的存储介质构成。
1.1.2 微控制器编程语言世界上不管是什么厂商的CPU,不管采用什么样结构的CPU,它们都有下面的共同特点:
都是靠程序计数器(Program Counter, PC )来控制程序的运行,正因为这个原因,它们本质上也是串行执行的;
工作在二进制状态下,也就是通常所说的在PC 的控制下,通过运行二进制组成的机器代码,来控制CPU 内各个功能部件的运行。
对CPU 来说,所谓的“机器语言指令”,就是通过CPU 内的控制逻辑来协调CPU 内各个功能部件,完成所要求的 *** 作。机器语言的运行效率是最高的。
机器语言指令应该由 *** 作码和 *** 作数两部分构成。 *** 作码告诉CPU 所需要执行的 *** 作, *** 作数是执行 *** 作所针对的对象。这些对象包括:立即数,寄存器和存储器等,通过访问这些对象来获得所需要 *** 作的对象。比如:对8051 来说,机器语言指令-7D25,表示该指令要实现数据传输 *** 作,“7D”是 *** 作码,“25”是 *** 作对象,其表示将十六进制数#25 ,送到R5 寄存器中。
但是,正如前面所说的,纯粹意义上的“机器语言”对程序员太难理解了,为什么?这是因为程序员是CPU 的 *** 作者,而不是CPU 的设计者,程序员根本不可能从二进制代码的排列中看出“机器语言”所描述的逻辑 *** 作行为。
为了帮助程序员理解CPU 所执行的 *** 作,通过汇编语言助记符指令来帮助程序员设计指令以控制CPU 的运行。汇编语言助记符指令通过汇编器被翻译成机器语言指令。用汇编助记符描述机器指令的形式为:
[标号:] 助记符 [ *** 作数] [;注释]
标号用来表示一行指令,助记符表示所要执行的逻辑 *** 作行为, *** 作数为逻辑 *** 作行为所 *** 作具体对象,现在用汇编语言来描述上面的机器指令“7D25”:
MOV R5, #25
MOV 表示数据移动 *** 作,R5 表示目的 *** 作数,#25 表示源 *** 作数,这个助记符汇编指令所表示的是,将立即数25 复制到R5 寄存器中。使用助记符来描述CPU 所要进行的 *** 作,比使用机器语言直接描述更加容易理解和记忆。但是,由于汇编语言下面是机器语言,所以对于使用汇编语言编程的程序员来说,他必须很清楚CPU 的指令集,寄存器单元和存储器映射等繁琐的硬件规则。虽然其执行效率基本上和机器语言一样,但是使用汇编语言编程效率很低。因为很多程序员根本不了解CPU 的具体内部结构,所以对他们来说,使用汇编语言编程并不比使用机器指令编程好到哪里去,这也是一件令他们非常痛苦的事情。
值得高兴的是,在今天,厂商开发的软件平台支持使用C、BASIC 等高级语言对硬件进行编程;C 语言是不能直接在CPU 上运行,它必须首先通过编译器(Compiler )转换成机器语言,才能在CPU 上运行。使用高级语言所编写的代码其运行的效率不可能比用汇编语言编程的运行效率高,所以说,如果你想让C 语言所编写的代码和汇编语言编写的代码有一样高的代码执行效率,你只能是绞尽脑汁的对C 代码进行优化,或者使用C 语言和汇编语言混合编程,来满足代码长度和运行时间的设计要求。虽然这一过程也会让程序员耗费很多的精力,但是,值得他们高兴的是,他们再也不用和底层硬件直接打交道了。
为了更清楚地说明C 语言和汇编助记符之间的关系,列出表1.1 如下。
表1.1 C 语言和汇编助记符之间的对应关系
如今,越来越多的厂商提供了硬件的应用程序接口(ApplicaTIon Program Interface,API)函数,这样程序员可以根本不用知道更多的硬件实现细节,只需关心如何编写代码来使硬件工作,这样就大大提高了程序的设计效率。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)