对于低级编程,有时有必要说,在给定的内存位置,这是我的地址所在的位置。对于这篇文章,示例是PIR1
PIC16F886 和相关微控制器中的寄存器。它始终位于地址 0x000C。
我采用了这种方法:
#define pir1 (*(uint8_t*)0xc)
现在我可以用类似的东西分配给变量pir1 |= 0x40
(好吧,我会使用#defined常量而不是幻数,但你明白我的意思)。这在 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 特定的放克吗?