以下在C中定义

时间:2013-06-25 01:05:31

标签: c

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

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

2 个答案:

答案 0 :(得分:5)

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


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

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

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

答案 1 :(得分:2)

这不是标准C,它是某种形式的扩展,所以它的含义取决于实现。但是,我会说你很有可能是正确的,而且基本上说这个角色位于地址0x9b

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

至于对asm位的需求,这又是假设(虽然受过良好教育):您的extern可能会为 C 代码但是,如果您想在以后的 asm 块中使用它,则可能需要汇编程序定义。可能没有简单的方法可以从asm块中获得C定义。