我具有以下内存结构:
struct {
uint16_t MSB_VALUE : 8;
uint16_t : 8;
uint16_t LSB_VALUE;
} BIG_VALUE;
此结构一起代表由硬件固定的32位内存部分。可以使用Verilog串联表示法来表示BIG_VALUE的值:
BIG_VALUE = { MSB_VALUE[7:0],LSB_VALUE[15:0] }
我希望能够编写一个并集(或其他形式),以便可以使用点表示法访问BIG_VALUE的值。也许像这样的愚蠢:
union {
uint32_t val;
struct {
uint16_t MSB_VALUE : 8;
uint16_t : 8;
uint16_t LSB_VALUE;
} sub;
} BIG_VALUE;
但是,问题在于,MSB在内存中的LSB之前(也有8位的间隔),因此调用BIG_VALUE.val不会获得希望的值。
我对可以尝试的东西含糊不清,但是我只是感到困惑。有没有办法在工会/结构形式主义中做到这一点,还是我现在应该放弃?我猜放弃是指必须手动分割24位值,然后将其存储到适当的字段中。如果可行的话,也许我可以写一个函数稍后再做。
具有这项工作意味着我可以使用点表示法存储24位值,并使数据进入内存中的适当位置。例如:
BIG_VALUE.val = 0x0031FFFE
Then
BIG_VALUE.MSB_VALUE == 0x31
and
BIG_VALUE.LSB_VALUE == 0xFFFE
But the memory layout would be
addr : 0x0031
addr +4 : 0xFFFE