【问题标题】:Do we have '@' operator in embedded c or embedded c++ ? If yes please explain me the below code?我们在嵌入式 c 或嵌入式 c++ 中有“@”运算符吗?如果是,请解释我下面的代码?
【发布时间】:2019-03-16 03:16:57
【问题描述】:

代码:

static volatile unsigned char   TMR0    @ 0x01;

static volatile unsigned char   PORTA   @ 0x05;

static volatile unsigned char   PORTB   @ 0x06;

static volatile unsigned char   PORTC   @ 0x07;

此代码来自 PIC16F877A 的 HT-PICC 编译器 pic.h 库文件

我了解 static volatile 和其他关键字的含义。 这里 Timer0 的寄存器地址是 0x01 但是为什么他们在它前面使用@?和指针有关系吗?

【问题讨论】:

  • 它几乎可以肯定是一种用于识别地址常量的符号。它不是标准C;它是您正在使用的编译器的非标准扩展。
  • @ 获取 Pascal 中变量的地址(如 C 中的 &),这里可能是某种编译器扩展
  • 这个问题可能有助于回答你的问题:stackoverflow.com/questions/23737066/…
  • 可能是因为将整数转换为指针通常会引发警告(因为在普通 C 语言中,您不应该对地址进行硬编码)

标签: c embedded pic hi-tech-c


【解决方案1】:

它是许多嵌入式编译器中常见的编译器扩展,它允许您将变量放置在绝对内存地址中。

来自 HI-TECH C 编译器手册:

3.5.4 绝对变量

大多数变量都可以通过在其声明之后定位到绝对地址 构造 @ address,其中 address 是内存中要定位变量的位置。这样的变量称为绝对变量。

3.5.4.1 数据存储器中的绝对变量

绝对变量主要用于将 C 标识符的地址与 一个特殊的函数寄存器,但可用于将普通变量放在绝对 数据存储器中的地址。

在你的例子中:

static volatile unsigned char   TMR0    @ 0x01;

TMR0 大概是 8 位无符号硬件寄存器,位于地址 0x01。

【讨论】:

    【解决方案2】:

    它是一个位于(@) 特定内存位置的变量。所以有一个 8 位变量 TMR0 位于地址 0x01。在用于 PIC 的 Hi-Tech C 编译器的手册中,请参阅第 3.4.4 节指针类型以获取更多信息。

    在原版 C 中相当于:

    static volatile unsigned char * TMR0 = (volatile unsigned char *) 0x01;

    @ 运算符用于内存非常低的架构中,以帮助降低内存占用。

    【讨论】:

      【解决方案3】:

      这是在特定地址分配变量的常用非标准表示法。在您的情况下,它用于将硬件寄存器映射到 C 变量。

      具体来说,@ 的目的是允许链接器/调试器像使用对象一样使用寄存器。这意味着您可以在调试器中为其添加 watch 或 rw 断点,就像使用任何其他变量一样。

      否则,如果您不需要在调试器中查看这些,则可以使用标准的 C 等效项:

      #define TMR0 (*(volatile uint8_t*)0x01u)
      

      当然,没有必要为硬件寄存器分配空间,因为无论 C 程序做什么,它们都已经存在于硬件中。

      良好的调试器支持 MCU,并且可以选择在单独的窗口中查看 MCU 特定的寄存器。因此,将@ 用于寄存器/寄存器映射的主要原因是工具链带有一个糟糕的调试器。这就是我对嵌入式工具链的遗憾:调试器越差,编译器提供的寄存器映射就越混乱。

      @ 符号也可用于在特定位置声明 RAM/ROM 变量。其他编译器的其他非标准扩展使用各种#pragma___declspec(section...__attribute__(section...。如果存在标准方式会很好,但遗憾的是没有。

      【讨论】:

        猜你喜欢
        • 2015-09-28
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多