Xtensa——MPU

Xtensa——MPU

小狼@http://blog.csdn.net/xiaolangyangyang


        Xtensa的MPU仅提供内存访问控制缓存属性控制,不提供任何形式的地址转换,MPU的内存映射被指定为配置时固定的背景映射动态变化的前景映射

1、Entry结构

XTHAL_MPU_ENTRY(vStartAddress, valid, accessRights, memoryType)
vStartAddress:entry起始地址,一般第一个entry从0x0开始
valid:entry有效标志
accessRights:内存访问控制
memoryType:缓存属性控制
背景映射:
const struct xthal_MPU_entry mpumap[] =
{
XTHAL_MPU_ENTRY( 0x00000000, 1, XTHAL_AR_RWXrwx, XTHAL_MEM_WRITEBACK),
XTHAL_MPU_ENTRY( 0xE0000000, 1, XTHAL_AR_RWXrwx, XTHAL_MEM_NON_CACHEABLE,
XTHAL_MPU_ENTRY( 0xF0000000, 1, XTHAL_AR_RWX, XTHAL_MEM_NON_CACHEABLE)
};
xthal_write_map(mpumap, sizeof(mpumap) / sizeof(struct xthal_MPU_entry));

           MPU Entry没有明确说明区域的长度或区域的结束地址。区域结束于下一个条目的vStartAddress - 1,最后一项定义的区域延伸到地址空间的末尾0xFFFFFFFF。

2、修改Entry的宏定义

XTHAL_MPU_ENTRY_GET_VSTARTADDR(entry)
XTHAL_MPU_ENTRY_SET_VSTARTADDR(entry, vStartAddress)
XTHAL_MPU_ENTRY_GET_VALID(entry)
XTHAL_MPU_ENTRY_SET_VALID(entry, valid)
XTHAL_MPU_ENTRY_GET_ACCESS(entry)
XTHAL_MPU_ENTRY_SET_ACCESS(entry, accessRights)
XTHAL_MPU_ENTRY_GET_MEMORY_TYPE(entry)
XTHAL_MPU_ENTRY_SET_MEMORY_TYPE(entry, memoryType)
XTHAL_MPU_ENTRY_GET_LOCK(entry)
XTHAL_MPU_ENTRY_SET_LOCK(entry)

3、内存访问控制

4、缓存属性控制

5、函数定义

内存访问控制查询:
extern int32_t xthal_is_kernel_readable(int32_t accessRights);
extern int32_t xthal_is_kernel_writeable(int32_t accessRights);
extern int32_t xthal_is_kernel_executable(int32_t accessRights);
extern int32_t xthal_is_user_readable(int32_t accessRights);
extern int32_t xthal_is_user_writeable(int32_t accessRights);
extern int32_t xthal_is_user_executable(int32_t accessRights);
extern int32_t xthal_encode_memory_type(uint32_t x);

缓存属性控制查询:
extern int32_t xthal_is_cacheable(uint32_t memoryType);
extern int32_t xthal_is_writeback(uint32_t memoryType);
extern int32_t xthal_is_device(uint32_t memoryType);

其他:
extern int32_t xthal_read_map(xthal_MPU_entry* entries);
extern void xthal_read_map_raw(xthal_MPU_entry* entries);
extern void xthal_write_map(const xthal_MPU_entry* entries, uint32_t num_entries);
extern void xthal_write_map_raw(const xthal_MPU_entry* entries, uint32_t num_entries);
extern int32_t xthal_check_map(const xthal_MPU_entry* entries, uint32_t num_entries);
extern xthal_MPU_entry xthal_get_entry_for_address(void* vaddr, int32_t infgmap);
extern int32_t xthal_mpu_set_region_attribute(void* vaddr, uint32_t size, uint32_t accessRights, uint32_t memoryType, uint32_t flags);
extern uint32_txthal_calc_cacheadrdis(const struct xthal_MPU_entry*e, uint32_t n);
inline void xthal_mpu_set_entry(xthal_MPU_entry entry);
int32_t xthal_mpu_get_entry(xthal_MPU_entry * entry, uint32_t index);
extern uint32_t xthal_convert_to_writethru_memtype(uint32_t mt);

常用函数:
extern void xthal_write_map(const xthal_MPU_entry* entries, uint32_t num_entries);
extern int32_t xthal_mpu_set_region_attribute(void* vaddr, uint32_t size, uint32_t accessRights, uint32_t memoryType, uint32_t flags);

6、MPU相关指令、寄存器和异常


Xtensa DSP结构学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值