Compilation 在指针中如何处理8051扩展数据内存空间?
我正在为Cypress EZ-USB FX2LP开发,它包含一个8051内核,我使用SDCC进行编译 我注意到,我可以(有时?)省略指针的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
\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
在处理器级别)。地址的上半部分来自SFRP2
。在其“正常”寿命中,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”进行回复。因此没有通知我。)