我研究了我的问题的建议,并搜索了我的问题的标题,但没有发现任何相关的问题。我对此感到困惑的行在
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:我对错误的原因和解决方案感兴趣:)不允许往返
除非类型名称指定一个void类型,否则该类型名称应指定合格或不合格的标量类型,并且操作数应具有标量类型。使用一个类型的联盟。
或者,如果您感到冒险,请创建一个整数变量,将其地址拿到构造指针,并取消结果。它是UB,但可能会起作用。