【问题标题】:Cortex-M0+ setting the priority of the system exceptionCortex-M0+ 设置系统异常的优先级
【发布时间】:2018-07-10 07:04:20
【问题描述】:

我正在使用 Cortex-M0+ NXP LPC11U68,但我有一个理解问题。 ARM 网站上有一个table,它指定异常 Reset、NMI 和 HardFault 具有从 -3 到 -1 的固定优先级。所有其他异常(系统和非系统)都具有可配置的优先级。

据我了解,如果软件没有以不同方式定义,则这些其他异常的优先级为 0(最高)。我对吗?在这里,我碰壁了。在 LPC11U68 手册(NVIC 章节)中有寄存器(中断优先级寄存器 X)来定义优先级,但仅适用于外围单元。如何为 SysTick Timer、SVCall 或 PendSV 等系统中断指定优先级(从 0 到 3)? ARM 站点声明“除重置、NMI 和 HardFault 之外的所有异常的可配置优先级”。我真的很困惑如何设置系统异常的优先级。

【问题讨论】:

    标签: exception arm


    【解决方案1】:

    您没有提供有关您使用的开发环境的任何信息。但是假设你使用一些 C 代码,你用NVIC_SetPriority 设置优先级,例如:

    NVIC_SetPriority(SysTick_IRQn, 0);
    

    顺便说一句:-3 的优先级高于 0,但仅适用于硬故障。

    另见:https://www.keil.com/pack/doc/CMSIS/Core/html/group__NVIC__gr.html

    更新

    我不明白您为什么如此渴望直接使用寄存器。 NVIC_SetPriority 是低级的。总之,这是source code(Cortex M0+ / CMSIS):

    __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
    {
      if ((int32_t)(IRQn) < 0)
      {
        SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
           (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
      }
      else
      {
        NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
           (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
      }
    }
    

    使用此代码,您可以做到更底层。

    【讨论】:

    • 我很清楚 -3 的优先级高于 0,但在 ARM 中指定可以为 SysTick 设置优先级(例如)。我需要知道为什么 NVIC 中没有允许设置 SysTick 优先级的寄存器。只有外围设备的寄存器可用。我尝试在最低的 C 级别上编写代码,所以我正在设置寄存器。
    • 我看到你找到了答案,但在这里明确说明:SysTick 和 PendSV 异常的优先级通过 SHPR3 寄存器 [B3.2.10 系统处理程序优先级寄存器 3,SHPR3] (和 SVCall 通过SHPR2 寄存器)。
    【解决方案2】:

    感谢您提供所有信息!现在我很清楚了。我使用 NVIC_SetPriority 函数的“逆向工程”来确定 LPC11U68 手册中没有介绍系统控制块 (SCB) 寄存器。这就是为什么我错过了一些东西。找到更多信息

    http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIHFDJCA.html

    http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.htm

    附言我喜欢使用寄存器来获取最低知识。我使用的是 iSystem WinIdea 开发环境,而不是 Keil uVision(好的,它用于逆向工程)。再次感谢您!

    【讨论】:

    • 准确理解系统寄存器的工作原理当然没有错,但 CMSIS NVIC 功能是有目的的。跟随你的人(可能是你自己)会很高兴看到一个标准的、有据可查的函数来执行 IRQ 优先级操作。
    • LPC 手册中没有描述 SCB 的原因是它是处理器的一部分,作为 IP 从 ARM 购买,并在 ARM 手册中进行了描述,例如技术参考手册和架构参考手动的。 LPC 文档是关于连接到 ARM 但由 NXP 创建的外围设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2016-12-01
    • 2017-12-22
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多