【发布时间】:2011-07-28 20:14:22
【问题描述】:
我有一个没有操作系统的嵌入式系统的现有代码库。我试图让它使用 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 被#定义为指向物理地址的指针。当然,如果我尝试使用 x86 构建的可执行文件直接读取和写入我的 PC 上的地址,那将是访问冲突。不幸的是,如果我尝试这样的事情:
#define GPIOC->IDR { myGpiocIdrReadFunc() }
编译器不喜欢那个“->”,说“宏名后面缺少空格。”
如果你以前解决过这类问题,你是怎么解决的?
【问题讨论】:
-
我认为目标不仅仅是盲目地让I/O“成功”,而是让这种I/O产生副作用?否则,您可以只使用带有 CRL 元素的结构 (GPIOD)。
-
@Yann:我将发布相同的(re:structs)作为答案,如果你发布一个,我会为你的答案 +1。
-
同意@Yann:你是要模拟硬件还是只是想忽略它?你知道,通常它实际上会做一些事情。
-
我希望能够设置“读取”值并检索“写入”值。
标签: c macros embedded arm cpu-registers