如何在 ARM Cortex m4 上进入管理员模式以禁用中断?

How do I enter supervisor mode on the ARM Cortex m4 to disable interrupts?

我想知道如何在 STM32L4x6RG Nucleo 上禁用和启用中断?

经过一番谷歌搜索后,我找到了宏 __disble_irq() 和 __enable_irq(),但我不相信这些是禁用中断。

经过更多调查,该宏映射到的 cpsid 指令似乎仅在其在主管上下文中运行时才有效。所以问题就变成了如何进入主管模式以禁用中断并再次返回?

I found the macros __disble_irq() and __enable_irq() but I'm not convinced these are disabling interrupts.

他们这样做,除非您(或您正在使用的 OS)明确离开 privileged mode with the MSR control, Rn 指令,或 __set_CONTROL() 函数,后者执行相同的操作。

So the question becomes how do I move to supervisor mode to disable interrupts and back again??

处理器在重置后处于特权模式,除非您另行通知,否则将一直处于特权模式。它还会在执行异常处理程序时暂时进入特权模式。

您可以使用 SVC instruction to call the SVC exception handler from user code, and run some code in privileged mode. There is a problem though, that the SVC handler invocation would be blocked too by __disable_irq(), so there would be no way to reenable them afterwards. Instead of __disable_irq(), you can adjust the BASEPRI register 有选择地禁用低优先级中断,并设置 SVC 优先级较高,这样它就不会被阻塞。

处理器以特权模式启动,因此除非您 运行 您的应用程序位于操作系统之上,或者您自己已切换到非特权模式,否则您应该已经处于特权模式。如果您 运行 您的应用程序位于 OS 之上,您应该使用它的服务来处理中断,如果不存在此类服务,您应该单独处理中断。

如果你自己切换到非特权模式,你可以使用svc指令触发一个svc-exception,异常的处理程序在特权模式下执行。