我正在尝试使用 Sourcetrail (https://www.sourcetrail.com/ https://www.sourcetrail.com/)快速了解 pic18 系列微控制器的一些旧嵌入式 c/c++ 源代码。
导入硬件包含文件时出现错误,该文件使用一种奇特的方法来定义可位寻址硬件寄存器的硬件地址,如下所示pic18f26k22.h
.
typedef union {
struct {
unsigned ANSA0 :1;
unsigned ANSA1 :1;
unsigned ANSA2 :1;
unsigned ANSA3 :1;
unsigned :1;
unsigned ANSA5 :1;
};
} ANSELAbits_t;
extern volatile ANSELAbits_t ANSELAbits @ 0xF38;
正如您可能猜到的那样,SourceTrail 被@ 0xF38
部分并期望只有一个分号。该方法被许多其他用于嵌入式系统的 c/c++ 编译器使用,因此我假设存在一个简单的修复方法。
Edit:
首先,澄清一下:@用于将易失性变量放置在内存映射中的特定位置,可以是位地址,也可以是字节地址。 (有点类似于 8086 CPU 的内存和 IO 寻址系统)。它用于全局包含(用于数百个不同的微控制器),在本例中,全局包含与 MPLab c/c++ 编译器一起提供。为了分析目的,我可以复制全局包含文件,并在 SourceTrail 中设置全局包含文件的不同路径 - 这样它们就可以根据需要进行修改。我不想碰项目文件,因为它们仍然需要在原始设置中进行编译。
在尝试 @Antti Haapala 回答时,我发现需要考虑以下类型的使用:
extern volatile unsigned char BAUDCON1 @ 0xFB8;
#ifndef BANKMASK
#define BANKMASK(addr) ((addr)&0FFh)
#endif
extern volatile __bit ABDEN1 @ (((unsigned) &BAUDCON1)*8) + 0;
#define ABDEN1_bit BANKMASK(BAUDCON1), 0
我找不到__bit
定义在任何地方,但它是一个特殊的结构,保存位的位地址(而不是字节地址)。
@ 不是 C 中的有效标记,因此您也不能将其用作宏标识符。最简单的解决方案是使用宏处理@地址,即
#ifdef somethingsomething
#define AT(address) @ address
#else
#define AT(address)
#endif
extern volatile ANSELAbits_t ANSELAbits AT(0xF38);
第一个定义应该由仅在目标上使用的宏来保护。使用简单的 Perl 脚本(例如
perl -pi -e 's/@\s*([0-9a-fA-FxX]+)/AT($1)/g' *.c *.h
If this @
语法按原样在供应商提供的头文件中使用,然后对它们感到羞耻。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)