直接寻址页变量
发表:2023-08-29 11:59:41 阅读:23

直接寻址页变量:RAM存储器空间的前256字节($0000~$OOFF)被称为直接寻址页(direct page)、基地址页(base page)或第零页(zero page)。对于M68HC08系列微控制器,直接寻址页的开始部分为I/O与控制寄存器,寄存器后面才是通用RAM区。复位后,堆栈指针SP总是指向地址$00FF。

直接寻址页的资源显得非常宝贵,因为大多CPU08的指令集支持直接寻址模式,比扩展模式快一个机器周期,代码也短一个字节,而且很多高效的指令只能对直接页操作数进行操作,这些指令包括:BSET、BCLR、BRSET和BRCLR,而且MOV指令要求其中最少有一个操作数位于直接寻址页。

对于直接寻址页这样与控制器及指令集密切关系的特征,C语言编译器要想充分利用直接寻址页的这些特性,就必须对变量的存放位置进行明确的说明。ANSI-C没有这方面的标准,编译器的处理方法也多种多样,CodeWarrior内置的编译器(Hiwave c。mpiler)的处理方法

是使用编译器预编译指令pragma申明语句:

#pragama DATA_SEG SHORT myDirectPageVars

UINTl6 myDirectPageVarl; /*unsigned int in direct page*/

#pragma DATA_SEG DEFAULT

代码中的#pragma、DATA_SEG、SHORT都是编译器指令,用来设定编译器的状态或者是指示编译器完成一些特定的动作。以上代码定义了存储在直接寻址页的数据段“myDirectPa—geVars”,该段包含一个16位可直接寻址的变量“myDirectPageVarl”,同时要在连接文件中,将定义的数据段“myDirectPageVars”放在直接寻址页地址范围中。直接寻址页空间非常有限,因此只有那些使用非常频繁的变量才够资格存放在该页中。通常为了释放更多的直接寻址页空间RAM给全局变量使用,可以将堆栈重定位到更高的地址空间中去,比如定位到该款微控制器所能提供的RAM的最大地址空间中去。

很多I/O和控制寄存器也是位于直接寻址页空间中的,而且每一个寄存器都有特定的意义,地址都是唯一固定的,因此需要适当的定义以使编译器采用直接寻址模式操作这些寄存器。通常有两种方法:其一,通过宏定义,将寄存器的名字与它的地址联系起来,例如:

#define PortA(*((volatile UINT8*)(0x0000)))

#define PortB(*((volatile UINT8*)(0x0001)))

其二,像全局变量的定义方法一样,定义一个零页数据段,并在段中连续按顺序定义寄存器名,例如:

#pragma DATA_SEG SHORT myDirectPagePortRegisters

volatile UINT8 PortA;

volatile UINT8 PortB;

#pragma DATA_SEG DEFAULT

这样做必须保证定义的数据段“myDirectPagePortRegisters"在连接文件中一定位于零页的起始,而且定义的寄存器名必须连续存放。

 

阅读更多请您关注:

C语言程序调用汇编语言子程序

基本数据类型

局部变量与全局变量

freescale代理