PIC18F8722变量声明地址

时间:2015-04-12 18:13:32

标签: assembly mplab pic18

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

variable   udata 0x20

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

variable   udata 0x35 

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

提前致谢。

1 个答案:

答案 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:

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

  • res number-of-bytes为这些内存位置的变量预留内存。

  • 如果您遇到需要访问更大变量包而不总是切换存储区的情况,请使用udata_acsidata_acs将它们放入存取存储器。

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

仅针对您的具体情况,PIC18F8722 family对内存库没有太大麻烦。内存范围高于0x20且低于0x960,高于0x1000的范围应由您自己使用。