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.

[参考译文] CC2652R:中断命中时的直接硬件 ISR 例程(在 TI-RTOS 之前)

Guru**** 2587345 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/938695/cc2652r-direct-hardware-isr-routine-on-interrupt-hit-before-ti-rtos

器件型号:CC2652R
Thread 中讨论的其他器件:SysConfig

您好!

是否可以在中断命中时直接调用函数、而不由 TI-RTOS 处理。 我们在数据表中看到、低于禁用优先级的优先级允许这样做、但 SysConfig 似乎不支持中断优先级小于1。

我们使用的是 CC2652 SDK 4.10.00.0.78中的 ZStack、其中我观察到堆栈通常使用 Hwi_disable()和 Hwi_enable()禁用和可重用中断。 这是否直接禁用硬件上的中断(所有中断延迟)、或者仅针对 TI-RTOS 正在处理的中断(即优先级 >禁用优先级)。

我的确切要求是、我希望特定的时间间隔持续达到1-5us 的精度。
但是、当使用时钟/计时器驱动器时、我发现通常会有一些随机间隔30-40us 的跳跃、 我认为这可能是因为 ZStack 暂时禁用中断、导致稍后处理计时器中断事件、从而导致较小的延迟。(我已经尝试过在 SysConfig 上具有最高优先级的计时器)

我们目前正在使用 CC2652 SDK 4.10.00.0.78。

请您告知我可以采取哪些措施来获得所需的一致时间。

