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.

[参考译文] 编译器/66AK2H12:pthread_mutex_lock (&crisec_)生成一个 do _AngelSWI

Guru**** 3001220 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/927068/compiler-66ak2h12-pthread_mutex_lock-critsec_-generates-a-do_angelswi

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

工具/软件:TI C/C++编译器

PDK 4.0.7、NDK 2.25.1.1、SYS/BIOS 6.46.5.55、IPC 3.46.2.04、EDMA3 2.12.4、 CTOOLS 2.2.0、CCS 7.4、GNU v4.9.0

来自此主题: https://e2e.ti.com/support/legacy_forums/embedded/tirtos/f/355/t/574635?tisearch=e2e-sitesearch&keymatch=pthread_mutex_lock

我按照中的指示进行了操作  

添加了我的 cfg、包括 supportsMutexPriority = true (我需要它)。  

对 pthread_mutexattr_init (&attr)、 pthread_mutexattr_setprotocol ()、 pthread_mutex_init ()、 pthread_mutexattr_destroy ()的调用似乎都起作用。 但是、当我调用 pthread_mutex_lock (&critsec_)时、我会遇到崩溃。 所有提到的调用都来自从 main()创建的任务。

我进入 pthread_mutex_lock()并转到这里:

尝试单步执行 Task_getPri ()会导致 doAngelSWI。  

请提出任何建议?

