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;
... ...
}
关于内存分配模式更详细的介绍请参考这个文章!
|
|