【问题标题】:Trying to define variables to specific memory locations尝试将变量定义到特定的内存位置
【发布时间】:2011-04-11 02:15:28
【问题描述】:

嘿,我正在使用 WinAVR 并用 C 编写 ATMEGA32。
基本上,我想通过以下方式将我的 C 程序链接到 asm:

asm(" ") 命令。

我试图将 C 中的内存位置定义为精确的内存位置,以便我可以在 asm 命令行中访问它们。

我有 5 个变量:

无符号字符 var1、var2、var3、var4、 var5;

我知道我可以使用指向内存位置的指针,但我不确定如何执行此操作。
任何帮助将不胜感激。
谢谢,
奥利弗。

【问题讨论】:

    标签: c assembly inline-assembly winavr


    【解决方案1】:

    此方法完全独立于编译器,简单明了:

    #define var1 (*(volatile unsigned char *)0xDEADBEEF)
    #define var2 (*(volatile unsigned char *)0xDECAFBAD)
    #define var3 (*(volatile unsigned char *)0xBADC0DE)
    

    等等

    【讨论】:

    • 您应该使用volatile unsigned char 而不是unsigned char。这将确保编译器不会优化对内存位置的读取/写入。
    • 我已经定义了这些语句;现在我试图访问我的 C 程序中的变量:var1 = new_key.这会返回一个语法错误,我尝试过使用 *var1 = new_key 之类的指针,但无济于事......
    • 您遇到的错误是什么?你是真的在写 C,还是在写 C++?
    • define 语句有效。但是访问它们会返回语法错误。 var1 = new_key;这将返回错误:../MorseOut.c:43: 错误:winAVR 中 '=' 标记之前的语法错误。我 99% 确定这是 C,而不是 C++... var1 和 new_key 都是 volatile unsigned char 的...
    • 您是否可能错误地将分号放在#define 行的末尾?显示导致语法错误的实际代码(#define 和您使用它的地方),因为我几乎可以肯定这是一个简单的错字。
    【解决方案2】:

    您可以通过使用 GCC 的内联汇编器通过 C 变量名访问内存位置。请参阅AVR-GCC Inline Assembler Cookbook 了解更多信息。您还可以使用编译器扩展或链接器脚本将 C 变量放置在确切的内存位置。然而,编译器和汇编器的全部意义在于让我们不必像那样管理繁琐的细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多