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/MSP-EXP432E401Y:RTOS 崩溃、无法在运行时创建任务

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/672439/rtos-msp-exp432e401y-rtos-crashes-wenn-task-is-not-created-at-runtime

器件型号:MSP-EXP432E401Y

工具/软件:TI-RTOS

您好!

如果使用创建了我的 httpTaskFxn

taskHandle = TaskCreate (httpTaskFxn、NULL、1、HTTPTASKSTACKSIZE、0、
0、0); 

从 netIPAddrHook()回调函数中,所有操作都正常。

如果我尝试以这种方式构造任务...

// main.c

// HTTP 任务
#define HTTP_STACKSIZE 4096
extern void httpTaskFxn (UARg arg0、UARg arg1);
Task_StructhttpTaskStruct;
char httpStack[HTTP_STACKSIZE];

int main (void){
...
Task_Params_init (&httpTaskParams);
httpTaskParams.STACKSIZE = HTTP_STACKSIZE;
httpTaskParams.stack =&httpTaskStack;
httpTaskParams.priority = 3;
Task_construct(&httpTaskStruct,(Task_Functr)httpTaskFxn,&httpTaskParams,NULL);
...
} 

它在这里停止:

void httpTaskFxn (uint32_t arg0、uint32_t arg1)
{

RET = HTTPCLI_CONNECT (&CLI、(struct sockaddr *)&addr、0、NULL);//此行崩溃
如果(ret < 0){
printError ("httpTask: connect failed"、ret);
}


} 

/*
=== Hwi_exHandler ===
//
void Hwi_exHandler (UINT * exstack、UINT LR)
{
Hwi_module->exACTIVe[0]= true;

/*如果没有插入异常处理程序,请在此处旋转*/
while (Hwi_excHandlerFunc == NULL ){
;
}

Hwi_exHandlerFunc (exstack、LR);
} 