谢谢
Akhilesh

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

    您好、Akhilesh、

    是的、我们在 TI-RTOS 文档中将它们称为"零延迟"中断:

    "零延迟中断

    M3/M4 Hwi 模块支持"零延迟"中断。 优先级高于配置 的 Hwi.disablePriority (在实际硬件优先级中、但在数量上较低)的中断不 会被  Hwi_disable()禁用、并且它们不会由内部中断调度程序管理。
    零延迟中断属于常用的"未管理中断"类别。 但是、它们与该定义略有不同、因为除了不受管理外、它们几乎从未被 SYS/BIOS 代码禁用、因此获得了"零延迟"标题。
    零延迟中断在创建时仅可通过其中断优先级设置为大于配置的 Hwi.disablePriority 来与常规发送的中断区分开来。
    请注意、由于零延迟中断不使用发送程序、 因此 ARG 参数不起作用。 另请注意、由于 Cortex-M 在到达 ISR 的路上自动堆栈按调用方保存的 C 上下文、因此使用常规 C 函数实现零延迟中断处理程序(即无需"中断"关键字)。"

     基本上、正如您似乎已经发现的、将优先级设置为"zero"会使其绕过 TI-RTOS 调度程序。 如您所见、这些也不受"Hwi_disable()"调用的影响。  

    SysConfig 不允许您配置"zero"的原因很简单。 我们的大多数驱动程序(您在此处配置)都需要 TI-RTOS/NoRTOS 后端、因此它们也会调用 TI-RTOS/NoRTOS API。 由于从"零延迟"中断运行任何此类 API 并不安全、因为它不在"内核范围内"、因此它也不是 SysConfig 中的选项。

    时钟/计时器抖动可能不是由关键部分造成的。 时钟/计时器模块围绕 RTC 构建、因此分辨率为31us (ISH)。 这意味着您的超时并不总是与此对齐、您将看到+/- RTC 周期的抖动(通常情况下)。

    对于您的要求、请考虑器件通常需要14us 的时间才能从 CPU 空闲状态开始->处于活动状态。 即使没有 TI-RTOS 的影响、也很难实现具有如此小抖动的中断。  

    您能否详细说明您对该中断的需求、中断的用途等 也许我可以提出一个替代解决方案(除非排除了其他所有问题、否则我不建议使用零延迟方法)。

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

    您好、M-W、

    我想构建一个 PhaseCut 调光器应用、其工作原理如下

    1:检测 GPIO 中断(交流信号过零)、
    2.启动定时器(周期已配置)(周期可以是500us - 9600us 之间的任意值)
    3.在定时器中断时、将输出引脚设置为高电平。
    -再次等待步骤1。

    它用于交流光调光。

    我不介意这段时间内的延迟(怠速至工作状态的14us 可以、因为我可以纠正它)、
    但您提到的抖动约为0-40uS、这会导致光闪烁、因为交流线路的有效持续时间(有效功率)会不断变化。

    避免抖动是零延迟方法要求的背后原因。

    谢谢
    Akhilesh

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

    您好、Akhilesh、

    您是否曾研究过改用传感器控制器来实现此目的?

    我建议这样做的原因是、即使在前面讨论的情况下、也可能会出现唤醒抖动、除非您完全禁用电源管理(这意味着您永远不会将器件的任何部分置于待机状态)。

    使用传感器控制器意味着您可以实现完全自包含的逻辑、而不受 ARM 内核处理的任何部分甚至中断的影响。

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

    您好、M-W、

    感谢 Sensor Controller Studio 上的输入、我们没有考虑过它、但现在我们正在尝试。(请分享任何参考文档)

    我们可以完全禁用电源管理以满足此执行要求。
    您能否建议我们在这种情况下需要做些什么来避免 ARM 内核上的抖动。
    我们想知道如何执行零延迟中断、并插入中断函数。

    我们希望实施这两种方法并尝试它们。

    谢谢
    Akhilesh

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

    您好!

    有一组培训模块可用于 Sensor Controller Studio:

    https://dev.ti.com/tirex/explore/node?node=AGwGDhhNIUqfFzveQcalCw__pTTHBmu__LATEST

    Sensor Controller Studio 是用于为其编写代码的工具、它还具有许多示例、您可以从中进行测试。

    关于 ARM 方法、有几个步骤可以使其启动并运行、我真的不建议将其用于传感器控制器。 简而言之、您必须:

    *在 SysConfig 中设置 GPTimer 实例

    *禁用 SysConfig、以便您可以更改生成的输出、而不会再次覆盖它

    *在禁用 GPTimer 之前、将 SysConfig 生成的输出中 GPTimer 的中断优先级更改为0。

    *设置系统上的功率限制:power_setConstraint (PowerCC26XX_disallow_standby)+ Power_setConstraint (PowerCC26XX_disallow_idle)

    *执行一些测试。

    现在、值得考虑的是、GPTimer 用于许多其他驱动器、例如 PWM 和 ADCBuf。 如果您对此有任何依赖、那么将其设为"零延迟"并不是一个好主意、因为您还需要调用与 RTOS 相关的函数。

    总之、传感器控制器是更明智的解决方案、因为它既可实现更好的功耗、又具有更确定性(它没有可能干扰等的中断)。 它还避免了必须在 RTOS 约束之外中断(可能影响应用的其他部分)。  

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

    您好、M-W、

    感谢您的建议、我们让 Sensor Controller Studio 正常工作、它现在满足了我们的要求。

    但是、我们无法使计时器以零延迟运行、这是建议
    *在禁用 GPTimer 之前、将 SysConfig 生成的输出中 GPTimer 的中断优先级更改为0。
    不奏效。
    我们尝试了一些东西、只是为了了解如何实现零延迟中断。 但是、即使我们直接插入中断矢量、无论比较值是多少(这篇文章中的原始问题)、中断都会每5us 触发一次。
    您能否分享一个示例、说明如何实现零延迟、即使是 GPIO 引脚情况也没关系。

    谢谢
    Akhilesh

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

    您好、Akhilesh、

    您能否共享用于测试的代码(项目)、以便我能够查看可能出现的问题? 如果你这样做、我可以自己运行、并且知道我得到了你得到的正是你得到的。  

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

    您好、M-W、

    我能够使它正常工作、它似乎正在生成一个中断。 正如您提到的、我观察到了一个小延迟。
    问题似乎只是清除硬件中断(Hwi_clearInterrupt)、而不是清除计时器中断(TimerIntClear)、因此中断持续触发。

    但是、中断在矢量表中显示为"未管理"、而不是"零延迟"(我之前在直接使用 M4计时器库时看到过这种情况)。 Hwi_params 中设置的优先级也不会出现在矢量表中。
    所有已发送的中断仍然显示为已发送。

    我已附上该代码、请您确认这是否是正确的方法。

    谢谢
    Akhilesh

    /cfs-file/__key/communityserver-discussions-components-files/158/5047.timerled_5F00_zerolatency.zip

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

    您好、Akhilesh、

    您似乎处于正确的转速计上、但请注意、当使用类似这样的中断时、您负责清除外设中断标志。 这通常由驾驶员处理,但当您通过它时,您需要自己处理:)

    矢量表中的“未管理”状态正确。 如文档中所述、TI-RTOS 中的"零延迟"标题用于插入的 ISR、而不是由 Hwi 调度程序管理的 ISR。 正如您在 ROV 中看到的(我想这就是您使用的)、矢量表设置为直接向您的 ISR 函数进行矢量化。  

    此外、Hwi 优先级只与 Hwi 模块相关。 将其设置为"0"只是一种告诉 IT "不要管理这种情况、只需插入即可"的方法。 但是、我希望它将相关中断的"优先级"设置为0 (我看到自己在运行您的示例)。