如何在 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,异常的处理程序在特权模式下执行。
我想知道如何在 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,异常的处理程序在特权模式下执行。