Mike

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

    尊敬的 Mike:

    您能否导出显示问题的简单项目?

    Todd

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

    Todd、

    我不知道是否可以。 如果我可以轻松地复制项目设置、可能值得一试、但老实说、我不知道制作一个简单项目以展示它需要多长时间。 我是否可以寻找任何明显的东西?

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

    好的、我使用 SYS/BIOS 典型类型的新 CCS 工程从头构建了一个简单的工程。 按照步骤操作、即可正常工作。

    因此、我仍然对它为什么不能在我的项目中工作感到很损失。 代码位于 C++源文件中、这里是 C 语言。这可能是个问题吗?

    在  使用关键段之前,我还会调用 fdOpenSession(TaskSelection)?

    如何将 main.c 转换为 main.cpp? 我重命名了运行时库并将其更改为 libstdc++.a (与实际项目中的情况相同)、然后无法链接。 获取以下编译错误:

    正在制作./src/sysbios/sysbios.aa15fg ...
    gmake[2]:对于"全部"没有要做的事情。
    'building target:"pthread.out"'
    'invigning:GNU Linker'
    "C:/ti/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-gcc.exe /ti/bios_6_46_05_55/packages/gnu/targets/arm/libs/install-native/arm-none-eabi/lib/fpu
    
    
    /home/xlibrary/trees/gnu/gnu-c04/src/linaro/gcc-arm-none-eabi-4_7-2012q4-20121208/src/newlib/newlib/libc/reent/signalr.c -mtun=cortex-a15 -marm -g -gdwarf-3 -gstrict-dwarf -Wall -mfloat-abi=hard -map"-mtthread.map"-nostwl 文件-static -gwarf-3 -gstrict-dwarf -mwarf -clus-mfrom-mfrom-mflo-mfrom-mall-ab-mall-mall-mfrom-g-mall-ab-mall-mfrom-g.cc-mall-mall-mall-g-mall-mall-g-mall-mfrom-mall-mall-mall-mall-g-mfrom-mall-mall-mall-mall-g-mfrom-mall-mall-mall-mall-mall-mall-g.cc-mall-mfrom-mall-mall-mall-mall-m
    `/ti/bios_6_46_05_55/packages/gnu/targets/arm/libs/install-native/arm-none-eabi/lib/fpu ``/ti/bios_6_46_05_55/packages/gnu/targets/arm/libs/install-native/arm-none-eabi/lib/fpu
    /home/xlibrary/trees/gnu/gnu-c04/src/linaro/gcc-arm-none-eabi-4_7-2012q4-20121208/src/newlib/newlib/libc/reent/signalr.c:96:未`对 getpid'
    collect2.exe 的引用:错误:LD 返回1个退出状态 

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

    设置 supportsMutexPriority = true 和/或调用 pthread_mutexattr_setprotocol (&attr、pthread_PRIO_Inherit)时似乎存在问题;

    如果我删除了它们、则运行简单测试和主应用程序。 (两个都是 c++)。 对 pthread_mutex_lock()的调用有效(或者至少看起来有效。 它将返回。 我尚未尝试测试以尝试从另一个任务获取访问权限)。

    注意事项。

    supportsMutexPriority = true:在我的简单测试应用程序和 pthread_PRIO_Inherit 中,对 pthread_mutex_lock (&cricsec_)的调用被阻止。
    我的真实应用程序与 do _Angel 崩溃。

    如果 未设置 pthread_PRIO_inherit,而 pthread_mutexattr_setprimoceiling()将命令设置为3,则第一次调用 pthread_mutex_lock()会阻止。

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

    尊敬的 Mike:

    是从 BIOS 任务还是从 pthread 调用 pthread_mutex_lock()?  无法从 BIOS 任务调用它。  您可以尝试导入 BIOS 重定时示例以测试您的用例吗?

    此致、

    Janet

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

    乌格!

    是的、我正在从 BIOS 任务调用.. 我在 API 手册中阅读了这个令人困惑的部分:

    SYS/BIOS 支持 POSIX 线程的 pthread 和 pthread_atttrs API。

    由于每个 SYS/BIOS pthread 都有一个底层任务对象、因此可以从 pthread 调用一些 SYS/BIOS 任务 API。 其中包括 Task_sleep()、Task_yield ()、Task_self ()和 Task_getPri ()。 某些任务 API、例如 Task_setPri ()、永远不应从 pthread 调用。

    许多 pthread API 必须从任务上下文调用,因此无法从 main()调用。 例如,可以从 main()调用 pthread_create(),但 pthread_joine()不能。 BIOS 任务可以调用任何 pthread_mutexattr API、并且可以创建和销毁 pthread 互斥量、但不能调用任何其他 pthread_mutex API。

     除了 supportsMutexPriority 问题之外,它似乎正在发挥作用。 您是否说互斥不会跨任务工作?

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

    尊敬的 Mike:

    pthread 作为 BIOS 任务运行、但 pthread 对象中嵌入了其他内容以及 BIOS 任务句柄。  使用 pthread_PRIO_INRUSit 时、任务句柄之前的 pthread 对象中存在队列元素以及其他元素。  您可以看到 ti/sysBIOS/posix/_pthread.h 中定义的 pthread 对象

    此外,在创建 pthread 对象时,首先为 pthread 对象分配内存,然后调用 Task_create()来初始化 pthread 任务句柄。  其中一个任务参数值用于存储 pthread 对象的基址。  在 acquireMutexPriority()代码中,您将看到有一个对 pthread_self()的调用,该调用使用此参数获取 pthread 对象。

    因此、当你有一个 BIOS 任务(使用 Task_create()创建、或者在.cfg 文件中静态创建)时、它将不会有 pthread 对象中支持互斥优先级继承所需的元素。  传递给 Task_create()的参数中的任务参数对于 pthread_self()也没有意义。  我本来不希望任何互斥锁在具有或不具有互斥优先级继承的情况下可用于 BIOS 任务。

    API 文档中的一个令人困惑的部分是"必须从任务上下文调用许多 pthread API "吗?  这意味着不能从 main()或从 Swi 或 Hwi 上下文调用 API。

    您是否可以尝试将代码中的 Task_create()替换为 pthread_create(),并查看它是否可以解决问题?

    此致、

    Janet

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

    Janet、

    感谢您的详细解释。 我现在理解手册中的注释。 "许多 pthread API 必须从任务上下文中调用,因此,不能从 main()调用。"我猜关键字是"many"。 在这个"BIOS 任务可以调用任何 pthread_mutexattr API、并且可以创建和销毁 pthread 互斥量、但不能调用任何其他 pthread_mutex API。" 我错过了任何"pthread_mutex"和"pthread_mutex"之间的干扰。

    我无法从使用任务更改为 pthread。 该应用程序在多个内核之间非常大、并且使用许多 ti.sysbios.KNL.Task API 接口和调用有许多任务。 我担心尝试将它们全部更改为 pthread 会在其他方面造成更多麻烦。

    我查看 pthread_mutex 的主要原因是实现了一个 C++防护类。 当它脱离上下文时、在创建自动解锁时。 用于管理异常处理。 我一直使用 GateMutexPri 作为基础、但希望使用 pthread 互斥量来获得上限协议并摆脱跟踪密钥。 也许您有一个建议、但如果您没有、则无需担心。

    您已经回答了我在这个主题上的问题。 再次感谢。

    Mike

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

    尊敬的 Mike:

    最好的选择是 GateMutexPri。

    Todd