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