通过之前的介绍可知,三种存储模式未包含idata区,如果想在 idata 区分为一个变量,必须要加idata关键字修饰,但是注意idata区要留一部分空间给栈来使用。
对于传统五十一来说,四个存储区域的访问速度从快到慢,依次是data>idata>pdata>xdata(具体型号以芯片手册为准),所以存储模式应该尽量选择 small模式。
对于不常用的,或者比较大的数据,可以使用 xdata 关键字指定到外部存储区中。复杂的地址空间又导致了指针类型的复杂化。指针变量存储的是对象的地址,但对五十一来说,它有四个地址空间。假设仅给出一个零 s二零这样的地址,是无法区分是哪个区域的地址。
因此对于通用指针编译器,必须增加一个附加的字节来表示指针的指向区域。所以通用指针会多占一个字节的空间,但优点是可以指向任意一个区域。如果在声明指针时,增加存储类型限定符,则会限定指针所指的区域。
对于限定存储区域的指针,data、idata和pdata寻址空间在二百五十六字节以内,因此指向这些区域的指针只有一个字节大小。而 code和 x data 区是六十四k寻址空间,所以指向这两个区域的指针需要占用两个字节。
而通用指针需要三个字节来表示,指向特定区域的指针可以赋值给通用指针,或者说可以转换成通用指针,但是反之则不行,有可能造成区域的不匹配导致结果不正确。
一个完整的特定类型指针定义应该是这样的:
·第一个存储类型用来修饰指针类型,表示指向哪个内存区域。
·第二个存储类型修饰的是变量名,指定指针变量的存储位置。
如有疑问或不同看法,欢迎在评论区留言讨论。