您的位置 首页 五金批发

控制器开发

控制器开发 微控制器??开发团队与编译器开发人员的合作成果是生成的代码效率更高,性能更好。本文介绍的是∑为¤了…

控制器开发

控制器??开发团队与编译器开发人员的合作成果是生成的代码效率更高,性能更好。本文介绍的是∑为¤了使ATMEL AVR微?控制器系列更适合C编译器,开发者在编⊿译器开发∵阶段对微控制器架构和指令集所进行的调整。

本文引用地址:http://www.eepw.co?m.cn/article/17334控制器开发3.htm?

AVR架构的核心是一个可快速访问RI<SC寄存o器文件。该文件由32个8位通用寄存器构成。微控制器可在一个单ml时钟周期内加载该文?件℃中的任意两个寄存器到算术﹣逻辑单元(Arithmetic Logic?al Unit, ALU),完成所要$求的操?作?,将结果写回到任意一个寄存器。ALU支持寄存器间或某一寄存器?与一个常数之间的运算和逻辑功能‰,单寄存器操作也是在ALU中执行的。微控制器使用一个哈佛(Harvard)架构,在该架构?中,程序存储器空间与数据存储器空间是相互隔离的。程序?存储器采用单?级管道访问技术,当一条指令被执行的同时,下一条指令已从程序存储器中被预先提取。由于其算?术和逻辑操作都真正地在单周期内完成,因此AVR微控制器的性能?达到每MHz一个MIPS?。

?图1 AVR 架构

细调微控制器
采用高级语言(High Level Lan″guange, HLL)代替№汇编语言来开发微控制器应用?程序有许多优势,但一直都有一?个重大缺点,即代码量不断增加∈。我们在开发AVR微控制器时考虑了?使用C语言来开发应用,使得我们有可能为器件构建出一个高效C编译器。为了进一步提升这项特性,我们在AVR的架构和指令集未完成前?就开始着手C编译器的开?发。我们先让瑞典 IAR? S?yste⊕ms的编译器专业开发人员对我们的AVR架构和指令集进行评测,最后开发出非常适合运行C编译器生成代码的微控制器。

寻址模式
?为让编译器生成高效的代﹥码,重要?的是?让寻址模式匹配C语言的需要。AVR架?构原来配了两个指针寄存器(P?ointer Register)。这两个指针可用于间接寻址、算后增量(post increm?e∷nt)间接寻?址、算前减量(pre-decrement)间接寻址,以及带位移(displacement)的间∝接寻址,能够很好地支持指针操作。此外,还有一?个用于访问数据存㏄储器中变量的页面直接寻址模式。

指针位移
带位移的间接寻址是一?种非常有用的寻址模式,即使从C编译器的角度亦如此。例如,将指针指向某一结构(struct)的第一个成≮员,就可以访问该结构内位移量所允许的其他任何位置,?无须变更16位指针。带位移的间>接寻址模式也常常用?于§访问软件堆栈上的变量。函数参数和autos常常?放在软件?堆栈上,这样,不用变更指针就可进行读写操作。位移寻址在定位数组成员(㎜addre⌒ssing ?elemen?ts in an array)时也非∮常有用。

尽管位移模¥式?在许?多情况下非常有㎡用,但仍存在一个位移受限的问题。位移原本被限﹢制在16个位置以内,而实际应用往往超出该数量。这样,在位移模式无法访问的位置,就必须?加载一个?新的指针。为?扩展∨位移模式的访问范围,我们不得不改变指令集的其他部分,以获得足够的编码空间。同m时,我们还得μ知,C编译器很难使用页面直接寻址模式。于是£,取消了页面直接寻址模式,使用腾出的空间将位移模式扩展为64个位置,足以满足大多?数间接㎏寻址的要求。原来的页面直接寻﹤址模式变成一个两个字长的非?页面直接寻址模式。

存储器指针?数
AVR微控制器原来配置了两个16位存储器指针。如要采用C编译器,那么∥其中一个指针必须专门用作软件*堆栈,这样,就只剩一个存储器指针。在许多情况下,需要将存储器1从一个区域复制到另一m㈱个区∧域。但由于只有一个指针,需要读1字节㏕,∶?设置指针,确定写入目标位置,写入这字节?,然后再将指针设回数据源位置。如果增加第三个存储器指针(精简功能),完成存储器区域复制就不需要设置指针。如下%例所示,只要?使用算后增量间接3寻址模式就可构建非常高效?的存储器读写循环(假设:将指针Z指向源的第一字节,X指向目标的第一字节):∪

?

LDI ¬R16,?0x60 ′;Loa﹣d byte c℅ount /
?l?oop: LD R17,Z+ ;Load byte,
increment pointer
 ST? X+,R17 ;Store
