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.

[参考译文] CC3220SF-LAUNCHXL:有关 POSIX 线程的信息

Guru**** 2589275 points
Other Parts Discussed in Thread: CC3220SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/844583/cc3220sf-launchxl-information-about-posix-threads

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:CC3220SF

您好!

我正在分析 out_of_box 项目、但 CC3220SF 需要对 POSIX 线程进行一些说明:

1)在 main()中,POSIX 线程由 pthread_attr_init()、 pthread_attr_setdetachstate()、pthread_attr_setschedparam()和 pthread_create()函数配置和创建。 这样、线程是分离的线程、在所有这些函数之后、调用 BIOS_start()、那么:该线程是否始终由 pthread_create()或 BIOS_start()启动? (我认为是第一个)

2) 2)为什么其他线程(在 out_for_the_box.c 文件中)被初始化并启动到主线程中而不是在 main()函数中?

3)其他线程 (在 out_for_the_box.c 文件中)未设置为分离模式、因此默认情况下它们是可加入的。 我检查可加入的线程是否是阻塞线程、 out_for_the_box.c 文件内的所有线程 都是按顺序启动的、它们如何同时工作?

4) 4) 当主线程退出时,out_of_the_box.c 文件中的线程也会继续运行?

4) 4) out_of_the_box.c 内的线程取决于主线程堆栈大小?

我附上代码。

谢谢!!!

int main (void)
{
pthread_t 线程;
pthread_attr_t pAttrs;
struct sched_param primParam;
int retc;
int detachState;

/*呼叫板初始化函数*/
Board_initGeneral();

/*设置优先级和堆栈大小属性*/
pthread_attr_init (&pAttrs);
priParam.sched_priority = 1;

detachState = pthread_create_detached;
retc = pthread_attr_setdetachstate (&pAttrs、detachState);
if (retc!= 0)
{
/* pthread_attr_setdetachstate()失败*/
while (1)
{
;
}
}

pthread_attr_setschedparam (&pAttrs、&priParam);

retc |= pthread_attr_setstacksize (&pAttrs、THREADSTACKSIZE);
if (retc!= 0)
{
/* pthread_attr_setstacksize()失败*/
while (1)
{
;
}
}

retc = pthread_create (&thread、&pAttrs、mainThread、NULL);
if (retc!= 0)
{
/* pthread_create()失败*/
while (1)
{
;
}
}

BIOS_start();

返回(0);
}


void * mainThread (void * arg)
{
int32_t RetVal;
pthread_attr_t pAttrs;
pthread_attr_t pAttrs_spawn;
struct sched_param primParam;
struct timespec ts ={0};

GPIO_init();
spi_init();
I2C_init();

/*初始化终端,并打印应用程序名称*/
InitTerm();

/*初始化实时时钟*/
Clock_settime (clock_realtime、&ts);

InitializeAppVariables();

/*关闭主板上的所有 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);

/*初始化所有任务的信号*/
SEM_INIT (&Provisioning_ControlBlock.connectionAppouminedEvent、0、0);
SEM_INIT (&Provisioning_ControlBlock.provisioningDoneSignal、0、0);
SEM_INIT (Provisioning_ControlBlock.provisioningConnDoneToOtaServerSignal、
0、
0);
SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStartSignal、0、0);
SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStopSignal、0、0);

/*创建 sl_Task */
pthread_attr_init (&pAttrs_spawn);
priParam.sched_priority = sawn_task_priority;
RetVal = pthread_attr_setschedparam (&pAttrs_spawn、&priParam);
RetVal |= pthread_attr_setstacksize (&pAttrs_spawn、task_stack_size);

