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:
分别使用 udata
和 idata
为程序中未初始化和已初始化的数据指定或分配数据地址。如果您需要访问它们所代表的内存位置,请在行首放置一个标签。
通过 res number-of-bytes
.
在这些内存位置为您的变量保留内存
如果遇到需要访问大量变量而不总是切换组的情况,请使用 udata_acs
和 idata_acs
将它们放入访问内存。
一般来说,您总是可以在数据表中查看芯片寄存器的地址范围。
就您的具体情况而言,PIC18F8722 family 内存库没有太大问题。 0x20
以上0x960
以下的内存范围,0x1000
以上的内存范围应该是你的使用范围。
我知道我可以用那种方式声明一个变量。
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:
分别使用
udata
和idata
为程序中未初始化和已初始化的数据指定或分配数据地址。如果您需要访问它们所代表的内存位置,请在行首放置一个标签。通过
res number-of-bytes
. 在这些内存位置为您的变量保留内存
如果遇到需要访问大量变量而不总是切换组的情况,请使用
udata_acs
和idata_acs
将它们放入访问内存。
一般来说,您总是可以在数据表中查看芯片寄存器的地址范围。
就您的具体情况而言,PIC18F8722 family 内存库没有太大问题。 0x20
以上0x960
以下的内存范围,0x1000
以上的内存范围应该是你的使用范围。