我正在尝试通过 PCI 总线对 VME 桥芯片(Tundra Universe II)执行小于 32 位的读取,然后该芯片将进入 VME 总线并被目标拾取。
目标 VME 应用程序仅接受 D32(32 位的数据宽度读取)并且将忽略其他任何内容。
如果我使用映射到 VME 窗口的位域结构(nmap'd 到主内存中),我可以读取 >24 位的位域,但任何更少的都失败。IE :-
struct works {
unsigned int a:24;
};
struct fails {
unsigned int a:1;
unsigned int b:1;
unsigned int c:1;
};
struct main {
works work;
fails fail;
}
volatile *reg = function_that_creates_and_maps_the_vme_windows_returns_address()
这表明结构工作被读取为 32 位,但是通过失败结构的读取例如reg->fail.a被分解为 X 位读取。(X 可能是 16 还是 8?)
所以问题是:
a)这在哪里缩小?编译器?操作系统?还是 Tundra 芯片?
b) 执行的读取操作的实际大小是多少?
我基本上想排除除芯片之外的所有内容。这方面的文档在网上,但如果可以证明通过 PCI 总线请求的数据宽度是 32 位,那么问题可以归咎于 Tundra 芯片!
编辑:-
具体示例,代码为:-
struct SVersion
{
unsigned title : 8;
unsigned pecversion : 8;
unsigned majorversion : 8;
unsigned minorversion : 8;
} Version;
所以现在我把它改成了这样:-
union UPECVersion
{
struct SVersion
{
unsigned title : 8;
unsigned pecversion : 8;
unsigned majorversion : 8;
unsigned minorversion : 8;
} Version;
unsigned int dummy;
};
和基本的主要结构:-
typedef struct SEPUMap
{
...
...
UPECVersion PECVersion;
};
所以我仍然需要更改我所有的基线代码
// perform dummy 32bit read
pEpuMap->PECVersion.dummy;
// get the bits out
x = pEpuMap->PECVersion.Version.minorversion;
我怎么知道第二次阅读是否真的不会像我的原始代码那样再次进行真正的阅读?(而不是通过联合使用已经读取的位!)