如何在SDCC编译器中将变量放置到指定内存地址
寄存器固定地址绑定的正确实现及SDCC报错解决
错误原因说明
- 警告88触发原因:SDCC针对PIC的哈佛架构设计了多类型指针,
generic指针是通用类型,直接把整数字面量转通用指针时,SDCC无法确认你要访问的是数据空间、代码空间还是SFR寄存器空间,因此抛出告警。 __code写法报错原因:__code修饰符对应的是PIC的只读程序存储空间,你尝试对只读空间赋值,自然会触发常量不可修改的报错。
SDCC平台专属正确写法
SDCC为PIC平台的SFR寄存器提供了专门的__sfr类型修饰符,搭配__at关键字指定地址即可,写法如下:
__sfr __at(0x000C) PIR1;
写完直接操作PIR1 |= 0x40即可,无告警无报错,符合SDCC的编码规范。
如果偏好宏定义写法,给指针加上明确的地址空间修饰符即可消除告警,同时建议加volatile避免编译器误优化(寄存器值可能被硬件异步修改,编译器无法感知):
#define PIR1 (*(volatile __sfr uint8_t *)0x0C)
跨平台通用C规范写法
对于冯诺依曼架构平台(比如x86、ARM),标准的写法是给映射的指针加上volatile修饰,避免编译器优化掉对硬件寄存器的访问:
#define PIR1 (*(volatile uint8_t *)0x0C)
GCC下这种写法是完全合规的,不会触发任何告警。如果需要写跨平台兼容的代码,可以用条件编译适配:
#ifdef __SDCC __sfr __at(0x0C) PIR1; #else #define PIR1 (*(volatile uint8_t *)0x0C) #endif
内容的提问来源于stack exchange,提问作者Omar and Lorraine
相关产品推荐
相关产品推荐

