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.

[参考译文] MSP430F5510:通过 DMA7中断 MSP430F5xx 软件?

Guru**** 2609945 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/728679/msp430f5510-msp430f5xx-software-interrupt-via-dma7

器件型号:MSP430F5510

我将任务库移植到 MSP430、并围绕如何执行任务切换的想法进行阐述。  任务在此上下文中是一个简化的线程。  通常、这些仅在中断上下文中发生:

1:中断发生

2.中断处理程序启动一个上下文切换(例如唤醒一个任务)、这会导致一个软件中断。

3.处理程序完成,并可能在其它任务到达之前唤醒它们。  最后、软件中断仍处于挂起状态、挂起的任务是激活的最高优先级任务。

处理程序 RETI。  现在、当中断被重新启用时、挂起的软件中断被立即进入。

5. SWI 处理程序加载挂起的上下文和 RETI。

这里的关键部分是、在发布 SWI 的中断上下文中、SWI 会使其处于待处理状态、而不会立即执行。  如果没有上下文切换、则不会在保存和加载状态方面产生额外的开销。  (在 ARM Cortex-M 上、这很重要、甚至有一个中断尾链优化。)

从一个非中断运行环境:

1.运行环境通过调整后的存储 PC 保存其状态(指向下面的步骤4)

2.它设置待处理的任务并发布 SWI

3. SWI 处理程序加载并通过 RETI 返回到另一个上下文

4.当此任务再次激活时,它将继续在此处执行

例如、使用 DMA 通道7、这是否可行、然后:

设置 DMA7CTL = DMAIFG | DMAIE 以发布挂起的软件中断(包括 DMAEN 在内的所有其他位都设置为零)。

在 DMA 中断处理程序中:

识别 DMAIV = 0x10表示 SWI 并执行上下文切换。

这是最简单的。  但文档不清楚设置 IFG 是否会实际发布中断...

或者是否有更简单的方法来实现相同的目标?  我缺少什么吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、下面是非中断上下文切换的发生方式:
    正在运行的任务禁用中断
    2.它标记要唤醒的任务为正在运行
    3.它发布 SWI
    它启用中断-这是 SWI 发生的地方
    5.切换回后,任务继续在这里运行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第12.2.7节明确提到端口中断可由软件引起。

    无论如何、所有 xxIFG 标志都可以由软件清除、因此我们知道软件修改确实会影响内部中断逻辑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否知道、即使端口用于备用功能、甚至用作输出、这也能正常工作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如端口电路原理图中所示、输入寄存器(PxIN)始终处于活动状态。 (当引脚配置为模拟时、总线管理器会报告最后一个已知值)。

    因此、中断将始终有效(如果引脚未用作输入、则实际信号边沿不会干扰)。

    哦、如果你有一个未使用的 USCI 模块:一个软件复位将置位 UCTXIFG。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Clemens、
    感谢您的支持!

    1月、

    您还有其他问题吗? 如果不是、请为解决您的问题的帖子选择"已解决"、以便关闭此主题。
    非常感谢!

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

    我想您可以继续使用您的应用程序、因为您不再回复、所以我将关闭此帖子。
    如果您需要进一步的帮助、请随时再次进行评论、它将重新打开主题帖。

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

    不是真的;我想弄清楚如何使它像正确的软件中断那样工作、但由于它的复杂性和分散注意力的因素、现在一直在尝试它。  我只希望在所有硬件中断之后有一个软件中断、如果记录了中断顺序、这将相对容易。  但是与 MSP430的其他内容一样、文档质量很差、行为基本上未定义、因此不能依赖。  我目前的想法是、当我想要在中断处理程序中使用上下文切换时、将 SWI 处理程序的地址和中断的 SR 推送到堆栈中;然后当中断处理程序返回到 SWI 上下文切换程序时、将其返回到 SWI 上下文切换程序中。  从堆栈加载的 SR 将启用中断、因此 SWI 处理程序本身将可中断。  因此、如果有另一个硬件中断将在发生上下文切换之前尾链。  但我需要找出一切可能出错的方法、并思考这些方法。  如果有正确的软件中断位于服务订单的最后、那么这一切就会变得简单得多-就像在 ARM 上一样(除了没有所有 NVIC IPL 的东西)。  我的意思是、从芯片的角度来看、它只是一个1位寄存器 IFG 位、该位进入中断仲裁器、并保证服务订单上的最后一个... 超级便宜、简单、但从软件的角度来看非常实用。

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

    MSP430器件文档的结构非常简单、但包含两个部分。

    • 包含特定于器件的所有信息的规范、例如引脚分配、内部。 矢量表、电子 参数,...
    • 用户指南包含对整个器件系列有效的信息、例如 CPU 架构指南或模块说明以及寄存器和位字段信息

    因此、当您查找中断顺序时、您可以在您的情况下的器件规格中找到该顺序:  

    www.ti.com/.../msp430f5510.pdf

    对于您原来的问题:是的、如果模块未将任何 MSP430中断用作软件中断、只需设置中断标志和使能位即可使用这些中断。 优先级是固定的(正如您可以在数据表中的中断矢量表中看到的那样)

    对于 F5510、最低优先级中断由 RTC 模块触发。

    通常、应用中未使用多个中断、可用于该目的。

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

    RTC 看起来是一个很好的候选方案... 有点凌乱、但我想它会变得像现在一样好。