c - 在 C 中伪造寄存器读取

标签 c macros embedded arm cpu-registers

我有一个没有操作系统的嵌入式系统的现有代码库。作为能够在主机上进行单元测试的第一步,我正在尝试使用 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/

相关文章:

c - 这个表达式在C预处理器中正确吗?

c++ - C/C++ 图像加载

更改 Pipewire/Pulseaudio 中应用程序的名称

c - 如何将(深层)整个结构及其所有成员复制到另一个结构中? (经过编辑以使目标更容易实现)

c - Keil uVision(C51 编译器),一元运算符 "!"是什么意思?

.net - Visual Studio 2008 宏 : write to output pane

memory - 了解嵌入式软件中的链接描述文件 NOLOAD 部分

c - C : make function visible and callable through macro only (MSVC compiler) 中的函数可见性

function - 有没有办法在 MATLAB 中执行函数内联?

c - IAR Embedded Workbench - 设置变量的字节序