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/TMS320C6678:OpenMP 无法与 POSIX 线程配合使用

Guru**** 2529560 points
Other Parts Discussed in Thread: TMS320C6678, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/607734/rtos-tms320c6678-openmp-can-not-work-with-posix-threads

器件型号:TMS320C6678
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

尊敬的所有人:

当我按照用户指南(downloads.ti.com/.../index.html) 创建 OpenMP 项目时,我发现当我选择“启用对 OpenMP 3.0的支持”时,它将自动选择“假定使用多线程”(build->Advanced options -> Advanced Optimizations)。 问题是 ,选择“假定多线程”时,我无法使用 POSIX 线程。 该工程可以正确编译、但在运行时它将会在_c_int00 ()中裸片。 您能告诉我问题的解决方案吗?

谢谢、致以诚挚的问候。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已通知软件团队。 他们的反馈将在此处发布。

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

    您能否上传您的 CCS 项目来说明问题? 必须将 pthread 和 OpenMP 混合在一起的原因是什么?

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Garrett:
    因为我移植了一个使用 mang pthread 来实现多线程的开源项目,所以当我移植到 TMS320C6678时,我想使用 OpenMP,但我不想修改原始代码。
    此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QQ、


    OpenMP 运行时不是在 POSIX 线程之上构建的。  事实上,OpenMP 运行时的默认配置不会启动 BIOS 运行。  您必须修改启动代码以启动 BIOS、然后在 BIOS 任务或 pthread 中的各自内核上运行主线程和工作线程。  例如、请参阅以下文件:

    e2e.ti.com/.../5556.args_5F00_main_5F00_rtsc.c

    此外、每个 DSP 内核都运行自己的 BIOS 版本。  它不是所有内核上的 SMP。  OpenMP 运行时管理不同内核间线程的同步。  因此、不要指望 pthread API 在不同内核上运行的线程之间工作。

    使用--openmp 开关时,默认情况下,编译器包括 RTS 库的多线程版本。

    当我通过 POSIX = xdc.useModule('ti.sysbios.posix.Settings'在配置文件中启用 POSIX 支持时)、我看到了您报告的相同崩溃。  其中一个 RTS 文件中存在错误。 我在此处附上了固定版本:

    e2e.ti.com/.../8535._5F00_mutex.c

    您需要修改链接器命令文件(或使用此新文件重建 RTS 库)、以将此文件中的.far 段放置在 L2SRAM 中。

       .localfar:
       {
           "* rts*。lib"(.far)
           "* rts*。lib"(.fardata)
           "*_mutex.*"(.far)
           "*_mutex.*"(.fardata)
           "ti.drv.qmss*.ae66"(.far:local)
           "OMP_CONFIG_PE66.oe66"(.far)
           "OMP_CONFIG_PE66.oe66"(.fardata)

       }> L2SRAM

    此外,在调用 args_main()之前 OpenMP 运行时调用 getenv 时出现问题(它将在 pthread 之外发生)。  您可以通过禁用 getenv()例程来解决该问题:

    e2e.ti.com/.../2625.getenv.c

    我将针对这些问题提交错误报告。  我希望这些信息能够帮助您的项目正常运行。

    此致、Eric

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

    我认真阅读了您的解释、但我仍然不知道如何修复此错误。 根据您的建议,我替换编译器中的_mutex.c/getenv.c 文件,然后重新构建 RTS 库。 然后在 OpenMP 中替换 args_main_rtsc.c 文件。 当我在 omp_config.cfg 文件,中添加" var Settings = xdc.useModule('ti.sysbios.posix.Settings');"时、它也无法正常工作。 这是我所崇拜的地方吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢!

    我认真阅读了您的解释、但我仍然不知道如何修复此错误。 根据您的建议,我替换编译器中的_mutex.c/getenv.c 文件,然后重新构建 RTS 库。 然后在 OpenMP 中替换 args_main_rtsc.c 文件。 当我在 omp_config.cfg 文件,中添加" var Settings = xdc.useModule('ti.sysbios.posix.Settings');"时、它也无法正常工作。 这是我所崇拜的地方吗?