为什么从未签名的int铸造到由构成无符号int的比特菲尔德组成的结构?

问题描述 投票:0回答:1

我研究了我的问题的建议,并搜索了我的问题的标题,但没有发现任何相关的问题。我对此感到困惑的行在

mmu.c
中的评论下面。 我想在ARM V7 32位处理器上设置MMU翻译表。该函数
void map_virt_to_phys_adr(uint32_t virt_adr, uint32_t phys_adr, uint32_t AP, uint32_t PXN, uint32_t XN)
将虚拟地址和物理地址作为参数和权限标志同时使用。它只是在翻译表中创建一个条目,该条目具有物理/虚拟地址的偏移(它们需要相同)。我不明白为什么编译器会出现错误:不允许从
(L1_table_entry) (section_base_adr | (phys_adr & L1_table_index))
L1_table_index
的铸件(没有解释)。以及为什么它说a')'的预计会在
L1_table_index
中。
(phys_adr & L1_table_index))

// mmu.h #define L1_section_index ((uint32_t)1 << (21)) - 1; #define L1_table_index ~L1_section_index; typedef struct L1_table_entry{ uint32_t PXN:1; uint32_t unused_1:3; uint32_t XN:1; uint32_t DOMAIN:4; uint32_t unused:1; uint32_t AP_0_1:2; uint32_t unused_2:3; uint32_t AP_2:1; uint32_t unused_3:4; uint32_t base_address:12; }L1_table_entry; typedef struct L1_fault_entry{ uint32_t fault:2; uint32_t unused:30; }L1_fault_entry; enum MMU_entry_type {L1_ENTRY, L1_FAULT}; typedef struct MMU_entry{ union { L1_table_entry L1_entry; L1_fault_entry L1_fault_entry; }; enum MMU_entry_type type; } MMU_entry; // ...
Edit:我对错误的原因和解决方案感兴趣:)
    

不允许往返
c struct arm bit-fields mmu
1个回答
0
投票
的播放。

除非类型名称指定一个void类型,否则该类型名称应指定合格或不合格的标量类型,并且操作数应具有标量类型。

使用一个类型的联盟。
或者,如果您感到冒险,请创建一个整数变量,将其地址拿到构造指针,并取消结果。它是UB,但可能会起作用。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.