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.

[参考译文] CC2340R5:"#39;timer_settime&#39"如何成为"TI-POSIX&quot 中的阻塞函数;尽管该函数展示了在执行中可以在 ISR 中使用吗?

Guru**** 2455560 points


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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1497607/cc2340r5-how-is-timer_settime-function-is-a-blocking-function-in-ti-posix-even-though-it-shows-the-ability-to-be-used-inside-isr-in-implementation

器件型号:CC2340R5

工具/软件:

这是我第一次使用 TI MCU、所以我决定使用 TI-POSIX、它只是 FreeRTOS 的包装器。 但它在其 "TI-POSIX" 的用户指南中显示、名为"timer_settime"的函数是一个分块函数、其中声明并引用了这个函数  

timer_settime() - this is a blocking call, unlike on TI-RTOS

其中只能在 ISR 中使用的函数如下:

然而、查看"timer_settime"函数的实现内部、我们可以清楚地看到以下行:

    if (HwiP_inISR())
    {
        status = xTimerChangePeriodFromISR(timer->xTimer, timeoutTicks, &xHigherPriorityTaskWoken);
    }
    else
    {
        status = xTimerChangePeriod(timer->xTimer, timeoutTicks, (TickType_t)-1);
    }

这会检查我们是否在 ISR 中、这与文档相矛盾。 这是否意味着我可以在 ISR 中使用一些函数?

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

    尊敬的 Abdelrahman:

    您是否在链接中特意引用了7.10版本的 SimpleLink F3 SDK 文档?  这里是 最新的8.40版本,虽然它不会改变任何你想要查询的内容。

    我的解释是、由于 timer_settime 会被阻止、并且硬件中断应该始终运行到完成而不是被阻止、因此您在 timer_settime  中引用的代码将评估函数是在 ISR (TRUE)中调用还是在线程级(FALSE)中调用、因为它需要进行相应的操作。  尽管这可以解决非阻塞 HWI 要求、但我的建议是使用信标和事件标志快速离开 HWI ISR 上下文、并在线程上下文中进一步处理应用。  请查看 《堆栈用户指南》文档的"线程同步 "部分、更好地了解我所说的内容。

    此致、
    Ryan