RetVal = pthread_create (&gSpawnThread、&pAttrs_sprawn、sl_Task、NULL);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法创建 SL_Task 线程\n");
while (1)
{
;
}
}
RetVal = sl_Start (0、0、0);
if (RetVal >= 0)
{
DisplayBanner (application_name、application_version);
RetVal = sl_Stop (sl_stop_timeout);
if (RetVal < 0)
{
/*句柄错误*/
UART_PRINT ("\n SL_Stop 失败\n");
while (1)
{
;
}
}

否则为(((RetVal < 0)&&(RetVal!= sl_ERROR_RESTORE_IMAGE_COMPLETE))
{
/*句柄错误*/
UART_PRINT ("\n sl_Start Failed\n");
UART_PRINT ("\n %s 示例版本。 %s\n",application_name,
application_version);
while (1)
{
;
}
}

pthread_attr_init (&pAttrs);
priParam.sched_priority = 1;
RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法配置置备任务线程参数\n");
while (1)
{
;
}
}

RetVal = pthread_create (.gProvisioningThread、&pAttrs、ProvisioningTask、
null);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法创建置备任务线程\n");
while (1)
{
;
}
}

pthread_attr_init (&pAttrs);
priParam.sched_priority = 1;
RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
RetVal |= pthread_attr_setstacksize (&pAttrs、LINKLOCAL_STACK_SIZE);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法配置 linkLocalTask 线程参数\n");
while (1)
{
;
}
}

RetVal = pthread_create (&gLinklocalThread、&pAttrs、linkLocalTask、NULL);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法创建 linkLocalTask 线程\n");
while (1)
{
;
}
}

pthread_attr_init (&pAttrs);
priParam.sched_priority = 1;
RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
RetVal |= pthread_attr_setstacksize (&pAttrs、control_stack_size);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法配置 controlTask 线程参数\n");
while (1)
{
;
}
}

RetVal = pthread_create (&gControlThread、&pAttrs、controlTask、NULL);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法创建 controlTask 线程\n");
while (1)
{
;
}
}

pthread_attr_init (&pAttrs);
priParam.sched_priority = 5;
RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法配置 otaTask 线程参数\n");
while (1)
{
;
}
}

RetVal = pthread_create (&gOtaThread、&pAttrs、otaTask、NULL);

if (重定位)
{
/*句柄错误*/
UART_PRINT ("无法创建 otaTask 线程\n");
while (1)
{
;
}
}

返回(0);
}




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

    您好!

    您在以下问题的答案:

    1. 从技术上讲,线程上下文是使用 pthread_create()创建的。 但是,在调用 BIOS_start()之前,调度程序不会运行,因此在 main()中创建的所有线程只会在调用 BIOS_start()后开始运行。
    2. mainThread()用于启动其他线程,以便可以更有效地共享示例的 main()函数。 通过使 main()保持简单和通用,它可以重复用于大多数 CC3220项目。
    3. 分离和可连接的线程是指他们在线程退出时的行为、而不是指他们是否可以阻止。 当线程被阻断时、调度程序将按优先级选择并运行下一个就绪的线程。 有关更多详细信息、请参阅 RTOS 上的 SimpleLink Academy 模块: http://dev.ti.com/tirex/explore/node?node=ADznPZ0t1iqMbLyS3k3ZFA__fc2e6sr__LATEST
    4. 是的,即使 mainThread()退出,线程也将保持运行。
    5. 不可以、每个线程的堆栈大小在创建线程时设置、与创建线程的堆栈大小无关。 线程堆栈大小的主要限制是需要从堆中分配该内存。 只要有足够的可用堆内存、就可以任意设置线程的堆栈大小。

    如果您需要对上述要点进行更多澄清或有其他 RTOS 问题、请告诉我。

    此致、
    Michael

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

    您好、Michael、

    感谢您的回复。 在过去、我已经使用了 TI-RTOS、但对于 POSIX 实现(被许多 SDK 演示使用)、我丢失了一些东西。 只有一个问题:

    mainThread 被声明为分离:这就是为什么它的任务仅启动其他线程的原因、在它终止后、释放之后可供其他线程使用的所有资源(如堆栈内存)(例如、通用 malloc、 您告诉我、线程堆栈空间是从堆空间获取的)?

    再次感谢

    R

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

    R:您好、

    是的、主线程创建为分离、以便在其返回资源后自动取消分配和释放。

    此致、

    Michael