佳音旗舰总校带你了解嵌入式编程基础

分享到:
更新时间:2015-11-18 14:06:05
 

嵌入式编程基础


    本节将了解一些嵌入式编程基础。 我们将着眼于一般组织类型的大多数微控制器中的说明,以及如何组织这些指令或被忽视的的C语言编程

CPU基本组织


我门是不是要全面的讨论CPU的架构设计呢?不是的,它是一个简要概述,进入刚好足够的细节来使遵循理解的部分。

在最简单的可能的意义中,CPU是执行指令的微控制器,其执行用户的程序的一部分。

数据寄存器


CPU将具有一个或多个寄存器,可以充当算术,逻辑和移位指令的源和目标。 有时,这些寄存器被称为累加器。 如果数据寄存器也可以用于一般的处理功能,就变成了“通用”寄存器,如下所述。

寻址寄存器


该CPU可以有哪些用于保存内存数据存取地址寄存器。 根据CPU的设计,这些寄存器可以是全功能的数据寄存器(同一寄存器可用于数据操作或数据处理),在这种情况下,它们通常被称为“通用”寄存器,或这些寄存器可以被限制和设计只用于保持用于数据存取的地址。

 

堆栈指针

堆栈指针是一个特殊的地址寄存器,它指向的存储器,用于为CPU硬件堆栈的截面。 硬件堆栈是用于通过为子程序调用和返回,硬件和中断调用和返回堆栈。 另外,也可以为用户程序使用相同的堆栈,所指向堆栈指针,保存和恢复的其它数据。 或者,用户程序可以用另一个栈,所指向的另一地址寄存器。 这样的软件栈和硬件堆栈之间的区别是,只有硬件堆栈是由为子程序调用和返回的CPU指令由用于压入和弹出栈数据的指令调用的,由中断机制,并且在许多情况。

程序计数器(又称指令指针)


这是指向当前的(或下一个)要执行的指令的寄存器。 它可能是由特殊​​指令访问,或者它可以是一个标准的地址regiser或者甚至是完全通用寄存器。

基本板载外围组织


    任何板载外设(或场外外设,对于这个问题),将出现在CPU为一系列的配置寄存器中的I / O或内存地址空间。 单个寄存器可以是只读,只写,或读/写。 此外,在寄存器内的各个位,可以使用或不使用的(未定义),和个人使用位可以只读,只写或读/写。 所有这一切都在数据表中为您的设备将予以阐明。 你会花你的嵌入式编程生涯的很大一部分浇在这些数据表,并在其中发现的配置寄存器信息。

数据操作指令



Arithemetic说明

算术指令让CPU加减号码,以及在许多情况下,以乘除号码。 这些数字可以是常量,固定所有的时间在程序运行时,或者它们可以是在数据存储器或寄存器中所保持的变量,修改的值。

ADD

A = B + C

减法

A = BC

对比

公元前

比较两个值的指令实际上是一个减法指令,但在其中仅标记被设置,以被改变没有值。

NEGATE

A = -B

接受一个符号数,并把它转换成该号码的负数。 相当于= 0-B。

逻辑指令

补(NOT)



要么

异或

移位指令

SHIFT左/右

左/右旋转

左/右旋转带进

其他说明

程序流指令

无条件跳转

JUMP

条件分支

EQUAL /不等于

CARRY /无进位

正/负

子程序调用和返回

CALL

RETURN

子程序是代码重用的最基本形式之一。 如果你有一块需要在不同的时间和/或不同的数据运行代码,子程序可以让您隔离代码和代码的任何其他部分运行它(“称之为”),在任何时候。 事实上,一个子程序甚至可以调用自身,但是我们在进入递归,这是不是我们将要讨论。

子程序调用指令的本质在于它是一个跳转(跳转到子程序代码),而是一个跳跃可以记住它是从哪里来的。 只要记住,它从何而来,在子程序可以跳转回哪里来的这么调用代码可以继续的结束地址。 为了更加精确,子程序调用指令是跳转指令从而节省了指令的以下的子程序调用指令的地址,子程序调用指令本身的不地址。 它是下一个指令需要子程序返回之后要执行的。 如果子程序返回子程序调用指令时,程序会发现自己在一个无限循环,称没有结束的子程序。

调用指令需要有一个已知的位置来保存PC值,因此子程序可以返回。 通常这种已知位置可以是两个位置之一。 PC值可以保存在存储器上的栈,其由CPU寄存器指向的,或者它可以直接在寄存器(通常被称为“链接”寄存器)被保存。 栈的优势是,子程序可以调用其他子程序,堆栈只会继续增长,以容纳所有的返回地址。 链接寄存器的优点在于,存储和从寄存器中检索数据比存储和从存储器中检索速度更快。 链接寄存器的缺点,如果你要这么说,就是如果一个子程序要调用其他子程序,它需要显式地保存链接寄存器的内容在一个堆栈。 子程序调用其它子程序通常被称为一个分支的子程序,该子程序是不调用任何其他子程序称为叶子子程序。 调用并返回叶子程序可以更快的链接寄存器,在需要分支子程序手动保存和恢复链接寄存器的代价。 在任何情况下,两种方法执行保存在一个已知的位置PC值,以便它可以被检索和加载回PC在子程序结束的必要的功能。