是否不允许使用 Task_construct()启动此函数?

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

    您好、Simon、

    您使用的是哪种软件? 如果您使用的是 SimpleLink MSP432E4 SDK、是否有原因不使用 POSIX API、如示例所示?

    根据您提供的代码、在调用 HTTPCli_connect 之前、我看不到正在调用任何 API 来初始化 TCP/IP 堆栈

    如果你想在 netIPAddrHook 被调用前调用 HTTP 任务、那么你还需要确保只有在获得 IP 地址后才调用 HTTPCL_CONNECT。

    请参阅最新 SimpleLink MSP432E4 SDK 中提供的 HttpGet 示例(./examples/rtos/MSP_EXP432E401Y/ns/httpget)、该 SDK 可在 以下位置找到:www.ti.com/.../SIMPLELINK-MSP432-SDK

    谢谢、
    SAI

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

    我尝试了 Task_sleep、并锁定了 httpTaskFxn()、直到网络启动。

    问题仅在于我如何开始执行此任务。

    示例:

    如果我注释掉这些行、一切都将按预期工作。

    /*
    Task_Params_init (&httpTaskParams);
    httpTaskParams.STACKSIZE = HTTP_STACKSIZE;
    httpTaskParams.stack =&httpTaskStack;
    httpTaskParams.priority = 3;
    Task_construction (&httpTaskStruct,(Task_FuncPtr) httpTaskFxn、&httpTaskParams、NULL);
    *

    如果我注释掉以下行、要使用 Task_construction 函数、我会遇到错误。

    taskHandle = TaskCreate (httpTaskFxn、NULL、1、HTTP_STACKSIZE、0、 0、0);
    如果(!taskHandle){
    // netOpenHook:无法创建 httpTask 线程
    display_printf (display、0、0、"无法创建 httpTask 线程");
    while (1);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Simon、

    正如我在上一篇文章中所述、您使用的 API 与 SimpleLink MSP432E4 SDK 中提供的示例不同。

    您能回答我在上一个帖子中提出的一些问题吗? 我希望他们能帮助我们了解您的起点、并努力提供帮助。

    我找到了以下 e2e 帖子,其中讨论了 task_create()和 task_construct()之间的区别。 希望这能解决您的问题。
    e2e.ti.com/.../529453

    请告诉我们您为什么要在 netIPAddrHook 之外创建 HTTP 任务?

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

    我想创建所有任务、稍后我决定应该运行哪个任务。

    我不知道我使用的 API 有什么问题?

    我创建了3个任务、其中2个任务工作得非常好、因此第三个任务必须有问题。

    // MBUS 任务
    #define MBUS_STACKSIZE 512
    extern void mbusTaskFxn (UARg arg0、UARg arg1);
    Task_StructmbusTaskStruct;
    char mbusTaskStackarg1 [MBUS_void mcksig];
    
    // Worker 任务
    #define worker_STACK_STACK_512
    n、http//fig_workTaskFig_http//void
    
    
    
    
    
    任务组;http//fig_workTaskFig_workTaskFig_http//fig/httpsig/httpsig_workTask_workTaskFig/httpsig/httpsig/httpsig_workTask_workTaskFig/httpsig/httpsig/httpsig/httpsig_workTask_workTaskFx_x_workTaskFig_ig/httpsig/httpsig/httpsig/httpsig/httpsig/https
    
    
    
    
    
    Task_Params mbusTaskParams;
    Task_Params workerTaskParams;
    Task_Params httpTaskParams;
    
    
    
    //任务1,工作!
    Task_Params_init (&workerTaskParams);
    workerTaskParams.STACKSIZE = worker_STACKSIZE;
    workerTaskParams.stack =&workerTaskStack;
    workerTaskParams.priority = 2;
    Task_construct(&workerTaskStruct,(Task_Functr )workerTaskFxn,&workerTaskParams,NULL );
    
    //任务2, 很不错!
    /*构造写入器/读取器任务线程*/
    Task_Params_init (&mbusTaskParams);
    mbusTaskParams.STACKSIZE = MBUS_STACKSIZE;
    mbusTaskParams.stack =&mbusTaskStack;
    mbusTaskParams.priority = 1;
    Task_construct(&mbusTaskStruct,(Task_Functr )mbusTaskFxn,&mbusTaskParams,NULL );
    
    
    //任务3, 无法正常工作、并导致 RTOS 崩溃
    Task_Params_init (&httpTaskParams);
    httpTaskParams.STACKSIZE = HTTP_STACKSIZE;
    httpTaskParams.stack =&httpTaskStack;
    httpTaskParams.priority = 3;
    Task_construction (&httpTaskStruct,(Task_FuncPtr) httpTaskFxn、&httpTaskParams、NULL);
    

    // HTTP 任务函数包含10秒的睡眠时间,这足以获取 IP 地址。
    
    
    void httpTaskFxn (uint32_t arg0、uint32_t arg1)
    {
    bool MoreFlag = false;
    字符数据[64];
    内转台;
    int len;
    struct sockaddr_in addr;
    
    
    Task_sleep (10000);
    Display_printf (display、0、0、"HTTPTask");
    
    
    
    HTTPCLI_StructCLI;
    HTTPCli_Field field[5]={
    { field_name_host、HOSTNAME}、
    { field_name_user_agent、user_agent }、
    {field_name_content_type、content_type}、
    {field_name_content_length、"10"}、
    { NULL,NULL }
    };
    
    display_printf (display、0、0、"向'%s'发送 HTTP GET 请求\n"、
    主机名);
    
    HTTPCLI_construct(&CLI);
    
    HTTPCLI_setRequestFields(&CLI);
    
    RET = HTTPCli_initSockAddr ((struct sockaddr *)&addr、HOSTNAME、0);
    如果(ret < 0){
    printError ("httpTask:地址解析失败"、ret);
    }
    
    RET = HTTPCLI_CONNECT (&CLI、(struct sockaddr *)&addr、0、NULL);
    如果(ret < 0){
    printError ("httpTask: connect failed"、ret);
    }
    
    RET = HTTPCLI_sendRequest (&CLI、POST、Request_URI、false);
    如果(ret < 0){
    printError ("httpTask: send failed"、ret);
    }
    
    memset (data、'a'、sizeof (data));
    HTTPCLI_sendBinaryData (&CLI、(uint8_t *)&data、sizeof (data));
    
    
    RET = HTTPCLI_getResponseStatus (&CLI);
    if (ret!= HTTP_OK){
    printError ("httpTask:无法获取状态"、ret);
    }
    
    display_printf (display、0、0、"HTTP 响应状态代码:%d\n"、ret);
    
    RET = HTTPCli_getResponseField (&CLI、data、sizeof (data)、&moreFlag);
    if (ret!= HTTPCLI_FIELD_ID_END){
    printError ("httpTask: Response field processing failed",ret);
    }
    
    
    Len = 0;
    执行{
    RET = HTTPCli_readResponseBody (&CLI、data、sizeof (data)、&moreFlag);
    如果(ret < 0){
    printError ("httpTask: Response body processing failed"、ret);
    } 否则{
    display_printf (display、0、0、"%s"、data);
    }
    
    len += ret;
    } while (moreFlag);
    
    display_printf (display、0、0、"接收到的有效载荷%d 字节\n"、len);
    
    
    HTTPCLI_DISCONNECT (&CLI);
    HTTPCL_析 构(&CLI);
    
    } 

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

    您好、Simon、

    在创建任务时、您似乎使用了两种不同的前颈项、这可能会导致您的代码按不同的顺序执行。 尝试更改:

    httpTaskParams.priority = 1; 

    这样、创建任务的两种方法都为其提供相同的优先级。

    谢谢、
    Gerardo