c语言变量是直接寻址,直接寻址页变量

本文探讨了M68HC08系列微控制器的直接寻址页概念,该页包含I/O和控制寄存器以及有限的RAM空间。直接寻址页对于高效指令执行至关重要,但资源紧张。C语言编译器通过#pragma指令来管理变量存储,以利用直接寻址优势。同时,通过宏定义或数据段声明来操作寄存器。为了最大化直接寻址页的利用,可以重定位堆栈,并谨慎分配变量存储空间。
摘要由CSDN通过智能技术生成

直接寻址页变量: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"在连接文件中一定位于零页的起始,而且定义的寄存器名必须连续存放。

阅读更多请您关注:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值