1
// Register: BAUDCTL
  extern volatile unsigned char           BAUDCTL             @ 0x09B;
  #ifndef _LIB_BUILD
 asm("BAUDCTL equ 09Bh");
  #endif

@符号是什么?这是否意味着在地址 0x09B 定义一个不可缓存的 unsigned char ?那么为什么它需要汇编中的asm函数呢?

4

2 回答 2

5

它是编译器扩展,而不是标准 C 的一部分。它将变量放在 address 上0x09b。它仅用于嵌入式平台的一小部分编译器,其中硬件寄存器的变量很常见。


在不支持@其声明的编译器(即它们更符合标准)上,另一种常见的技术是使用指针。然后它看起来像

volatile unsigned char *BAUDCTL = (unsigned char *) 0x09b;

这样做的缺点是波特控制寄存器现在占用内存中的两个位置,一个用于实际硬件寄存器,另一个用于指针变量。另一个缺点是您必须使用指针取消引用运算符来访问寄存器。

于 2013-06-25T01:08:57.923 回答
2

这不是标准 C,它是某种形式的扩展,所以它的含义取决于实现。但是,我想说你很有可能是正确的,它基本上是在说明角色在 address 0x9b

这通常是嵌入式系统中内存映射 I/O 的完成方式。

至于对asm位的需求,这也是假设(尽管受过良好教育):您extern可以很好地为代码定义 BAUDCTL,C但是,如果您也想在以后的asm块中使用它,它可能需要一个汇编程序定义。可能没有简单的方法可以从asm块中获取 C 定义。

于 2013-06-25T01:10:47.150 回答