我有一个没有操作系统的嵌入式系统的现有代码库。作为能够在主机上进行单元测试的第一步,我正在尝试使用 x86 gcc 而不仅仅是交叉编译器来构建它。不幸的是,到处都是直接寄存器读写,而不是使用提供的抽象层。当然,一种选择是解决这个问题;用对 GPIO 访问函数的调用替换直接寄存器访问。我希望通过引入一个宏(仅在 x86 构建中使用)来重新定义像
这样的代码片段来加快速度myvar = (GPIOC->IDR >> 6) & 0x03; // Read bits 6 and 7
GPIOD->CRL &= 0xFFFFFF0F;
类似于:
myvar = (myGpiocIdrReadFunc() >> 6) & 0x03; // Read bits 6 and 7
myGpiodClrWriteFunc() &= 0xFFFFFF0F;
GPIOx 被#defined 为指向物理地址的指针。当然,如果我尝试使用 x86 构建的可执行文件直接读取和写入我 PC 上的地址,那将是访问冲突。不幸的是,如果我尝试这样的事情:
#define GPIOC->IDR { myGpiocIdrReadFunc() }
编译器不喜欢那个“->”,说“宏名后缺少空格”。
如果你以前解决过这类问题,你是怎么做到的?
最佳答案
typedef struct {
int IDR;
int CRL;
} gpio_t;
gpio_t c;
gpio_t d;
gpio_t * GPIOC = &c;
gpio_t * GPIOD = &d;
当编译器对你尖叫时,继续向 struct
添加像 IDR
这样的寄存器。
编辑 在看到您的评论说您实际上想要模拟这些值后,我编辑了答案,您可以通过这种方式进行模拟,但请记住,您需要像在硬件中一样初始化它们。
关于c - 在 C 中伪造寄存器读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865094/