// Register: BAUDCTL
extern volatile unsigned char BAUDCTL @ 0x09B;
#ifndef _LIB_BUILD
asm("BAUDCTL equ 09Bh");
#endif
@符号是什么?这是否意味着在地址 0x09B 定义一个不可缓存的 unsigned char ?那么为什么它需要汇编中的asm函数呢?
// Register: BAUDCTL
extern volatile unsigned char BAUDCTL @ 0x09B;
#ifndef _LIB_BUILD
asm("BAUDCTL equ 09Bh");
#endif
@符号是什么?这是否意味着在地址 0x09B 定义一个不可缓存的 unsigned char ?那么为什么它需要汇编中的asm函数呢?
它是编译器扩展,而不是标准 C 的一部分。它将变量放在 address 上0x09b
。它仅用于嵌入式平台的一小部分编译器,其中硬件寄存器的变量很常见。
在不支持@
其声明的编译器(即它们更符合标准)上,另一种常见的技术是使用指针。然后它看起来像
volatile unsigned char *BAUDCTL = (unsigned char *) 0x09b;
这样做的缺点是波特控制寄存器现在占用内存中的两个位置,一个用于实际硬件寄存器,另一个用于指针变量。另一个缺点是您必须使用指针取消引用运算符来访问寄存器。
这不是标准 C,它是某种形式的扩展,所以它的含义取决于实现。但是,我想说你很有可能是正确的,它基本上是在说明角色在 address 0x9b
。
这通常是嵌入式系统中内存映射 I/O 的完成方式。
至于对asm
位的需求,这也是假设(尽管受过良好教育):您extern
可以很好地为代码定义 BAUDCTL,C
但是,如果您也想在以后的asm
块中使用它,它可能需要一个汇编程序定义。可能没有简单的方法可以从asm
块中获取 C 定义。