【问题标题】:How do I enter supervisor mode on the ARM Cortex m4 to disable interrupts?如何在 ARM Cortex m4 上进入超级用户模式以禁用中断?
【发布时间】:2018-05-06 00:58:16
【问题描述】:

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

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

经过更多调查,这个宏映射到的 cpsid 指令似乎只有在它在主管上下文中运行时才有效。那么问题就变成了如何切换到主管模式以禁用中断并再次返回??

【问题讨论】:

  • 为什么不呢?文档的哪一部分确实让您不确定。这些宏只是 CMSIS 的一部分——我建议阅读 ARM 网站上的文档,而不是“说服”与否。
  • 当您尝试使用 ARM uC 做某事时,PS 谷歌搜索并不是最好的方法。互联网上充满了神话 - 最好阅读官方文档,这非常好。
  • 您需要进行 SVC 调用才能进入特权模式。在 SVC 处理程序中,您可以通过更改控制寄存器的位 0 来更改为特权模式。查一下,网上有很多关于它的。

标签: arm stm32 cortex-m


【解决方案1】:

我找到了宏 __disble_irq() 和 __enable_irq() 但我没有 确信这些是禁用中断。

除非您(或您正在使用的操作系统)明确将privileged modeMSR control, Rn 指令或__set_CONTROL() 函数一起使用,否则它们会这样做。

所以问题变成了我如何进入主管模式以禁用 中断并再次返回??

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

您可以使用SVC instruction 从用户代码中调用 SVC 异常处理程序,并在特权模式下运行一些代码。但是有一个问题,SVC 处理程序调用也会被__disable_irq() 阻止,因此之后将无法重新启用它们。除了__disable_irq(),您可以调整BASEPRI register 以选择性地禁用较低优先级的中断,并将SVC 优先级设置为更高,使其不会被阻塞。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我没有使用操作系统,我使用的是低级 (LL) 库调用。因此,除非 ST 引导代码将其设置为非特权,否则处理器可能处于特权模式?
    • @err 没有可以将处理器设置为非特权模式的“ST 引导代码”。您正在尝试解决一个不存在的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2017-06-23
    • 2015-08-21
    • 2019-12-14
    • 2018-01-29
    • 2018-09-29
    相关资源
    最近更新 更多