嵌入式软件时序(2)—— 微处理器结构与代码执行

下图以双核处理器为例介绍了微处理器的结构,即一个有两个内核的微处理器。图中显示了两个计算内核、各种存储器、外围单元和两条不同的总线。并非所有的处理器都遵循这种结构。这里的重点是对一个一般概念的定义,以帮助我们理解。还应注意的是,"计算内核 "一词通常被简单地简化为 "核"或CPU(中央处理单元)。

 

双核处理器的框图

 

· CISC vs. RISC

CISC是复杂指令集计算机(Complex Instruction Set Computer)的缩写,描述的是复杂机器指令提供相对较高功能的处理器。

为了实现这样的CPU,需要一个相应的复杂的、因此是昂贵的硬件。此外,CISC有一个特点,即不同指令需要的执行时间不同。

RISC是指精简指令集计算机(Reduced Instruction Set Computer)。这种处理器的机器指令很简单,需要很少的晶体管,而且通常指令的执行时间相同。

 

· 寄存器(Register)

每个处理器在其执行单元中都有一组特殊的存储单元,名为寄存器。一些常用的寄存器在下面有更详细的描述,详述如下。

程序计数器(Program Counter

程序计数器(PC)通常也被称为 "指令指针"(IP)。程序存储器中的每条指令在存储器中都有一个特定的地址。PC包含当前正在处理的指令的地址。

数据寄存器(Data Register

数据寄存器用于逻辑运算、计算,以及对存储器进行读写操作。

累加器(Accumulator

尤其是RISC处理器有一个特殊的数据寄存器,即累加器。累加器用于大多数逻辑和算术操作。

地址寄存器(Address Register

地址寄存器被用来从内存中读取数据,将数据写入内存,执行间接跳转,或间接调用函数。并非所有的处理器都区分了地址寄存器和数据寄存器。

状态寄存器(Status Register

状态寄存器也可以被称为 "程序状态字"(PSW)、"条件代码寄存器"(CCR)或 "标志寄存器"。它是一组数据位的集合,每位表示一个特定的状态。每位的作用就像一个标志,通常被缩写为一个或两个字母。它们所代表的状态取决于所使用的处理器,以下标志在大多数架构上是常见的。

IE(中断使能标志)指示中断是全局使能的 (IE = 1)或全局禁止 (IE = 0)。要使能中断,必须满足进一步的要求。

IP(中断挂起标志)指示中断是否被挂起。IP=1表示中断被挂起,IP=0表示中断未被挂起。

Z0标志)指示最近执行的逻辑或算数指令的结果是否为0。Z=1表示结果为0,Z=0表示结果不为0。

C(进位标志)用于标记溢出或算术运算以及逻辑运算的进位。例如,如果两个数字0xFF和0xFF在一个8位处理器上相加,进位标志代表第9位。结果0x1FE的前导 "1",即MSB在进位标志中,而其余8位0xFE在结果寄存器中。当用进位加法时,进位标志就像前一个加法的进位一样被使用。如果进位标志被置位,两个数字3和4相加,结果是8。

· 当前CPU优先级

这个值在某些处理器上是一个单独的寄存器,而在其他处理器上则是状态寄存器的一部分。当前执行的代码的优先级决定了中断是否被接受。只有当中断的优先级高于当前执行的代码时,当前执行的代码才会被中断。这也要求中断被启用(IE=1)。

· 堆栈指针(Stack Pointer

堆栈指针包含一个地址,标志着到目前为止使用的堆栈的当前范围。

 

代码是如何执行?

前一期解释了可执行的机器代码是如何产生的,这种代码是机器指令的集合。微处理器的计算内核一直在处理机器指令。这些指令按顺序从程序存储器(或代码存储器)加载到执行单元,在那里被解码,然后执行。程序计数器(PC)已经被提及,它可以被认为是指向程序存储器中的当前指令。只要没有跳转指令或调用函数的指令,一旦完成指令的处理,PC就会增加一个内存位置,指向下一条要执行的指令地址。因此,PC指向下一条命令,而下一条命令又被加载到执行单元,然后被解码和执行。程序存储器主要是机器命令的序列。在这一点上,应该提到,没有任何跳转或调用的一系列机器命令被称为“基本块”。更准确地说,基本块是一系列机器指令,其执行总是从第一条指令开始,然后按顺序执行其所有指令,并以执行最后一条指令结束。处理器不会在第一条或最后一条指令之外的任何其他点跳入或跳出基本块。基本块在静态代码分析中起着重要的作用,所以我们将在后面回到这个话题。

处理器提供的指令在处理器的指令集参考手册中有所描述。对一个处理器的指令集的了解对于在代码层面上优化软件是至关重要的。我们将以8位Microchip AVR处理器的加法指令为例,说明指令集是如何被记录、编码和处理的。

Microchip AVR处理器有32个数据/地址寄存器。它们作为数据寄存器或地址寄存器的作用取决于指令。下图是Microchip AVR ATmega处理器的指令集参考手册的部分截取部分,即描述带进位标志的加法指令的部分。在文字和操作形式的描述(Rd ← Rd + Rr + C)之后是语法的定义。这是一个与汇编代码中的符号完全相同的命令。这样的 "汇编代码命令"也被称为助记符。语法下面的表格显示了命令的操作码,也就是内存中代表该命令的值。其中,高六位是固定的(二进制000111),代表带进位加法,其余的十个位定义了哪些寄存器要被加在一起。标有 "d "的位是针对寄存器Rd的,而标有 "r "的位是针对寄存器Rr的。例如,如果寄存器R3和R22要相加,并且结果要存储在R3中,操作码看起来像表 2.1中所示。每当在汇编代码中发现adc r3,r22时,在程序内存的相应位置会出现0x1D63。

摘自AVR ATmega处理器的指令集参考资料

 

AVR“带进位加法”指令的操作编码

以上示例代码中显示的用于解释二进制机器码的注释已被证明对编程非常有用。每当信息以二进制编码并需要解释时,这种类型的注释是非常有用的。位的位置由两行注释表示:上面一行是表示第10位的位置,下面一行是按位的位置序号。可以帮助读者快速定位到指令的第几位。现在可以简单地从上到下读取位的位置。例如,15是指最左边的MSB。此外,建议用空格将四位一组(一个nibble)分开,因为每个半字节(4位)也可以用一个十六进制数字表示。

在上图中的操作码的描述下,有关于状态寄存器(在这个处理器中称为 "SREG")的哪些标志被修改以及如何修改的确切说明。接下来是一个使用普通加法指令“add”,然后是带进位加法“adc”的例子。这两条指令显示了在8位处理器上实现16位加法的过程。指令的描述以操作码在程序存储器中需要两个字节并在一个时钟周期内执行结束。

<本文首发于零束开发者论坛>

作者:SoftAuto
文章来源:上汽零束SOA开发者论坛 
原文链接:
https://bbs.z-onesoft.com/omp/community/front/api/page/mainTz?articleId=7730
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值