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.

[参考译文] CC3235MODASF:供应时 MQTT 线程损坏

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1083301/cc3235modasf-mqtt-thread-broke-while-provisioning

部件号:CC3235MADASF
“线程: CC3235SF”中讨论的其它部件

大家好。

使用 CC3235MOASF 模块的 TIRTOS 时出现以下问题。

我的代码很简单。 它以 AP 模式启动,在提供凭据后,它会自动切换到工作站模式,然后连接到互联网。之后,它会自动连接到 MQTT 服务器。
有效的代码 如下所示

主要内容-----------------

/*
*========= 主要=========
*
Int main (无效)

pthread_t 线程;
pthread_attr_t pAttrs;
结构 sched_param priParam;
内部延迟;
国际 detachState;

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

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

detachState = pthread_create_detached;
retc = pthread_attr_setdetachstate (&pAttrs,detachState);
IF (retc!= 0)

/* pthread_attr_setdetachstat()失败*/
while (1){}
}

pthread_attr_setschedparam (&pAttrs,&prParam);

retc |= pthread_attr_setstacksize (&pAttrs,THREADSTACCKSIZE);
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);
}

--- 然后在 threes.c 中------

/*
*========= 主要任务=========
*
void *主线程(void *arg)

pthread_attr 属性;
pthread_attr_t pattrs_spawn;

结构 sched_param priParam;
内部延迟;

/*初始化 GPIO,因为多个线程正在使用它*/
GPIO 初始化();

I2C_INIT();

InitTerm ();


//为 UART 输出配置显示模块
display_init();

Display = Display_open (Display_Type_host,空);
如果(显示== NULL)为{
//无法打开显示模块//
While (1);
}

/*初始化应用程序变量*/

retc = initAppVariables();

/*使用默认值初始化属性结构
*每条线程
*数字越高,TI-RTOS 的优先级就越高。
*设置优先级,分离状态和堆栈大小属性
*


/*创建 SL_Task */

pthread_attr_init (&pattrs_spawn);
priParam.sched_priority = spawn_task_priority;
retc = pthread_attr_setschedparam(&pattrs_spawn,&priParam);
retc |= pthread_attr_setstacksize (&pattrs_spawn,SL_TASKSTACKSIZE);
retc |= pthread_attr_setdetachstate (&pattrs_spawn,pthread_create_detached);
retc = pthread_create (&spawn_thread,&pattrs_spawn,SL_Task,NULL);
如果(retc!= 0){
//Display_printf (display,0,0,"[网络] wifi 初始化:无法创建简化任务\n\r\n 系统将重启\n");
mcuReboot();

While (1);
}


pthread_attr_init(&atts);

