Compilation 在指针中如何处理8051扩展数据内存空间?

Compilation 在指针中如何处理8051扩展数据内存空间?,compilation,8051,sdcc,Compilation,8051,Sdcc,我正在为Cypress EZ-USB FX2LP开发,它包含一个8051内核,我使用SDCC进行编译 我注意到,我可以(有时?)省略指针的\uuxdata注释,即使使用指针指向扩展数据区域,我的固件仍能正常运行 例如,它将使用以下声明编译和执行: uint16_t crc16(const uint8_t *data, uint8_t len); 而不是 uint16_t crc16(__xdata const uint8_t *data, uint8_t len); 据我所知,扩展数据是16

我正在为Cypress EZ-USB FX2LP开发,它包含一个8051内核,我使用SDCC进行编译

我注意到,我可以(有时?)省略指针的
\uuxdata
注释,即使使用指针指向扩展数据区域,我的固件仍能正常运行

例如,它将使用以下声明编译和执行:

uint16_t crc16(const uint8_t *data, uint8_t len);
而不是

uint16_t crc16(__xdata const uint8_t *data, uint8_t len);

据我所知,扩展数据是16位可寻址的,而数据是8位可寻址的。当指针可以指向扩展数据时,SDCC编译器是否会自动将指针提升到16位?

正确的是,“泛型”类型的指针不必具有与显式“节”指针相同的位宽度。但是编译器通常不提升指针

正如您在评论中所揭示的,您的项目使用
medium
数据模型,该模型在PDATA部分分配变量

PDATA部分与关于硬件的扩展数据部分相同,它需要一个16位地址。但是,它是由8位指针访问的(
R0
R1
在处理器级别)。地址的上半部分来自SFR
P2
。在其“正常”寿命中,
P2
用于存储端口2的值。但如果连接外部内存,端口P2将用于寻址该内存所需的高位,它是多路复用的。因此,SFR是免费的

注1:AFAIR,如果不使用外部代码内存,您甚至可以拆分端口,使用少于8位的地址内存,并将剩余位保留为端口位。如果使用外部代码,所有端口P2将用于输出程序计数器的上半部分。确保您理解所有含义

P2
的初始值为
0xFF
(对于“所有管脚均为输入”),但SDCC的启动代码将其初始化为
0x00
。因此,您无意中访问了外部内存中的前256个字节

要访问其他“页面”(这是PDATA中的“p”,它表示“分页数据”),您只需在读取或写入之前将其高位地址位写入
P2


注2:如果某些库函数跨越页面边界,它们可能足够聪明,可以更改
P2
。在使用之前,请确保它是正确的

是什么让你认为指针被提升了?因为指针数据在扩展数据区域中,所以不能用8位来寻址。是的,当然可以,但是为什么你认为
const uint8_*data
只有8位?好的,我明白了。它取决于您使用的默认(或请求的)数据模型。你检查过你使用的数据模型了吗?是的,你检查过了我相信您知道,您可以通过写入P2来切换PDATA页面,不是吗?--(很抱歉回复太晚,但您没有通过“@busybee”进行回复。因此没有通知我。)