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

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

最佳答案

它是一个编译器扩展,而不是标准C的一部分。它将变量放在address0x09b上它只用于嵌入式平台的一小部分编译器,在这些编译器中,硬件寄存器通常有变量。
另一种常见的方法是,在编译器的声明中不支持@(即它们更符合标准)使用指针然后看起来像

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

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

08-17 05:40