/*---- HTTP 服务器线程------------------------ *

priParam.sched_priority = 3;
pthread_attr_setschedparam (&atts,&priParam);
retc |= pthread_attr_setstacksize (&atts,HTTP_stack_size);
IF (retc)

//Display_printf (display,0,0,“无法配置置备任务线程参数\n");
While (1);
}
retc = pthread_create(&http_thread,&atts, httpserverTask, NULL);
如果(retc!= 0)为{
// pthread_create()失败
同时(1);
}


/*----- MQTT 客户端线程---------------------------------------------------- *

priParam.sched_priority = 4;
pthread_attr_setschedparam (&atts,&priParam);
retc |= pthread_attr_setstacksize (&atts,MQTT_stack_size);
IF (retc)

//Display_printf (display,0,0,“无法配置置备任务线程参数\n");
While (1);
}
retc = pthread_create(&MQTT_thread,&atts, mqttTask, NULL);
IF (retc!= 0)

// pthread_create()失败
While (1);
}


/*------------- 网络线程------------------------ *

priParam.sched_priority = 5;
pthread_attr_setschedparam (&atts,&priParam);
retc |= pthread_attr_setstacksize (&atts,netwrok_stack_size);
IF (retc)

//Display_printf (display,0,0,“无法配置置备任务线程参数\n");
While (1);

}
retc = pthread_create (&network_thread,&atts,networkTask,NULL);
IF (retc!= 0)

// pthread_create()失败
While (1);
}


/*------------- ADC 线程----------------------- *
/*
priParam.sched_priority = 1;
pthread_attr_setschedparam (&atts,&priParam);
retc |= pthread_attr_setstacksize (&atts,adc_stack_size);
IF (retc)

//Display_printf (display,0,0,“无法配置置备任务线程参数\n");
While (1);

}
retc = pthread_create (&ADC_THread,&atts,ADCThread,NULL);
IF (retc!= 0)

// pthread_create()失败
While (1);
}

*

返回(0);
}

-----

现在的问题是:

如果 ADC 线程未注释,则代码不会连接到 MQTT 服务器。
即使 ADC 线程刚刚遇到一个哑指令,但该指令工作正常(就像闪烁的 LED)。

我尝试使用控制外围设备的其他线程,但与 MQTT 服务器的连接也停止工作。

有趣的是,如果您先断电再通电,该模块会自动进入工作站模式,并确实连接到 MQTT 服务器,所有线程都工作正常。

换言之,我需要的代码有效,除非我添加了一些额外的线程,如 ADC 或外设管理线程。 我无法快速访问真实原型中的重置按钮。

帮助。  

此致,请提前感谢!

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

    嗨,Mauro,

    问题可能是由 ADC 线程优先级引起的。 您能否将 ADC 线程的优先级降低到10并查看问题是否消失?

    您还可以分享 ADC 线程中正在执行的操作的片段吗? 是否有任何可能捕获到的线程,从而阻止对其他线程的访问?

    此致,

    杰西

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

    Jesse,  

    感谢您的回复。

    我在手册中读到:“最大优先级为 Task_numPriority-1 (默认值=15;最大值=31)。” 这意味着,如果我将 ADC 线程优先级更改为10,我将提高它,而不是降低它。

    无论如何,我尝试使用 priorityu 10,但我获得了相同的结果,即使它崩溃了。

    我知道硬件中断优先级(Hwi)与您所说的相同,1是最高优先级。

     线程内的代码如下所示:

    ----- ADD.C.c--------------

    /*
    *========= threadFxn0 ====
    *
    void *线程 Fxn0 (void * arg0)

    while (1){
         睡眠(1);
         GPIO 写入(LED_B,1);
         睡眠(1);
         GPIO 写入(LED_B,0);
    }
    返回(空);
    }


    /*
    *========= ADCThread =========
    *
    作废*ADCThread (作废*arg0)

    pthread_t thread0;
    pthread_attr 属性;
    结构 sched_param priParam;
    内部延迟;
    国际 detachState;

    /*创建应用程序线程*/
    pthread_attr_init(&atts);

    detachState = pthread_create_detached;
    /*设置优先级和堆栈大小属性*/
    retc = pthread_attr_setdetachstate (&atts,detachState);
    如果(retc!= 0)为{
    /* pthread_attr_setdetachstat()失败*/
    同时(1);
    }

    retc |= pthread_attr_setstacksize (&atts,THREADSTACCKSIZE);
    如果(retc!= 0)为{
    /* pthread_attr_setstacksize()失败*/
    同时(1);
    }

    /*创建线程 Fxn0线程*/
    priParam.sched_priority = 1;
    pthread_attr_setschedparam (&atts,&priParam);

    retc = pthread_create (&thread0,&atts,threadFxn0,NULL);
    如果(retc!= 0)为{
    /* pthread_create()失败*/
    同时(1);
    }

    返回(空);
    }

    -----

    此致

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

    嗨,Mauro,

    您可以尝试以下操作:

    • 在线程 Fxn0中使用 Task_SLEE()而不是 SLEE()
    • 优先级级别是正确的,但是,您可能需要调整优先级,以便所有线程都具有不同的优先级(主线程,ADCThread 和  threadFxn0都具有相同的优先级1
    • 查看  TI-RTOS 的调试功能和工具以帮助识别错误
    • 您是否已使用 CCS 中的调试器来查看代码被卡住的位置?

    此致,

    杰西

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

    杰西!,非常感谢! 这是一个非常有用的信息! 我将研究并试用解决方案,并对问题进行屏幕截图! (可能在一周内)。 此致!

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

    Jesse,  

    再次感谢。

    • 我尝试使用 Task_Sleep (),但它没有改变任何东西。 我使用了 pthread (POSIX),我看到 sleep()不是必要的错误。 我会继续阅读并尝试这一点。
    • 我改变 了所有的优先事项,问题依然存在。
    • 我欺骗了被窃听的功能,这不是记忆。 我在这里附上图片。
    • 但我的 测试结果很奇怪。 具有5个线程的代码工作正常。 但我用 6个线程(使用 ADC)编译,但我没有完成置备,然后停止调试,并再次用6个线程(使用 ADC 线程,代码完全相同)重新编译。 然后我完成了配置,并将其连接到 MQTT 服务器。 可以说,这是有效的。 然后,我用相同的代码重复了相同的编译,但它不起作用。 换言之,它仅在编译程序时使用上述条件 :“编译模块之前,模块不能进行配置”。 这很奇怪。   
    • 你有什么想法吗?
    • PD:调试数据 显示 一切正常,每次都在空闲线程上运行,且稳定。

    此致。

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

    您好,Mauro,

    [引用 userid="515297" url="~ë/support/wireless-connectivity wi-fi-group/wi-fi /f/wi-fi-forume/1083301/cc3235modasf-mqtt 线程冲突时配置/4017654#4017654"]
    • 换言之,它仅在编译程序时使用上述条件 :“编译模块之前,模块不能进行配置”。 这很奇怪。   
    • 你有什么想法吗?
    [/引用]

    我不熟悉这种行为。

    您能否提供有关设备未完成配置或未连接到 MQTT 服务器时所遇到的错误类型的更多信息?

    此致,

    杰西

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

    Jesse,  

     我刚刚在配置后重新启动了主板,而不是像网络示例所建议的那样进行切换。 由于某些原因,当我们添加线程时,代码不再起作用。 我在重新启动时使用了指令:用于 cc3235sf 示例的 mcreboot()。 我希望它能在我完成工作之前发挥作用。 如果没有,我希望找到另一个解决方案。

    我使用的函数是下一个:

    //*************************************************
    //
    //! \brief 此功能将重新启动 M4主机处理器
    //!
    //! 无
    //!
    //! 无返回
    //!
    //**********************************************
    无效 mcuReboot (void)

    /*停止网络处理器活动后再重新发送 MCU */
    SL_Stop (SL_STOP_TIMEOUT);

    //UART_PRINT ("[Common] CC32xx MCU 重置请求\r\n);
    //Display_printf (display,0,0,"[网络][通用] CC32xx MCU 重置请求\n\r\n 系统将重新启动\n\r\n);
    /*重置 MCU 以测试套件*/
    PRCM 休眠循环触发器();
    }

    感谢您的支持。

    此致。