1

我正在尝试使用 Keil uvision 3 编译 C 代码。只有当我通过为目标选择选项 xdata 来使用大内存模型时,才会编译整个代码。要使用这个模型,我必须使用外部数据 RAM,由于某些原因,这对我来说是不可能的。

所以我决定使用 pdata 选项。任何人都可以帮助我了解使用 pdata 的确切步骤吗?我正在使用 89V51RD2。我对 BL51 MISC、BL51 Locate 等选项感到很困惑。

4

2 回答 2

1

在 Keil 官方论坛上发布此内容可能会更好

http://www.keil.com/forum

根据数据表, NXP P89V51RD2是 8051 衍生产品,具有 1KB 片上 RAM。如果您的程序无法容纳那么多空间,则必须添加外部 RAM。

PDATA 允许您使用“P”老化访问 XDATA。它不是额外的内存。如果您需要更多空间,您应该真正考虑优化内存使用,否则您将不得不添加额外的 XDATA 资源。

参考:C51:使用 PDATA 存储器

披露:我为 Keil/ARM 工作

于 2010-03-15T15:07:42.577 回答
0

如果您确实没有任何可用的外部数据 RAM,那么 PDATA 选项将无济于事。PDATA 与 XDATA 位于不同的逻辑地址空间,但使用相同的物理空间。

例如,您使用的微控制器包含 1kB 的 RAM。所有 1024 字节都可以作为 XDATA 存储器访问(地址 XDATA:0x0000 到 XDATA:0x03FF)。256 字节(一次)可以作为 PDATA 存储器访问(地址 PDATA:0x00 到 PDATA:0xFF)。假设您将微控制器设置为使用 RAM 的前 256 字节作为 PDATA 存储器。这意味着 PDATA:0x00 和 XDATA:0x0000 指向 RAM 的相同物理字节。如果您不小心,您将尝试在同一物理内存中存储两个不同的值,其中一个将被覆盖并丢失。

如果您已经使用了所有的 XDATA 内存,则需要使用 DATA 内存或 IDATA 内存来获得更多。如果您确实使用 IDATA 内存,则需要非常小心,留出足够的空间,以便您存储的值不会被从 IDATA:0xFF 开始并向下增长到 IDATA:0x00 的堆栈意外覆盖

编辑:对不起,我没有注意到这个问题已经存在两年了。不过,希望这对某人有所帮助。

于 2012-07-07T05:55:50.600 回答