byte, increment pointer
 SUBI R16,1;Decrement
counter
BRNE loop; Branch
if more bytes
具备指针算后增量(≌post increment)、算前减量(pre-decrement) (+1、-1)操作的可能性对于实现?堆栈也非常有效。这当然◎也可用于软件运=行时间堆栈。

直接寻址
如在指针位移一节所?述, AVR原×来有一个页面直接寻址模式,但是,对于编译器该模式难于使用,且效率∣较?低。由于我们需要?更多的编码㎝空间来增加位移量,因此取消了页面直接寻址模式。不?过,如果完全没有直接寻址模+式,代码效率也会降低∴,因为在有些情况下需要访问存放在数据存储器中的变量。尤其是处理静态字=符时,代码开销将会很大(达到50%),因为静态变量?必须保存在数据存储器中,不能自动放置到寄存器中。为了克服代码效率低下的问题,我们占用一个16位地址来增加一些非页面直接寻址指令。这样,就可用一条指令来完成64KB数据∞空间∩的寻址。要访问如此大的一?个存储器区域,访问指令必须是两个16位字。

如果访问㎞的字节数少(例如读取一个字符),使用这种℉寻址方式的效率高于指针方式3。对于较大的区域,可能仍然是使用间接寻址比较有效(参见下面的示例)。

Loading of a charac?ter:?
  Indirect addressing? (?6 Bytes): Direct addressing (4 By※tes):
 LDI R30,LOW(CHARVAR) LDS R16,CHARVAR
 ±LDI R31,HIGH(CHARVAR)
   LD R16, Z?
Lo?ading of ≤a long integer:
 Indirect addressing (12 Bytes) Direct addressing (16≦ Bytes)
 LDI R?30,LOW(LONGVAR) LDS R0,LONGVAR
LDI R31,HIGH(LONGVAR) LDS R1,LONGVAR+1
?   LDD ≡R0,Z L≈DS R2,LONGVAR+2
   LDD R1,Z+1 LDS R3,LONGVAR+3
?   LDD R2,Z+2
   LDD R3?,Z+?3

零标志传播
为¢实现条件转移,需要?使用∷一些指令?来操作由一些标志∟(flag)构成的AVR状态寄存器?。跟在这类指令之后的条件转移指令(c≒onditional ∏branch instruction㏑)是否执行转移,取决于这些标志的设置。使用∠运算指令操作这些标志,就可检查一个数?A与另一个数B之间的大小关系÷。当≧被检查?的数为8位的数时,不?存在什么问♀题,因为所有标?志都依赖一条指令设置的?标志值。当被检查的数为16位或32位的数时(这在C语言中是常有的情况),问题就?有点?棘手了,例⊥如一个32°位减法操作就相£当于要连续进行℡4个8位减法操作,而每做一次8位减¥法,就会产生一组新的标志。

为传播进位标志,大多数〒处·理?器都包含一些能处理进位标志先前设置值的指令。例如,带‖进位的减法(SBC)指令;执行SBC A,?B?语句就相当于将A变成mol进位位。但要正确完成所有的条≥件转移操作,这里≯还有另一@个标志需要传播,即零标志。?

示例:
   A=R3:R2:R1:R0,
   B=R7:R6:R5:R4

我们打算?从?A中减去B,并如果A=B就跳转到一个指定位置。如果这个零标志只依赖于最后的?运算指令,那么下面的指令将不会执行:

   S2U?B R0,R4
   SBC R1,R5
   SBC R2×,R6
   S?BC R3,R7 ?; R?3=R7√
   => Z⊙ero flag ?set
?   BRE∽Q destination

这是因为BREQ指令使用的标志值*只-取决于最后的?SBC指?令设置的标志值。如果大多数高位直接相等,即便32位数不相等,零标志也将被置位, ?而转移也会被执行。这种问题也㏒会出现在其他的条件转∫移上?。

有两种办法可以解决这个问题≠。一是保存每个指令产生的标志,然后在第四个减法完成后检查所有的零标志。另一个更精细的方法是在进位指令中传?播零标志(?参见下面方式):

Z?new =Not(R7) AND
   Not(?R6) AND
   …
   ㎎Not(R0♂) AND
   Z?old

使用这%种方﹢式?传播零标志,所有条件转移在最后一个减法操作完成后都会被执行,因为参与标志(溢出和正数标志)所剩部分只取决于最高位字节?。

关于更多控制器开发内容,可以收藏本网页。杨敬敏 微控制器的开发方案

控制器开发控制器开发
本文来自网络,不代表天津五金网立场,转载请注明出处:http://www.mgnqyz.com/mgnqyz/1085.html

作者: mgnqyz

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部