HCS08单片机内存使用模式
来源: 芯艺
本站广告
  ENC28J60+uIP 基于TCP的MODBUS IO示例
  ENC28J60+uIP DHCP动态获取IP及UDP广播服务端示例
  ENC28J60+uIP HTTP GET方式将温度数据上传到web服务器
  C720H5上实现MODBUS远程IO
  FM1702读写S50(也叫M1)卡相关资料

HCS08单片机内存使用模式
CodeWarrior新建设项目时让选择内存使用模式Tiny或Small,这主要是因为hcs08有两种类型的
RAM资源,0x100之前的128个字节ram因地址为8位,所以使用效率要高而0x100之后的RAM只能用
16位地址访问,效率相对要低。
选择Tiny模式时
生成的启动代码将栈分配的前0x100之前的128个字节RAM中,链接配置文件prm指示全局变量也
默认分配到0x100之前的RAM当中,这样的好处是效率提高了,但毕竟128个字节的ram太小了。
此种情况下要想全局变量分配到0x100之后需使用#pragma指示:

#pragma DATA_SEG FAR_RAM 
unsigend char a;
... ...
#pragma DATA_SEG DEFAULT

 
要注意的是这种模式下指针变量也默认8位,所以要用到指向0x100以后ram变量的指针时要用__far指示
如:

unsigned char* __far p=&a;

Small模式(通常情况下我们都使用这个模式!)
此模式生成的启动代码将栈自动分配到0x100之后,默认的全局变量也将分配到0x100之后,编译器会
在0x100处开始先分配全局变量,之后放置栈。栈大小也由prm文件中的STACKSIZE设置,也就是说分配
完全局变量后的地址再加上STACKSIZE后得到的地址就是初始的栈地址,HCS08是向下增长的栈结构。
在此种模式下要使用0x100之前的那128字节ram的话也要使用#pragma指示变量的段:
#pragma DATA_SEG MY_ZEROPAGE
unsigend char a;
... ...
#pragma DATA_SEG DEFAULT

此时指针变量的长度为16位,如果使用__near关键字修饰的指针变量访问这些变量效率会提高;

unsigned char * __near p=&a;
 

零页(0x70~0x100)处的变量可以按位访问,但在C语言中没有提供专门的BIT变量,可以用C语言的
 位段来访问,这个可以参考外设寄存器的访问,如:

typedef union {
   byte Byte;
   struct {
     byte bit0       :1;                                      
     byte bit1       :1;                                       
     byte bit2       :1;                                       
     byte bit3       :1;                                       
     byte bit4       :1;                                       
     byte bit5       :1;                                       
     byte bit6       :1;                                      
     byte bit7       :1;                                       
   } Bits;
 }MY_BIT_BYTE;

 #pragma DATA_SEG MY_ZEROPAGE 
 MY_BIT_BYTE g_Bits;
 #pragma DATA_SEG DEFAULT

 void f(void)
 {
   g_Bits.Bits.bit0=1;
   ... ...
 }


关于内存分配模式更详细的介绍请参考这个文章!



声明:芯艺工作室(http://www.chipart.cn)保留所有权力,转载请注明出处!

芯艺工作室    蒙ICP备06005492号

Copyright© 2004-2020 ChipArt Studio All Rights Reserved