gpt4 book ai didi

c - 如何将变量放在 SDCC 中的特定内存位置

转载 作者:行者123 更新时间:2023-12-02 18:32:25 24 4
gpt4 key购买 nike

对于低级编程,有时需要说,在给定的内存位置,这就是我的地址所在的位置。在本文中,示例是 PIC16F886 和相关微 Controller 中的 PIR1 寄存器。它总是在地址 0x000C 处找到。

我采取了这种方法:

#define pir1 (*(uint8_t*)0xc)

现在我可以用pir1 |= 0x40之类的东西分配给变量(好吧,我会使用#define常量而不是魔数(Magic Number),但你明白我的意思了)。这在 GCC 上编译得很好,即使我使用 -Wextra -Wall 也没有警告。为了检查我的假设,GCC 输出以下 x86_64:

movl    $12, %eax
movb $64, (%rax)

正是我想要的(好吧,我现在知道为什么一会儿是eax,一会儿又是rax,这可能是另一个愚蠢的x86怪癖,但无关紧要,因为我无论如何都想要 PIC14 代码)

现在,为了针对 PIC14,我实际上使用的是 SDCC 编译器。我这样调用它

sdcc --std-c99 -mpic14 -p16f886 --use-non-free source.c

以上以#define开头的代码给出以下警告:

source.c:412: warning 88: cast of LITERAL value to 'generic' pointer
from type 'const-int literal'
to type 'unsigned-char generic* fixed'

我尝试这样做:

__code __at (0xc) uint8_t PIR1;

但这会导致错误消息

error 33: Attempt to assign value to a constant variable (=)

当我尝试做作业时。

所以我的问题是我是否缺少在 C 中执行此操作的惯用方法?为什么 SDCC 警告我?是否有一些特定的 SDCC 特有的恐惧我在这里忽略了?

最佳答案

关于警告,它可能是编译器中的错误。如前所述,您必须使用 (volatile uint8_t*)0xc 进行内存映射访问

SDCC 中绝对寻址的标准方法是通过编译器扩展,但您做错了。 __code __at (0xc) uint8_t PIR1; 将变量放入不可写的代码段中。这就是您看到错误错误 33:尝试为常量变量 (=) 赋值 的原因。请记住 PIC14 使用哈佛架构。如果地址在 RAM 中则使用

volatile __data __at (0xc) uint8_t PIR1;

如果它在 xdata 中,则使用

volatile __xdata __at (0xc) uint8_t PIR1;

参见Absolute Addressing在文档中

Demo on Godbolt

关于c - 如何将变量放在 SDCC 中的特定内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69267755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com