🔍 搜索帖子 / 资讯 / 芯片型号…
论坛/CM32M433R MCU/pmp例程切换usermode模式执行函数触发异常Instruction page fault
pmp例程切换usermode模式执行函数触发异常Instruction page fault
CM32M433R MCU 作者 yuxin 发布于 2024-09-23 17:27(746 天前) 3618 浏览

配置pmp,spmp模块的区域范围是4G,并且权限都是rwx,在机器模式下都是正常运行的,但切换到用户模式就会触发异常Instruction page fault,这个是什么原因呢?


void JumpUserMode(uint32_t func)
{
	__RV_CSR_WRITE(CSR_MSCRATCH, sMachineModeStack + MACHINE_MODE_STACK_SIZE);
	__RV_CSR_CLEAR(CSR_MSTATUS, MSTATUS_MPP);
	__RV_CSR_WRITE(CSR_MEPC, func);
	__ASM  volatile ( "mret ");
}
/**
 * @brief Main function
 */
int main(void) {
	/* System Clocks Configuration */
	PMP_Config();
	JumpUserMode((uint32_t)Led);
	while (1) {
            LedBlink(LED2_PORT, LED2_PIN);
	    delay_ms(1000);
	}
}


全部回复 3
y
yuxin694 天前 · 1 楼
回复 dongyong:

看起来你没有设置umode下的stack。 只是把m下的stack base保存在的mscatch


 可以参考nuclei-sdk/NMSIS/Core/Include/core_feature_base.h  __switch_mode

和application/baremetal/demo_spmp

我在这个例子上修改了,调用__switch_mode(PRV_U, umode_sp, test_user),还是出错了

ch.emoji༼༠:༠༽
ch.emoji༼༠:༠༽710 天前 · 2 楼

没有配置stack,应该是第一条store指令触发store page fault,这个是第一条指令取指地址就错了,所以是没有配置atp

d
dongyong724 天前 · 3 楼

看起来你没有设置umode下的stack。 只是把m下的stack base保存在的mscatch


 可以参考nuclei-sdk/NMSIS/Core/Include/core_feature_base.h  __switch_mode

和application/baremetal/demo_spmp

💡 请 登录 后参与讨论(微信扫码即登录/注册)