PIC18F8722变量声明地址

PIC 18F8722 variable declaration adresses

我知道我可以用那种方式声明一个变量。

variable   udata 0x20

但是这个的内存限制是多少?是

variable   udata 0x35 

有效指令?我的意思是,我可以使用地址 0x35 吗?是不是给我,不是SFR?此外,如何计算此类地址的 space,因为我需要使用很多标志,我将使用此类变量实现这些标志?

提前致谢。

嗯,首先你需要知道指令和compiler/assembler指令之间的区别。 udata 实际上是一个汇编程序指令,这意味着它不能执行,也不能放在程序内存中。它的逻辑在程序被编译成机器代码之前就已经被评估了。

您在问题中提供的示例不是声明变量的正确方法 - 您只是在内存中命名一个特定地址并告诉汇编器它不会被初始化。

udata 声明一个单元化数据段的开始。你可以给它命名,这是真的,但更好的做法是将它用作分组工具,如下所示:

uninitializedGroup udata 0x20
 myVariable1 res 1
 myVariable2 res 1

initializedGroup idata
 dead dw 0xbeef
 visit dw 0xcafe

res 这里是用于分配的指令,将内存指针前进 1,因此为 myVariable1.

保留一个字节

请注意,您甚至不必为数据指定内存位置 - 如果您将 udata/idata 指令后的其余行留空,链接器将自动查找内存为您的变量(避免与系统寄存器冲突)或通知您是否没有 space 剩余。

TL;DR:

  • 分别使用 udataidata 为程序中未初始化和已初始化的数据指定或分配数据地址。如果您需要访问它们所代表的内存位置,请在行首放置一个标签。

  • 通过 res number-of-bytes.

  • 在这些内存位置为您的变量保留内存
  • 如果遇到需要访问大量变量而不总是切换组的情况,请使用 udata_acsidata_acs 将它们放入访问内存。

一般来说,您总是可以在数据表中查看芯片寄存器的地址范围。

就您的具体情况而言,PIC18F8722 family 内存库没有太大问题。 0x20以上0x960以下的内存范围,0x1000以上的内存范围应该是你的使用范围。