主题中讨论的其他器件: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);
}