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:如何找出挂起的原因?

Guru**** 2614895 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/769476/rtos-how-to-find-out-the-cause-of-the-hang-up

Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

有2个任务。 每个任务都分配了一个500字节的堆栈。  我特意在一个任务中声明一个1000字节的数组。 在调试器中、我进入静态 void loader_exit (void)、并存在驻留。

如何在没有调试器的情况下了解出现故障的任务以及程序为什么会进入静态 void loader_exit (void)?

我的板上有 LED。

我可以使 LED 闪烁。 我可以使 Morse 代码闪烁。 例如、如果任务1发生故障、则长时间闪烁1、如果任务2发生故障、则闪烁2个短脉冲。

从您的代码中了解我中止会遇到什么崩溃?

PS CCS6、编译器 TI v16.6.0.STS、SYS/BIOS 6.53.2000、TI-RTOS 2.16.0.08[2.16.1.14]、F28M35H52C1、 ARM Cortex-M3

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定我是否理解您的目标。 您是否在不使用 CCS 调试器的情况下尝试调试实际故障或开发调试故障的技术?

    您描述失败的原因似乎是您在栈深仅为500字节的任务函数中定义了一个1000字节的本地缓冲区。 这将导致堆栈溢出、这可能会通过在 RAM 中的堆栈下方的对象上划线而导致不整洁的崩溃、或者在内核的任务调度程序在任务切换期间可以更清晰地检测到它。 在后一种情况下,会产生错误并调用 abort()。 在前一种情况下、可能会发生任何情况。

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

    我是否在不使用 CCS 调试器的情况下尝试调试实际崩溃? 我的程序挂起在实际板中。 为什么? 崩溃很少。 我正在尝试找出它。 也许我会进入 void abort()。 为了弄清这一点、我特意对堆栈进行了过度填充。 如何在没有 CSS 的情况下找到,我是否会遇到 abort ()?

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

    您可以通过执行以下操作将 Error_Raise ()挂钩函数添加到应用程序中:

    将此文件添加到.cfg 文件中:

    VAR 错误= xdc.useModule("xdc.runtime.Error");
    Error.raiseHook ="&myErrorHook";
    

    在 C 代码中添加"myErrorHook"函数、例如:  

    #include 
    #include 
    
    Task_handle 任务;
    
    /*
    === myErrorHook ======
    */
    void myErrorHook (Error_Block * EB)
    {
    任务= Task_self ();/*获取当前正在运行的任务的句柄*/
    
    /*将任务与已知任务句柄进行比较*/
    if (task =abcTask) blink (1);
    if (task =xyzTask) blink (2);
    
    。} 

    如果应用程序通过标准 Error_Raise ()调用崩溃、则在跳转到中止之前将调用'myErrorHook'。 在该函数中、您可以根据需要执行任何碰撞分析、并使用闪烁的 LED 或您可以使用的其他任何机制来传递结果。

    Alan

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

    感谢您的回复。

    1) 1)什么是"abcTask"?

    2) 2)我使用函数 Task_construct()创建任务。 我找不到有关此方法的说明。

           2.1这种方法的描述在哪里?

           2.2如何找到此方法的描述? 分步执行。 例如

    -打开网站 TI.com

    -在查找字段中键入"Task_construct"。 按"Enter"键

    -...... 接下来如何进行?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    3) 3)如果我溢出堆栈、我最终会进入 myErrorHook()。 如果我调用 assert (0)、我不会进入 myErrorHook ()、我会立即进入 void loader_exit ()。 至于 assert(0),以获取 myErrorHook()? 因为没有调试器来了解断言发生在哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)我使用"abcTask"和"xyzTask"来引用任务句柄符号的名称。 我希望您将这些名称替换为任务句柄的名称。

    2) 2)此链接可能有助于解释 Task_construct():

       

    下面是指向任务模块 doxygen 的链接。 Task_construct()是列表中描述的第一个函数。

       

    3) assert()是运行时支持库函数,不调用 Error_raiseHook。 我不知道这一点,但您可以使用 atexit()添加您自己的 exit 函数,该函数将在 assert 线程内调用 loader_exit()的过程中调用。 如果这不起作用,您可以提供自己的 assert()实现,该实现可以执行您需要执行的任何操作。

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

    1) 1)再次询问-什么是"abcTask"? 您能不能用英文解释、而用 C/C++解释吗?

    代码示例:

    #define TASKSTACKSIZE 1024
    
    #define TASK_WS (TASKSTACKSIZE)
    
    Task_Structurt taskStruct;
    
    Char taskStack_1[TASKSTACKSIZE];
    
    Char SKStack_2[TASTACKSIZE];
    
    void myTask (UARG arg0、UARG)
    
    {
    
    for (;)
    
    
    
    }{
    
    
    
    
    
    
    void / int 代码}{/void}
    
    Task_Params taskParams;
    
    Task_Params_init (&taskParams);
    
    taskParams.STACKSIZE = task_WS;
    taskParams.stack =&taskStack_1;
    Task_constructure(&task0Struct,(Task_Functr)mainTask,&taskParams, NULL);
    
    taskParams.STACKSIZE = task_WS;
    taskParams.stack =&taskStack_2;
    Task_construct(&task0Struct,(Task_Functr) mainTask、&taskParams、NULL);
    
    BIOS_start();
    
    }
    
    
    Task_handle 任务;
    
    /*
    === myErrorHook ======
    //
    空 myErrorHook (Error_Block *EB)
    {
    task = Task_self ();//获取当前正在运行的任务的句柄*/
    
    /*将任务与已知任务句柄进行比较*/
    if (task =abcTask) blink (1);//什么是 abcTask?
    如果(task =xyzTask) blink (2);//abcTask xyzTask?
    
    。} 

    myErrorHook ()如何理解哪个任务失败? 在任务1或任务2中?

    2) 2)您是否关注此链接? 您是否在此处看到了此方法的描述? 我在该链接中找不到 Task_construct()的说明。

    2.1这种方法的描述在哪里?

    例如:下面是 xTaskCreate ()方法的说明。

    2.2如何找到此方法的描述? 分步执行。 例如 xTaskCreate()

    -打开网站 freertos.org

    -转至链接: FreeRTOS-> API 参考->任务 创建->xTaskCreate()

    -打开网站 freertos.org

    -转至链接: FreeRTOS-> API 参考->PDF 参考 手册

    -下载并打开FreeRTOS V10.0.0参考手册

    FreeRTOS V10.0.0参考手册中 ,您可以找到 xTaskCreate()的描述。 请参阅 capter 2.6 (第34页)

    在哪里是 Task_construct()的描述? 请逐步执行。 查找您的产品的文档时遇到问题。 我想了解如何自行查找必要的文档、而不是麻烦您。

    提前感谢。

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

    1) 1)再次询问-什么是"abcTask"? 您能不能用英文解释、而用 C/C++解释吗?

    代码示例:

    #define TASKSTACKSIZE 1024

    #define TASK_WS (TASKSTACKSIZE)

    Task_StructtaskStruct;

    char taskStack_1[TASKSTACKSIZE];

    char taskStack_2[TASKSTACKSIZE];

    无效 myTask (UARg arg0、UARg arg1)



    for (;;)



    //任何代码






    int main (空)

    Task_Params taskParams;

    Task_Params_init (&taskParams);

    taskParams.STACKSIZE = task_WS;
    taskParams.stack =&taskStack_1;
    Task_construct(&task0Struct,(Task_FuncPtr) mainTask、&taskParams、NULL);

    taskParams.STACKSIZE = task_WS;
    taskParams.stack =&taskStack_2;
    Task_construct(&task0Struct,(Task_FuncPtr) mainTask、&taskParams、NULL);

    BIOS_start();




    Task_Handle 任务;

    /*
    *==== myErrorHook ======
    *
    空 myErrorHook (Error_Block *EB)

    任务= Task_self ();/*获取当前正在运行的任务的句柄*/

    /*将任务与已知任务句柄进行比较*/
    如果(task =abcTask) blink (1);//什么是 abcTask?
    如果(task =xyzTask) blink (2);//abcTask xyzTask?
    (笑声)


    myErrorHook ()如何理解哪个任务失败? 在任务1或任务2中?


    2) 2)您是否关注此链接? 您是否在此处看到了此方法的描述? 我在该链接中找不到 Task_construct()的说明。

    2.1这种方法的描述在哪里?

    例如:下面是 xTaskCreate ()方法 freertos.org/a00125.html 的说明

    2.2如何查找 Task_construct()方法的说明? 分步执行。 例如 xTaskCreate()

    -打开网站 freertos.org

    -转至链接:FreeRTOS -> API 参考->任务创建->xTaskCreate()



    -打开网站 freertos.org

    -转至链接:FreeRTOS -> API 参考->PDF 参考手册

    -下载并打开 FreeRTOS V10.0.0参考手册

    在 FreeRTOS V10.0.0参考手册中,您可以找到 xTaskCreate()的描述。 请参阅 capter 2.6 (第34页)


    在哪里是 Task_construct()的描述? 请逐步执行。 查找您的产品的文档时遇到问题。 我想了解如何自行查找必要的文档、而不是麻烦您。

    提前感谢。

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

    [引用 user="Juvf Anisimov]1)我再次问-什么是"abcTask"? 您能不能用英文解释、而用 C/C++解释吗?
    [/报价]

      为   您为 TI-RTOS BIOS 定义的每个任务结构输入一个任务唯一名称、每个任务都需要此名称、或者(函数) 共享执行 时隙。

    Task_construct() 是 TI-RTOS BIOS 语法,也许与 FreeRTOS 语法不同, 在这个论坛中似乎不受支持。

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

    您好!

    此页面显示了"创建"TI-RTOS 对象的3种方法之间的差异:1).cfg 文件中的静态变量、2)通过创建 API、以及3)通过构建 API。

    请注意、它们是您的代码中的一个错误。 您不能重复使用同一个任务结构。 每个结构都需要自己的唯一存储器。

    Task_Structtask1Struct;

    Task_Structtask2Struct;

    (笑声)

    taskParams.STACKSIZE = task_WS;

    taskParams.stack =&taskStack_1;

    Task_construct(&task1Struct,(Task_Functr) mainTask、&taskParams、NULL);

    taskParams.STACKSIZE = task_WS;

    taskParams.stack =&taskStack_2;

    Task_construct(&task2Struct,(Task_FuncPtr) mainTask、&taskParams、NULL);

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

    Juvf、

    很抱歉、我为任务模块 doxygen 提供了错误的链接。 我在原始帖子中更正了它、下面也是正确的链接:

    software-dl.ti.com/.../Task.html

    在您提供的代码片段中、您将把相同的 task0Structt 传递给两个 Task_con构 调用。 每个任务都必须有自己唯一的 Task_Struct. 此外、您还将提供'mainTask'作为两个任务的任务函数。 这是故意的吗? 我看不到'myTask'被用在任何一个 Task_construct()调用中。

    这里、在 C 代码中、是我所说的 abcTask 和 xyzTask (我已经使用了示例中的一些代码来说明):

    void abcTaskFunc (UArg0、UArgarg1)
    {
    对于(::){
    ;
    }
    }
    
    void xyzTaskFunc (UArg0、UArgarg1)
    {
    对于(::){
    ;
    }
    }
    
    Task_StructureabcTaskStruct, xyzTaskStruct;//这些是两个唯一的任务结构*/
    Task_handle abcTask, xyzTask;//这些是指向这两个任务结构的指针*/
    Task_Params 任务结构;
    
    Task_Params_init(&taskParams);&ParaskStack_params(&TaskStack_params)
    ;
    
    任务= Task_parstack_stack.&params=Task.stack.stack.&params = task_params (task_funcPtr) abctaFunc、_taskParams、NULL);
    abctaTask = Task_handle (&abctaTaskStruct);//初始化 abctaTaskStruct*的指针 taskParams.staCkSIZE
    
    = task_WS;
    &taskStack_2;
    Task_constructure(&zTaskFuncTaskParams.straktr、zTaskFuncTaskParams.straktr null);
    xyzTask = Task_handle (&xyzTaskStruct);//初始化指向 xyzTaskStruct*的指针
    


    (笑声)

    在 myErrorHook()中,对 Task_self()的调用返回指向当前运行的任务的指针。 将该指针与两个任务指针 abcTask 和 xyzTask 进行比较、以确定在出现错误时正在运行这两个任务中的哪一个。

    我希望这种解释能帮助您理解。

    Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是有意的。 SPI 上有两个通信通道。 硬件两个不同的 SPI。 我为一个任务编写代码。 当我在参数中创建任务时、我会将硬件 SPI 编号传递给任务。 接下来,我使用 myTask()创建两个任务。 每个任务都提供自己的 SPI。 每个 SPI 任务将消息和事件发送到其他任务、并接收来自其他任务的消息和事件。

    SPI 后面的 PS 是一个外部 TCP 控制器。

    感谢您提供真正的链接。

    感谢您的 C 语言。 "abcTask = Task_handle (&abcTaskStruct);"-对我来说更清楚。

    如何查找其他 TI-RTOS 模块的文档? 例如、对于
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过此链接、您可以获得 ti.sysbios.KNL 软件包中所有模块的 doxygen:

    software-dl.ti.com/.../package.html

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

    我无法确定一项糟糕的任务。

    代码示例:

    #define task_WS 1024
    
    Task_Structtask结构1; 
    Task_Structtask结构2;
    Task_Structt taskStruct3 结构任务 Stack_1[task_WS]; Char taskStack_2[task_WS];
    char taskStack_3[task_WS];
    Task_handle TaskHandle1、mainTaskHandle、TaskHandle2; void myTask (UArg0、UArgarg1) { for (;) { //任何代码 }

    空任务1 (UARg arg0、UARg arg1)

    for (;;)
    {//任何代码}

    空任务2 (UARg arg0、UARg arg1)

       for (;;)
       {//任何代码}
          char text[1500];//有意堆栈溢出
          sprintf (text、"hello TI-RTOS);
          System_printf (text);
          system_flush();
          Task_sleep (2000);
       }
    } int main (void) { Task_Params taskParams; Task_Params_init (&taskParams); taskParams.STACKSIZE = task_WS; taskParams.stack =&taskStack_1; Task_construct(&taskStruct1、(Task_funcPtr) myTask、&taskParams、NULL); TaskHandle1 = Task_handle (&taskStruct1);

    taskParams.stack =&taskStack_2; Task_construct(&taskStruct2、(Task_Functr) Task1、&taskParams、NULL);
    TaskHandle2 = Task_handle (&taskStruct2);

    taskParams.stack =&taskStack_3;
    Task_construct(&taskStruct3、(Task_Functr) task2、&taskParams、NULL);
    TaskHandle3 = Task_handle (&taskStruct3);
    BIOS_start(); } Task_handle 任务; // *=== myErrorHook ====== // 空 myErrorHook (Error_Block *EB) { task = Task_self ();//获取当前正在运行的任务的句柄*/ /*将任务与已知任务句柄进行比较*/ if (task == TaskHandle1) blink (1); if (task == TaskHandle2) blink (2);
    if (task =TaskHandle3) blink (3); ... }

    在任务2中、我特意通过分配1500字节字符数组来溢出栈。 我希望 TI-RTOS 在任务2中生成堆栈溢出错误。 但是 myErrorHook ()通过 Blink (1)运行分支。 为什么?
    如果我在调试器下运行此类代码、那么在 RTOS 对象视图中、我会看到任务1和任务2处于被阻止状态、而 myTask 处于运行状态。 为什么?
    如何确定堆栈溢出是什么任务?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了您定义的任务之外、还有一个内部定义的空闲任务、当所有其他任务被阻止时、该任务将运行。

    此任务的句柄可以通过以下方式获得:

    Task_handle idleTask;

    idleTask = Task_getIdleTask();

    然后、您可以将"idleTask"添加到要在错误挂钩函数中与进行比较的任务句柄列表中。

    Alan

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

    什么是产品? 任务2中发生错误。 我进入了 myErrorHook()。 在 myErrorHook ()中,我得到了 myTask 句柄。 为什么? 空闲句柄将如何帮助?

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

    我误解了你的问题。 我想您说您在您的错误挂钩中找不到任何匹配的任务句柄。

    我想我现在理解这个问题了。

    切换 Task_self()返回下一个任务的指针后,任务堆栈溢出测试在任务调度程序内发生。

    然后、该测试检查先前的任务对象(在本例中、带有人为创建的堆栈溢出的任务)、然后检查新的任务对象。

    出现错误时、切换到下一个任务已发生。 因此,Task_self()将返回即将进入的任务,而不是栈溢出的任务。

    要增强错误挂钩处理程序以捕获此特殊情况、请尝试添加以下代码:

    空 myErrorHook (Error_Block * EB)
    {
    ERROR_ID Eid = Error_getid (EB);
    ERROR_Data *数据= Error_getData (EB);//获取错误块 args *
    
    /*检查任务堆栈溢出错误特殊情况*/
    if (Eid = Task_E_stackOverflow){
    /*有问题的任务句柄在错误块的 arg 0中*/
    任务= DATA->arg[0];
    }
    否则{
    /*执行您以前所做的操作*/
    任务= Task_self ();
    
    。}
    

    Alan

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

    我的 myErrorHook()

    空 myErrorHook (Error_Block *EB)


    ERROR_ID Eid = Error_getid (EB);
    ERROR_Data *数据= Error_getData (EB);//获取错误块 args *
    Task_Handle 任务;
    int i;

    /*检查任务堆栈溢出错误特殊情况*/
    任务= DATA->arg[0];
    int codeError = 1;
    if (Eid = Task_E_stackOverflow)

    /*有问题的任务句柄在错误块的 arg 0中*/
    代码错误= 2;

    否则、如果(Eid = Task_E_deleteNotAllded)

    代码错误= 3;

    否则、如果(Eid = Task_E_spOutOfBounds)//

    代码错误= 4;

    闪烁(codeError );


    我进入 myErrorHook 并闪烁1次。 为什么? 我发现任务中只能出现3个错误:Task_E_deleteNotAllded、Task_E_spOutOfBounds、Task_E_stackOverflow。 还有什么问题呢? 在哪里可以看到 Error_getid()方法返回值的所有变体的列表?

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

    您好/

    可以帮帮我吗? 在哪里可以看到 Error_getid()方法返回值的所有变体的列表?

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

    在应用程序中包含的每个 ti/sysBIOS/*.h 文件的底部,将有一组#defines 将 API 短名称映射到其实际长名称等效项。 在这些#defines 中、搜索此模式:'_E_'。 这些将是该模块提出的各种错误代码。

    例如、在 Task.h 中、您会发现这些带有'_E_'的#defines:

    #define Task_E_stackOverflow ti_SysBIOS_KNL_Task_E_stackOverflow
    #define Task_E_spOutOfBounds ti_SysBIOS_KNL_Task_E_spOutOfBounds
    #define Task_E_deleteNotAllowed ti_SysBIOS_KNL_Task_E_deleteNotAllowed

    此外、如果您搜索'_a_'、这些#defines 是该模块提出的断言代码。

    #define Task_a_badThreadType ti_SysBIOS_KNL_Task_a_badThreadType
    #define Task_a_badTaskState ti_sysbios_KNL_Task_a_badTaskState
    #define Task_A_noPendElem ti_SysBIOS_KNL_Task_a_noPendElem
    #define Task_a_taskDisabled ti_sysbios_KNL_Task_a_taskDisabled
    #define Task_a_badPriority ti_SysBIOS_KNL_Task_a_badPriority
    #define Task_a_badTimeout ti_sysbios_KNL_Task_a_badTimeout
    #define Task_a_badinity Affti_SysBIOS_KNL_Task_a_badAffinity
    #define Task_a_sleepTaskDisabled ti_SysBIOS_KNL_Task_a_sleepTaskDisabled
    #define Task_a_invalidCoreId ti_SYSBIOS_KNL_Task_a_invalidCoreId

    同样的情况也适用于 Semaphore.h、Hwi、h 等

    Alan

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

    你好。

    我进入了 myErrorHook()。

    INT getIdError (Error_ID Eid)

       int codeError = 1;

       if (Eid = Task_E_stackOverflow)
          代码错误= 2;
       否则、如果(Eid = Task_E_deleteNotAllded)
          代码错误= 3;
       否则、如果(Eid = Task_E_spOutOfBounds)
          代码错误= 4;
       否则、如果(Eid = Task_a_badThreadType)
          代码错误= 5;
       否则、如果(Eid = Task_a_badTaskState)
          代码错误= 6;
       否则、如果(Eid = Task_a_noPendElem)
          代码错误= 7;
       否则、如果(Eid = Task_a_taskDisabled)
          代码错误= 8;
       否则、如果(Eid = Task_a_badPriority)
          代码错误= 9;
       否则、如果(Eid = Task_a_badTimeout)
          codeError = 10;
       否则、如果(Eid = Task_a_badAffinity)
          代码错误= 11;
       否则、如果(Eid =Task_a_sleepTaskDisabled)
          代码错误= 12;
       否则、如果(Eid = Task_a_invalidCoreId)
          代码错误= 13;

       返回代码错误;


    空 myErrorHook (Error_Block *EB)


       ERROR_ID Eid = Error_getid (EB);
       ERROR_Data *数据= Error_getData (EB);//获取错误块 args *
       Task_handle task =(Task_handle)(data->arg[0]);
       int i;

       int codeError = getIdError (Eid);
       if (codeError = 1)
          任务= Task_self ();

       //if (task = abcTask) blink (1);
       INT taskError = 1;
       if (task =w5100TaskHandle)
          任务错误= 2;
       否则 if (task == mainTaskHandle)
          任务错误= 3;
       否则 if (task == driveTaskHandle)
          任务错误= 4;
       否则 if (task =stateTaskHandle)
          任务错误= 5;
       while (1)
       {
          for (i = 0;i < taskError;i++)
          {
             引信 F();
             LED (1、LED_RED);
             引信 F();
             LED (1、LED_OFF);
          }
          for (i = 0;i < codeError;i++)
          {
             引信 F();
             LED (1、LED_GREEN);
             引信 F();
             LED (1、LED_OFF);
          }
          对于(I = 0;I < 6;I++)
             引信 F();
       }

    我无法识别错误。 当我到达 myErrorHook ()时,我会得到 Eid 错误 ID。

    在我尝试识别错误的 int getIdError (Error_ID Eid)方法内部。 方法 getIdError()返回1。

    也就是说、该方法无法在_a_和_E_之间找到错误 ID。 在哪里以及如何获得可返回 Error_getid ()的错误列表?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如我在前一个答复中所说的那样、"同样适用于 Semaphore.h、Hwi、h 等。"

    您的应用中使用的每个模块都将在其相应的 Mod.h 文件中定义其错误代码。 就像 Task.h

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

    好的、Alan。 我进入 myErrorHook (Error_Block * EB)。 检查错误。

    ERROR_ID Eid = Error_getid (EB);

    ERROR_Getid ()返回276299776 (十六进制0x10780000)。 这种感觉是什么?

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

    查看 debug\configPkg\package\config\ _ .c 文件。 您将看到此处定义的所有错误(*._E_*)和断言(*._A_*)以及这些值。 例如、我有来自 TM4C 器件的空项目、这是生成的文件

    C:\workspace\testing\empty_EK_TM4C1294XL_TI_TivaTM4C1294NCPDT\Debug\configPkg\package\cg\empty_pem4f.c

    /* E_spOutOfBounds__C */
    #pragma DATA_SECTION (ti_SYSBIOS_KNL_Task_E_spOutOfBounds__C、".const:ti_SYSBIOS_KNL_Task_E_spOutOfBounds__C");
    __far__ const CT_ti_SysBIOS_KNL_Task_E_spOutOfBounds ti_SysBIOS_KNL_Task_E_spOutOfBounds__C =(((XDC_runtime _Error_ID) 3917)<< 16 | 0);


    因此、对于0x10780000、请查找4216 (它是0x10780000顶部16位的十进制数)。 注意:重建之间的实际值可能不同。

    请注意、错误实际上更多地是一种调试功能。 一般而言,许多错误是不可恢复的。 例如:Task_E_stackOverflow。 这是很好的了解、但您在运行时不会对此做任何事情。 您将看到这种情况、确定哪个线程、增加堆栈大小并重新构建。 您不会在运行时删除任务并使用更大的堆栈再次创建任务...堆栈溢出导致的损坏可能无法恢复。

    Todd