我知道我可以用这种方式声明一个变量。
variable udata 0x20
但是这个内存限制是多少?是
variable udata 0x35
有效的指示?我的意思是,我可以使用地址0x35吗?它不是给我的,不是SFR吗?另外,如何计算这些地址的空间,因为我需要使用很多标志,我将使用这些变量来实现?
提前致谢。
答案 0 :(得分:1)
首先,您需要了解指令和编译器/汇编程序指令之间的区别。 udata
实际上是一个汇编程序指令,这意味着它不可执行,也不能放在程序存储器中。在将程序编译成机器代码之前评估其逻辑。
您在问题中提供的示例并不是声明变量的正确方法 - 您只是在内存中命名一个特定地址并告诉汇编程序它不会被初始化。
udata
声明了一个统一数据部分的开头。您可以命名,这是真的,但更好的做法是将其用作分组工具,如下所示:
uninitializedGroup udata 0x20
myVariable1 res 1
myVariable2 res 1
initializedGroup idata
dead dw 0xbeef
visit dw 0xcafe
res
这里是用于分配的指令,通过1
推进内存指针,因此为myVariable1
保留一个字节。
请注意,您甚至不必指定数据的内存位置 - 如果您将udata
/ idata
指令后的其余部分留空,链接器将自动为您找到内存变量(避免与系统寄存器冲突)或在没有剩余空间时通知您。
<强> TL; DR:强>
分别使用udata
和idata
为您的程序中的未初始化和初始化数据指定或分配数据地址。如果需要访问它们所代表的内存位置,请在行的开头放置一个标签。
res number-of-bytes
为这些内存位置的变量预留内存。
如果您遇到需要访问更大变量包而不总是切换存储区的情况,请使用udata_acs
和idata_acs
将它们放入存取存储器。
总的来说,您可以随时查看数据表中芯片寄存器的地址范围。
仅针对您的具体情况,PIC18F8722 family对内存库没有太大麻烦。内存范围高于0x20
且低于0x960
,高于0x1000
的范围应由您自己使用。