0

我正在为包含 8051 内核的 Cypress EZ-USB FX2LP 进行开发,并且我使用 SDCC 进行编译。

我注意到我可以(有时?)省略__xdata指针注释,即使使用指向 XDATA 区域的指针,我的固件仍然可以正常运行。

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

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

代替

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

据我了解,XDATA 是 16 位可寻址的,而 DATA 是 8 位可寻址的。当 SDCC 编译器可以指向 XDATA 时,它们是否会自动将指针提升为 16 位?

4

1 回答 1

1

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

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

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

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

的初始值为P20xFF对于“所有引脚都是输入”),但 SDCC 的启动代码将其初始化为0x00. 因此,您偶然访问了外部存储器中的前 256 个字节。

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

P2注意 2:如果某些库函数跨越页面边界,它们可能足够智能以进行更改。在使用之前,请确保它是这种情况!

于 2020-03-10T13:47:31.323 回答