您好!
启用 MPU 功能后、可以使用 MPU_CTRL 寄存器的 PRIVDEFENA 位来切换 特权模式和非特权模式、正确吗?
但是,如果我们在未设置 PRIVDEFENA 位的情况下启用 MPU 函数,CM4似乎无法执行应用程序代码,它会分支到 faultISR()。
我的问题是、如何将 CM4应用程序代码分为 特权 模式和非特权模式部分? 还是在 启用 MPU 功能时必须使用 PRIVDEFENA 位?
此致、
卢克
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
启用 MPU 功能后、可以使用 MPU_CTRL 寄存器的 PRIVDEFENA 位来切换 特权模式和非特权模式、正确吗?
但是,如果我们在未设置 PRIVDEFENA 位的情况下启用 MPU 函数,CM4似乎无法执行应用程序代码,它会分支到 faultISR()。
我的问题是、如何将 CM4应用程序代码分为 特权 模式和非特权模式部分? 还是在 启用 MPU 功能时必须使用 PRIVDEFENA 位?
此致、
卢克
Luke、
默认存储器映射在器件数据表中定义。 当用户启用 MPU 时、存储器映射根据 MPU 设置定义。 使用 PRIVDEFENA 位时、 无论 MPU 设置如何、用户都可以始终为特权软件启用默认的存储器映射。 有很多关于如何设置 MPU 的在线材料可供参考(例如这个- https://blog.feabhas.com/2013/02/setting-up-the-cortex-m34-armv7-m-memory-protection-unit-mpu/)
维维克·辛格
作者:Vivek、
在我们的示例项目中 MPU_ex1_FAULT_Handling 下面的 NOP 指令可避免重复的故障生成,这意味着应用程序代码将继续发出故障 ISR,而不会发出那些 NOP。
//
//添加 NOP 以将执行返回到这些 NOP 中的任何一个,而不是上述 NOP
//生成故障的语句。 这样做是为了避免重复
//由于对受保护的存储器执行上述存储器写入操作而生成故障。
//
NOP;
NOP;
NOP;
NOP;
但是、如果我们使用 MPU 函数、 我们不 知道软件何时会违反 MPU 规则并生成故障 ISR、我们不可能提前添加 NOP 并避免重复生成故障。
请对这种情况提出意见吗?
此致、
卢克
您好、 Vivek、
作为 MPU 示例代码烧断、
当 发生非法存储器访问时、 执行 MPU ISR、
示例代码使用更新栈中的返回地址 来继续 执行代码(返回到非法存储器 访问下一行 )、
你有没有 建议 MPU ISR 故障处理(没有 NOP, 返回到非法存储器 访问下一行 )?
//
//执行 ISR 后,执行过程将返回到
//造成了故障,这又导致了另一个故障。
//更新栈中的返回地址以使处理程序返回
//添加到示例代码中的任何 NOP 指令。
//此操作仅用于演示目的。 应用代码
//应按照要求处理故障。
//
asm (" LDR r0、[sp、#0x18]");
asm ("添加 r0、r0、#4");
asm (" str r0、[sp、#0x18]");
此致、
查汉
您好!
我已经向我们的软件专家介绍过这个问题。 同时、您可以查看有关此主题的在线材料- https://developer.arm.com/documentation/ddi0363/e/level-one-memory-system/fault-handling?lang=en
此致、
维维克·辛格