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/MSP432E411Y: pthread_self()返回空指针

Guru**** 2609955 points
Other Parts Discussed in Thread: CC3120

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/658168/rtos-msp432e411y-pthread_self-returns-a-null-pointer

部件号:MSP432E411Y
主题:CC3120中讨论的其他部件

工具/软件:TI-RTOS

您好!  我在运行NDK示例时遇到问题。  目前,我在尝试调用NDK函数NtGetPublicHost()时被空指针解除引用所困。  这似乎是由于pthread_self()至少在使用Task_create()在main中创建的任务上返回0。

是否需要使用pthread_create()和/创建任务,或使用pthread线程ID?  对于使用简单的TI-RTOS函数创建的线程,是否有getpid()或类似方法,或者“是否应该这样做?”   如果调用pthread函数,我是否需要通过pthread_create()创建所有线程`?

相关,如果我使用NULL线程参数静态执行pthread_create(),我似乎已经用完堆,这有堆损坏的味道。  确保:是否允许在BIOS_START()之前调用pthread_create()?

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

    Jaakko您好!

    您使用的是哪一个NDK示例? 您是在使用SDK中提供的示例,还是自己编写了示例?

    如果报告的问题来自自定义示例,我建议使用SDK中的示例,然后根据需要对其进行修改。

    通过MSP432E4 SDK,我们添加了SlNetSock库(在MSP432E4 SDK中封装NDK),SDK中提供的所有示例都应使用此库,因为它增加了以下优点。 如果您已经编写了自己的示例,我建议您考虑转到此库。

    • 如果需要在MSP432E4 (以太网)和CC3220 (WiFi) SDK之间移动应用程序,则提供两者之间的便携性。
    • 使用相同的API集与MSP432E4和CC3120 WiFi模块通信,因为我们计划在不久的将来将SlNetSock库添加到WiFi插件。

    谢谢!

    SAI

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

    该程序实际上并不是基于MSP432 SDK中的任何示例。  好的,那么SlNetSock -- SlNetIf_getIPAddr()?  请注意,此库不在simplelink_msp432e4_sdk_1_60_00_10/docs/simplelink_MCU_SDK/Users_Guide.html中。  "Net"(这是SlNetSock,对吗?),仅标记为"CC3220"。

    但是,pthread_self()何时返回零值?  我是否需要使用Task_self()?  当使用pthread_create()创建任务时,这是否始终有效? 为什么pthread_self()不直接映射到Task_self()?

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

    该程序实际上并不是基于MSP432 SDK中的任何示例。  好的,那么SlNetSock -- SlNetIf_getIPAddr()?  请注意,此库不在simplelink_msp432e4_sdk_1_60_00_10/docs/simplelink_MCU_SDK/Users_Guide.html中。  "Net"(这是SlNetSock,对吗?),仅标记为"CC3220"。

    但是,pthread_self()何时返回零值?  我是否需要使用Task_self()?  当使用pthread_create()创建任务时,这是否始终有效? 为什么pthread_self()不直接映射到Task_self()?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要使XDC工具为SlNetSock库提供链接器标志,需要添加什么? 现在我得到了一些缺少的标识符(在slnetsock_Relase/debug.a中),但我不太愿意直接添加这些标识符。 我想XDC工具仍然是包括库的"方式"吗? "usePackage('ti.net')"将失败,并显示"XDC runtime error:无法找到指定的库'lib/ti.net.aem4f'。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jaakko您好!

    Jaakko Eskelinen 说:
    OK, SloNetSock -- SlNetIf_getIPAddr()?  请注意,此库不在simplelink_msp432e4_sdk_1_60_00_10/docs/simplelink_MCU_SDK/Users_Guide.html中。  "net"(这是SlNetSock,对吗?),仅标记为"CC3220"。[/QUOT]

    请参阅"./simplelink_msp432e4_sdk_1_60_00_10/docs/Documentation_Overview.html",了解一整套支持的SDK组件。

    SlNetSock是网络服务层的一部分,我应该在之前的回答中提到它。 在"Documentation_overview.html"中,查找"Network Services (NS) User's Guide (网络服务(NS)用户指南)"以了解更多详细信息和API Reference Guide (API参考指南)。

    然而,pthread_self()何时返回零值?  我是否需要使用Task_self()?  当使用pthread_create()创建任务时,此功能是否始终有效?

    阅读"pthread_self" API 手册页时,如果从正在运行的任务调用,则不应返回零。 因此,如果在启动调度程序之前调用了"pthread_self",我会认为返回零,但不确定。

    编辑:混合POSIX和TI-RTOS (或FreeRTOS)调用是不安全的,因为POSIX API可能不会直接映射到相应的RTOS API。

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

    Jaakko Eskelinen 说:
    需要添加什么才能使XDC工具为SlNetSock库提供链接器标志?[/QUOT]

    您能否参考SDK (./examples/RTOS/MSP_EXP432E401Y/ns)中的现有示例,了解如何将 SlNetSock库添加到CCS项目中。

    我想XDC工具仍然是包括libs的"方式"吗? "usePackage('ti.net')"将失败,并显示"XDC运行时错误:找不到指定的库'lib/ti.net.aem4f'。"

    据我所知,我们不提供使用XDC工具在SimpleLink SDK中包括软件包的示例。

    谢谢!

    SAI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果有机会调用POSIX API,我应该使用pthread_create()来创建所有线程,对吗?

    pthread_self / TI-RTOS当前在main()(BIOS_Start之前)中为Task_create()'d和该任务(即运行调度程序时创建的任务)生成的任务返回0。

    {根据POSIX,我认为pthread_self()可以返回任何值(pubs.opengroup.org/.../pthread_self.html),包括零。 我认为不可能为非运行任务调用pthread_self();-),即启动调度程序之前的主系统上下文。是的。}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jaakko您好!

    正如我在前面的答复中所指出的,混合POSIX和RTOS调用是不安全的,因为可能没有直接关联。

    因此,如果使用pthread_create(),则使用pthread_self()和其他POSIX API。 如果要使用Task_create(),则使用Task_self()。 混合使用它们可能会导致不良行为。

    让我们知道pthread_self()是否返回零,即使您已经使用pthread_create()和其他POSIX API。

    谢谢!
    SAI