RISC-V MCU中文社区

【求助】 pmp例程切换usermode模式执行函数触发异常Instruction page fault

发表于 CM32M433R MCU 2024-09-23 17:27:48
3
615
0

配置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);
	}
}


喜欢0
用户评论 (3)
  • yuxin

    2024-11-14 15:34:20 yuxin 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༼༠:༠༽

    2024-10-29 12:00:12 ch.emoji༼༠:༠༽ 2#

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

  • dongyong

    2024-10-15 10:04:35 dongyong 3#

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


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

    和application/baremetal/demo_spmp

yuxin

yuxin 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板