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.

[参考译文] RTOS/TMS320C6748:从 main()调用 Semaphore_pend()的安全时间是什么时候?

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/592950/rtos-tms320c6748-when-is-it-safe-to-call-semaphore_pend-from-main

器件型号:TMS320C6748

工具/软件:TI-RTOS

请不要说“从不”!!!

显然、如果任务将被阻止、从任务外部调用 pend()将是鲁莽的、但如果计数为1或更多、那么它不会被阻止、是否可以调用它? 目前、我有一个项目在执行此操作、它可以正常工作、但我想确保它的安全性、而不仅仅是幸运。

如果你想知道为什么有人会做这样一件奇怪的事情,这就是它的出现方式。 该程序使用 SPI1从 两个不同的任务中访问两个不同的器件(闪存和 ADC)、并且需要保证 对 SPI 的独占访问、因此它使用 一个初始计数为1 的信标作为互斥量。 到目前为止、非常好。 然后、在 调用 BIOS_start()之前、我们需要从主函数中读取闪存中的内容; 读取闪存的函数在信标上挂起、读取闪存、然后发布信标。 因此(一开始未意识到) 该函数从 main 调用一次 、然后在 任务之后重复调用一次。

它的工作原理是! 但应该这样吗?    不用说,如果我不得不的话,我可以调整方案,但这在现阶段是一场巨大的动荡。

谢谢

罗伊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果你使用 BIOS_NO_WAIT 作为超时、你可以从任一线程(任务、Swi、或 Hwi)和 main()调用 Semaphore_pend。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Todd、
    我正在使用 BIOS_wait_forever、因为我需要该任务等待另一个任务完成并释放 SPI。

    我必须承认、我已经阅读了有关使用 BIOS_NO_WAIT 的内容、但实际上并不理解它。 或者、我不明白这会有多大用处。 假设它会递减信标计数、但绝不会阻止任务、即使计数变为零?

    问题是、如果任务被调用、我需要它能够阻止任务。 如果它是从 main()调用的,则不会阻止它。 我可以保证当从 main()调用时,资源始终可用,因此它永远不会尝试阻止。 这足够了吗?

    我意识到这是一个不安全的问题。 也许我应该把重点放在要点上、然后重新调整结构。

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

    如果你使用 BIOS_NO_WAIT 调用 Semphore_pend 函数、会发生什么情况(对于二进制和计数信标)
    1、信标计数非零(例如可用):计数递减1、返回 TRUE。 换句话说、调用方获取信标。

    信号量计数为零(例如不可用):计数不会递减、返回 FALSE。 换句话说、调用方不会获取信标。

    您可以添加一个调用来确定您所在的上下文并使用相应的超时。 API 为 BIOS_getThreadType(),返回值为

    枚举 ThreadType{
    BIOS_ThreadType_Hwi、 /*! 当前线程是一个 Hwi */
    BIOS_ThreadType_Swi、 /*! 当前线程是 Swi */
    BIOS_ThreadType_Task、 /*! 当前线程是一个任务*/
    BIOS_ThreadType_Main /*! 当前线程为 Boot/Main */
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    太酷了! 谢谢。  我 不知道 BIOS_getThreadType()

    非常好,谢谢,我可以与它一起工作。

    罗伊