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.

[参考译文] TM4C1294NCPDT:如何全局禁用/启用中断?

Guru**** 2468460 points
Other Parts Discussed in Thread: TM4C1294NCPDT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/670768/tm4c1294ncpdt-how-to-globally-disable-enable-interrupts

器件型号:TM4C1294NCPDT

我发现 这个问题 与我非常接近、但它被锁定、答案对我没有帮助。 所以我决定提出一个新问题。

我想知道(在 C [DRM]或汇编语言中)如何:

  -存储旧的全局中断状态

  -禁用中断

  -恢复旧的全局中断状态。

我来自 AVR 世界、我们在那里保存 SREG、清除位并恢复 SREG。 就这些。 但我没有了解如何在 ARM Cortex M4F 上执行同样的操作。

我链接的主题中的一个答案是讨论 driverlib 的函数:IntMasterDisable。 我已经尝试查看过代码、但我现在对 ARM 汇编的了解非常少。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查看 CMOS 文件。 应该有一个__disable_IRQ()和__enable_IRQ()例程。 或仿真/边缘

    通常、您不应禁用 IRQ。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Danny F"]查看 CMOS 文件。

    或者不是!    由于(提前)时间-海报(可能)设计 了 API 文件。   (随附软件)

    此外、"外设驱动程序库用户指南"还提供了出色的(通常是必需的)详细信息、这通常证明了它的巨大帮助...

    他说您的"禁用中断"必须是 "深思熟虑"、并且(只是)简单而谨慎地使用...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    什么是 CMOS 文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在外设驱动程序库用户指南中,我找到了 IntMasterDisable()和 IntMasterEnable()。 这些函数都不是我想要的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "您所寻求的"是否可能要求(有些)更好(放大)的描述? ARM 已经大大自动化了"中断管理"-这实现了最小的"延迟"(12个周期)-同时使中断服务例程能够用"C"语言进行编码(完全)。

    随着您刚刚加入 ARM、并且您的"论坛搜索"不满意、您可能会对 MCU 手册甚至 ARM 文档进行"更深入的阅读"、从而根据您的目标发出更亮/更好的光...

    (强烈)怀疑"ARM 专业技术"超过了有限的"AVR 世界"、并且供应商的 API 开发人员包括了"最全面"的中断功能、尤其是那些被认为"必要"的功能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在数据表中阅读了很多页之后、我终于找到了寄存器(和位)、我需要更改(我猜)。
    它是 FAULTMASK 寄存器中的 FAULTMASK 位。 该位与全局启用/禁用中断开关等效。
    如果我真的是对的、请告诉我、这样我就可以将这个线程标记为已解决。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请执行以下操作:

    bool DoNotReenable;
    
    DoNotReenable = IntMasterDisable ();
    
    ... 在这里执行中断关闭的操作...
    
    if (DoNotReenable == false ){
    IntMasterEnable();
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我只是注意到您需要直接对寄存器进行操作。 我怀疑这是否会对调用 IntMasterDisable()带来任何性能优势... IntMasterEnable()并且我更喜欢易于理解的 C API 以实现可维护性,但如果您坚持认为,答案是在 IntMasterEnable()和 IntMasterDisable()的实现中:

    //
    //
    //! 启用处理器中断。
    //!
    //! 此函数允许处理器响应中断。 此函数
    //! 不影响中断控制器中启用的中断集;
    //! 它只是将单个中断从控制器门到处理器。
    //!
    //! 示例:启用到处理器的中断。
    //!
    //! 逐字记录
    //! //
    //! //启用到处理器的中断。
    //! //
    //! IntMasterEnable();
    //!
    //! \end逐 字记录
    //!
    //! 如果在函数为
    //时禁用了中断,\return 返回\b true 调用或如果它们最初被启用则为\b false。
    ////
    *****************
    bool
    IntMasterEnable (void)
    {
    //
    //启用处理器中断。
    //
    return (CPUCPSIE());
    }
    
    /*********
    //
    //! 禁用处理器中断。
    //!
    //! 此函数阻止处理器接收中断。 此
    //! 函数不影响中断
    //!中启用的中断集 控制器;它只是将单个中断从控制器门到
    //! 处理器。
    //!
    //! 注意以前、此函数没有返回值。 因此、它是
    //! 可以包含 interrupt.h 并在不带
    //的情况下调用此函数! 包含了 hw_types.h 现在退货是 a
    //! bool、在这种情况下会发生编译器错误。 解决方案
    //! 是在包含 interrupt.h 之前包含 hw_types.h 
    //!
    //! b 示例:禁用到处理器的中断。
    //!
    //! 逐字记录
    //! //
    //! //禁用处理器的中断。
    //! //
    //! IntMasterDisable();
    //!
    //! \end逐 字记录
    //!
    //! 如果在
    //! 函数被调用、或者如果它们最初被启用、则为\b false。
    ////
    *****************
    bool
    IntMasterDisable (void)
    {
    //
    //禁用处理器中断。
    //
    return (CPUCPsid());
    }
    

    在 C:\ti\TivaWare_C_Series-2.1.4.178\driverlib\cpu.c 中查看 CPUcpsi()和 CPUcpsid ()如果您将 TivaWare 安装到默认位置、则会在汇编语言中实现它们。 您可以直接调用这些代码、但我建议您只需坚持使用 TivaWare API 即可实现自记录代码和可维护性。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、如果您对我更喜欢 DRM 而不是 TivaWare 感到厌烦。 我喜欢 TivaWare、我同意它是编写生产代码时应使用的正确资源。 但我非常想了解处理器的工作原理以及 TivaWare 下的工作原理。 我正在学习如何为 Tiva C 微控制器编写代码、但我也在学习它们的工作原理。

    如果我要在另一个论坛上提出这些问题、请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先、感谢您开始新的主题。 如果某个线程在一个多月内未处于活动状态、则该线程将关闭。 如果出现其他问题、正确的做法就是您所做的事情、创建一个新线程、并将链接到旧线程。

    我不确定 IntMasterDisable()和 IntMasterEnable()为何没有执行所需的操作。 (您可能需要澄清。) 如果代码的关键部分无法中断,则对 IntMasterDisable()的调用会禁用所有可编程中断,如果中断已经被禁用,则返回 true,如果中断之前被启用,则返回 false。 在关键代码段之后,如果需要重新启用中断,则调用 IntMasterEnable()。 如果在调用中断时禁用了中断,IntMasterEnable()也返回 true。

    如果您想查看内幕揭秘、TM4C1294NCPDT 数据表的第96页 介绍了 PRIMASK 寄存器。 这些函数只需读取和写入此 Cortex-M4寄存器即可。 如果您需要在不写入该寄存器的情况下读取该寄存器、则驱动程序库文件 cpu.c 中有一个返回 PRIMASK 寄存器值的"函数" uint32_t CPUprimask (void)。

    数据表第2.5节提供了有关 TM4C1294例外架构的其他信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们已向您提供了答案、您只需按照步骤操作即可。 查看 CMSIS 软件包中的 core_cmfunc.h。