__eds__ WORD __ramspace[0x100] __attribute__((eds,address(0x8000ul),noload));
我特别想了解上面的语法(该程序适用于 pic24 和 C 语言)__ramspace[0x100]
。有谁能够帮我?
__eds__ WORD __ramspace[0x100] __attribute__((eds,address(0x8000ul),noload));
我特别想了解上面的语法(该程序适用于 pic24 和 C 语言)__ramspace[0x100]
。有谁能够帮我?
有点晚了,但也许这可以帮助其他人:
__eds__表示您想将后面的任何内容放入扩展数据空间。当您想使用超出某个地址的数据空间时,您可以这样做。您可以在数据表中找到您的 MCU 的扩展空间从哪个地址开始。
WORD意味着您将保留整个单词(而不是例如字节)。对于 pic24,这意味着 16 位块。
__ramspace[0x100]是一个大小为 256 的一维数组。当您查看前面写的内容时,您可以看到您在扩展数据空间( eds ) 中声明了一个名为__ramspace的数组,大小为256 个字(即 256x 16 位值)。
现在您必须声明偏移量,例如数组的起始地址(__ramspace[0] - 第一个数组元素所在的物理地址)。这就是0x8000的作用。
最后,您指示编译器是否应在启动时初始化数组(例如用零填充)。在您的情况下,有一个noload,这意味着随机数据将在启动时位于数组中,直到您在其中写入自己的值。
希望这可以帮助。
__eds__
限定符在“ MPLAB® C Compiler for PIC24 MCUs and dsPIC® DSCs User's Guide ”中描述为:
在属性上下文中,eds,对于扩展数据空间,属性向编译器指示该变量可以分配到数据存储器中的任何位置。具有此属性的变量可能还需要eds类型限定符(参见第 6 章“其他 C 指针类型”),以便编译器正确生成正确的访问序列。请注意,eds限定符和 eds 属性密切相关,但并不完全相同。在某些设备上,在将变量分配到某些内存空间(例如 space(ymemory) 或 space(dma))时,可能需要指定 eds,因为该内存可能只存在于扩展数据空间中。
__ramspace
不是一个特殊的指示符,它只是被选择的标识符。
__ramspace[0x100]
是该行中唯一纯 C 的部分。:) 它声明了一个0x100
类型为 (256,十进制)元素的数组WORD
。数组的名称是__ramspace
。
eds
。address(0x8000ul)
参数__attribute__()
可能使链接器将有问题的变量放在 location 0x8000
。