从子程序返回,如前所述,电脑必须加载与保存时子程序调用的地址。 和如上所述,该地址可以是存储在堆栈,或者它可以是在ALINK寄存器。 许多CPU有一个特殊的指令被称为“回归”指令获取的地址,并坚持其到PC。 某些CPU只需使用一个标准的移动指令,移动存储地址到PC。 但结果是在任何情况下是相同的 - 程序继续执行它停止的位置。

位操作

“臣民”和嵌入​​式编程之间的一个区别是,嵌入式程序通常会做位操作,输入和输出相当数量。 各种传感器,致动器,以及其他输入和输出设备的表示在程序中作为单独的位或位的集合。 不仅如此,但统一通信将有许多配置和状态寄存器,这将要求设置或配置位清零的,和个人的状态位的读取。

在我们的第一示例中的方案,我们将看到LED和开关表示为各个位,和后来的许多其他输入和输出设备将被添加到该列表。 因此,要了解如何操作位,也就是要读取各个位状态,并设置或清除单个位的状态是很重要的。

是什么使位操作非平凡的是,比特不单独存在,但字节(16位字和32位字)中存在。 因此,写作时各个位,以避免相同的字节/字中改变其它位,并读取各个位时,避免相同的字节/字中读取其他位成为必要。 CPU的逻辑指令,在前面的章节中讨论过,是什么让我们做这些事情。

但必须指出的是,一些家庭的uC还包括在受限地址范围指令直接作用于各个位,至少各个位。 这些指令通常用于读,写配置和状态寄存器位,和用于保持位标志在存储器中。 这些指令,而不错的,是不是必需品,标准逻辑指令总是可以做同样的工作。

还应当指出的是,虽然C是擅长操纵比特,它它不如汇编语言。 也就是说,也有一些位操作只能被笨拙完成,如果在所有,在C,可以很容易地在ASM中进行。 其中的操作都属于这一类,将取决于所涉及的特定指令集的统一通信。 一对夫妇一般的例子是,转移或通过任意数目的字节转动数据,并使用进位标志的值,直接作为数据位符号标志或其他条件标记。 正如我所说的,有可能是其他人也,这取决于底层指令集。

当操作位,你将使用一个概念“面具”。 掩码是一个字节或字里面有1秒的感兴趣的位的位置上,和0所有其他位的位置。 有时掩模的极性可以颠倒,以0在感兴趣的位位置(S),和1中的所有其他比特位置。 的一点是,所述掩模用于隔离出来我们希望读/写那些比特,而忽略在字节/字中的所有其他位。

掩模通常用于与AND逻辑指令。 AND屏蔽可以具有1个位在所希望的位位置(0否则),以提取所需的比特,或者它可以具有0的位在所需的位的位置(1秒以其他方式)来清除位的部分,同时留下其他不变。 在后一种情况下,与之后将一个OR设置在掩蔽位位置所需的比特。

 如果(SWITCH_PORT&0b00100000)//检查位5在交换机端口,忽略所有其他
   ...有点高,做一些事情...
其他
   ...有点低,做别的事情......
 输出= OUTPORT;
输出&= 0b11100011;  //更换位4,3和2
输出| = NEW_DATA;  //根据需要在4,3和2 NEW_DATA将具有0中的位7,6,5,1和0,和1
掩模通常用于在与换档指令一起,可切换到不同的位的兴趣(多个),例如一个循环内。 这方面的一个例子是在计数一个字'1'的位数(这出现偶尔在嵌入式程序)。 你可以通过屏蔽掉最低位,递增计数如果它是一个1,和​​不断变化的每一个位依次为LSB的位置要检查做到这一点。 请记住,屏蔽是破坏性的,所以你需要保持数据的另一个完好的副本循环。

 计数= 0;  // 1秒的比特数
对于(I = 8;!I = 0;我 - )
 {
   如果(数据与1)//找到了1位
      计数++ //算什么呢
   数据>> = 1;  //将数据移动到下一个位的位置
 }
或者,而不是将数据移动到一个固定的模板位置,你可以移动在固定数据掩码:

 计数= 0;  // 1秒的比特数
掩模= 1;  //开始与该位
对于(I = 8;!I = 0;我 - )
 {
   如果(数据和面罩)//找到了1位
      计数++ //算什么呢
   掩模<< = 1;  //将面具进入下一个位的位置
 }
另一个例子是,如果你有,例如该指示某种地址或配置值的3 DIP开关,以及这些开关分别位于4位,5和6的输入端口的。 类似的事情发生了很多 - 你必须把你的交换机和其他输入(和输出)的地方,你可以找到可用的GPIO引脚。 在这种情况下,将读取整个输入端口,屏蔽掉位4,5和6,然后4位置偏移所得到的掩蔽值以得到介于0和7的3位值的权利。

 地址= SWITCH_PORT;  //读取所有输入位
地址:= 0b01110000;  //屏蔽掉利息3位
地址>> = 4;  //右对齐感兴趣3位,形成价值0-7


        点击拨打北大青鸟电话  点击拨打北大青鸟电话  点击北大青鸟咨询师交谈

相关信息
没有相关内容
©Copyright2015 - 2016 , All Rights Reserved
版权所有2015-2016 北大青鸟APTECH( 北京佳音旗舰 ) 授权培训中心
地址:北京西城区北礼士路100号( 阜成门地铁旁)