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/CC3220:无效任务内部状态:挂起元件地址0x0不在任务#39;s 堆栈内

Guru**** 2579465 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/717428/rtos-cc3220-invalid-task-internal-state-pend-element-address-0x0-is-not-within-the-task-s-stack

器件型号:CC3220

工具/软件:TI-RTOS

我一直在搜索相关帖子以解决此问题、但我尚未找到解决方案。 我们在随机运行任务/系统的一段时间后得到此错误。 我们无法看到何时生成错误的模式。 错误的地址与我们的一个信标相关联。 这个信号量在我们的一个定时器中断内设定。 它用于向要运行的另一个任务发出信号。 请参阅随附的图像以供参考。 我们需要尽快解决方案。

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

    看起来有一个例外(ROV->BIOS->Scan for Errors 的第二行)。 您能看一下 ROV->Hwi->Exception 吗? 希望那里有更多信息。

    供参考。。。此编写/视频包括关于异常处理的讨论: training.ti.com/debugging-common-application-issues-ti-rtos

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

    我已附上 HWI 信息的屏幕截图。

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

    我假设 timer.c 和 Timer_Task.c 文件是您的文件。 他们在干什么? 您是否将其插入时钟模块? 我猜它是使用 NULL 指针调用 SEM_post。 您可以对此进行检查吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    timer.c 来自 ti RTOS (\tirtos_cc32xx_2_16_01_14\products\BIOS_6_45_02_31\packages/ti\SysBIOS\posix\timer.c)、而 Timer_Task.c 是我的文件。 在 Timer_Task.c 内、我有一个被调用2ms 的计时器中断。 我有多种计数器在该中断的2ms 节拍上递增。 我有两个计数器、一旦它们达到特定阈值、它们将发布 SEM 以指示要运行的任务。 与其他任务相比、这些任务只需以较低的速率运行。 由于计时器中断是软件中断、我们认为我们可以在这里使用信标。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    struct ti_SysBIOS_KNL_Semaphore_Structt{
    TI_SYSBIOS_KNL_Event_Handle __f0;
    XDC_UINT __F1;
    TI_SYSBIOS_KNL_Semaphore_Mode __f2;
    易失性 XDC_UINT16 __f3;
    TI_SYSBIOS_KNL_Queue_Struct__F4;
    xdc_runtime_Types_CordAddr __name;
    }; 



    您引用了什么空指针?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的澄清。 我查看的是 SimpleLink SDK 产品、行号没有意义。

    您可以附加 Timer_Task.c 吗?

    我猜 OP_TimerInt()调用 SEM_POST 时的 SEM_t 无效(例如 NULL)。 您能否使用某种类型的面包屑(例如 System_printf)来查看发生异常时 SEM_t 是什么?

    是否已在.cfg 文件中启用断言(BIOS.sertsEnabled = true;)? 这有助于捕获无效的 API 使用。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将 Timer_Task.c 作为私人消息发送给您。 我将尝试添加一个打印、以查看指针是否为 NULL。 我没有启用断言、但我将尝试在配置了断言的情况下运行。 此错误可能需要三个小时才能发生、因此我会随时通知您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    继续离线工作...发布以缓解论坛警察的情绪:)将更新解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    结果表明、内核并未完全从嵌套中断中解压、因为未发送的中断被放置到矢量表中。

    这是客户代码的问题

        uartHandle = UART_OPEN (Board_UART1、uartParams);

      UARTIntRegister (UARTA1_base、customerFxn);//问题!

    最后一行是改写内核的发送程序函数,该函数将调用 TI 驱动程序的 UART 函数(UARTCC32XX_hwiIntFxn)。  

    下面是问题的发生方式

    UART ISR 置为有效(优先级224)并运行发送程序的存根函数的 customerFxn ...no。

      NWP 中断触发并运行调度程序存根、该存根调用_SlDrvRxIrqHandler。 注意:这会取代 UART ISR、因为 NWP 具有更高的优先级(32)

      _SlDrvRxIrqHandler 执行其任务并返回到调度程序存根。 存根看到它是嵌套的(通过 HW 寄存器)、因此不会对整个调度程序进行彻底的解除

    UART ISR 完成其业务并退出(不会解除调度员的缠绕)。 任务处理已锁定

    任务调用 semaphore_pend 并获取断言(或者如果断言被禁用…进入杂草)。

    有几种不同的方法可以解决此问题、但我们使用了以下方法来最大限度地减少对现有代码的影响:

      uartHandle = UART_OPEN (Board_UART1、uartParams); 
       KEY = Hwi_disable(); 
       hwiHandle = Hwi_getHandle (INT_UARTA1); 
       Hwi_setFunc (hwiHandle、customerFxn、0); 
       Hwi_restore (key); 

    现在、该功能仍会派送并正确松开。 注意:UART1上的 UART_READ/WRITE 未在代码中完成。 客户 Fxn 正在做它所需要的一切。 其他选项在长期运行中更清晰(按照设计使用 UART_READ/WRITE、编写您自己的 UART 驱动程序等)。

    Todd