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/TM4C1292NCPDT:堆栈错误

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/651705/re-rtos-tm4c1292ncpdt-stack-error

您好!

在生成计时器中断后、我将按如下方式动态创建一个任务、

ERROR_Block EB;

Task_Handle 模块状态 LedHandle;

Task_Params 模块状态 LedHandleParams;

ERROR_INIT (&EB);

Task_Params_init (&ModuleStatusLedHandleParams);

ModuleStatusLedHandleParams.STACKSIZE = 4 * DEFAULT_STACK_SIZE;

ModuleStatusLedHandleParams.priority = task_MAX_Priority;

ModuleStatusLedHandleParams.arg0 = IO_MBWDT_MODE;

ModuleStatusLedHandleParams.arg1 =空;

模数状态 LedHandle =

Task_create ((Task_FuncPtr)模块状态已解、ModuleStatusLedHandleParams、&EB);

发生超时时时时、控制台中将显示如下所示、

此错误的原因可能是什么?

在 timerISRHandler 内部、我是否需要清除计时器中断? 如果需要清除中断、可以使用什么 API?

要重置计时器计数寄存器,能否使用以下代码?

HWREG (TIMER5_base + TIMER_O_TAV)=0;

此致

Sandra

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

    我将此主题从 e2e.ti.com/.../651080中拆分 、因为这是一个新问题

    llEnter 是 NDK 函数。 看起来您正在尝试从只能从任务调用的 Hwi 或 Swi 调用 NDK API。

    关于计时器、如果您在内核中使用计时器模块、则无需执行任何 driverlib 调用。

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

    您好 Todd、

    我是 Sandra 团队的一员。

    在该任务上下文中、我们尚未访问任何 NDK API。 我们只是尝试删除动态创建的任务并重新创建动态任务。 如果我注释任务、创建它的运行成功、并且我们能够获得周期模式中的定时器 ISR。  

    NDK 和我们使用的 TIMER5之间是否存在计时器冲突? TI RTOS 使用的默认计时器是什么?

    此外、还请告诉我用于清除计时器寄存器值以防止超时的 API?

    此致

    巴拉

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

    您好 Todd、

    对此进行了任何更新?

    巴拉

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

    很抱歉、我读取第一个帖子的速度太快。 您能否查看此主题以了解其是否解答了您的问题 :e2e.ti.com/.../449914

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

    您好 Todd、

    我已经浏览过您提供的链接、我认为问题不是动态任务创建。

    在这里、我用不同的方法尝试并重新创建了问题。 示例代码附在此处。

    我在尝试使用周期定时器模块的同时使用了 tcpEcho 示例项目、以在5秒内生成一次中断。 一旦定时器中断发生、定时器 ISR 例程会将事件发布到挂起的任务。 只要未连接以太网电缆、它就能正常工作。 连接以太网电缆时、执行会中断。

    当以太网从执行开始连接时、作为第一个定时器中断本身、执行终止。

    定时器模块和 NDK 之间有什么关系?

    我在此附上了代码和快照。

    e2e.ti.com/.../tcpEcho.zip

    此致

    巴拉

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

    您好、Bala、

    问题是您使用的是 printf。 printf 有两个问题。

    1.它会实时中断,因为当'\n\'或 printf 缓冲区(CIO)已满时,就会遇到断点。 CCS 读取缓冲区的内容并将其显示在控制台中。 注意:这适用于 TI 编译器。 GCC 略有不同、但实时问题相同。

    printf 使用大量堆栈。 它还会跳转并保持数据块不变。 因此、您感到很不幸。 看起来您有足够的堆栈、但它确实破坏了堆栈上方的东西... NDK 缓冲区。 注意:ROV 和运行时堆栈检查在堆栈顶部查找0xEBEBE 值。 您对 printf 的调用在栈上放置了一些内容、但在栈上方跳转(并在顶部留下大量0xEBEBE)。 我将默认堆栈提升为1024、这里是您的应用程序(减去使用 DHCP 而不是静态 IP)任务视图。

    那么、您能否在不使用 printf 的情况下尝试此操作(或将 printf 更改为 System_printf)。

    Todd

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

    您好 Todd、

    您的建议。 删除 printf 后、其解决方案解决了示例 tcp_echo 项目中的问题。 但是、如果我对我的应用代码应用相同的东西、问题仍然存在。

    在我的应用程序代码中、我没有任何 printf 或 System_printf 语句。  

    计时器已在 cfg 文件中创建、并在其中一个任务中启动。 这是我的计时器 ISR,然后是任务代码。

    空 WatchdogISRHandler()

       EVENT_POST (Event_WDT_Timeout、Event_ID_00);

     

    空 WatchdogTaskFxn()

       while (1)

       {
            /*等待在计时器超时中发布的事件*/
            EVENT_PEND (Event_WDT_Timeout、Event_ID_00、Event_ID_NONE、BIOS_WAIT_FOREVE);

            /*应用程序代码*/

       }

    在这里、我的应用程序代码是一些数学运算、并将事件或邮箱发布到其他应用程序任务。

    只要我在 ISR 处理程序函数中对事件发布进行注释、我的应用程序代码就能完美运行。 如果我添加事件后、我的应用程序由于任务溢出而终止。

    我已将任务堆栈大小最大值设置为10 KB、但仍会出现问题。

    查找以下调试跟踪和系统终止时的控制台错误消息。

    在 ROV 中找到以下详细任务视图。 函数名称和任务名称是隐藏的 NDA 目的。

    计时器 ROV 视图

    如果我在  WatchdogTaskFxn()内添加任何断点, 则它永远不会到达。 在到达该函数本身 Event_pend()之前它本身的终止。  

    您能不能帮助我、这种行为的原因是什么。

    此致

    巴拉

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

    观察任务有4096、而不是10K。 这里可能会发生两种不同的情况。

    1.你真的在吹堆叠。 在这种情况下、您需要增加它。

    2.堆栈顶损坏。

    对于这两种情况、您能否在观察任务的堆栈基础上设置硬件观察点。 使其在读取或写入时中断。 然后运行应用程序。 请注意、如果您是动态创建堆栈或从.cint00运行并静态创建任务、则当堆栈设置为0xBEBEBE 时、您可能会遇到断点。 只需继续目标。 当堆栈顶部发生更改时、您可以确定它是上面的#1还是#2。 如果它是#2、您可以看到谁正在破坏堆栈。

    Todd

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

    您好 Todd、

    我已通过增加堆栈大小进行检查。 但它没有帮助。 我在这里附上我的拆卸视图。 我在堆栈基础上放置一个断点并运行。 它不会到达这一点。 堆栈基地址为0x20019400。

    我删除了看门狗任务并尝试运行。 然后、堆栈也会在具有相同堆栈基础的下一个任务中溢出。 在删除看门狗任务后、我将连接下面的控制台和 ROV。

    然后、我从应用程序中删除了计时器模块的启动和停止代码。 然后它工作正常。 下面随附了计时器模块配置、

    下面给出了用于启动计时器的代码、

    此条件最初不为真。 然后、添加此代码也会导致堆栈溢出、然后再执行任何操作。 出现此问题的原因可能是什么? 帮助我摆脱这种情况。

    谢谢、此致

    Sandra

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

    Sandra、

    不要放置硬件断点。 放置一个硬件观察点。 例如、我有一个简单的项目。 这是存储器浏览器中其中一个任务的堆栈。

    请注意、栈(基址为0x200206c0)将向基址向上增长(如蓝色箭头所示)。 我还展示了堆栈之前的内容。 一个常见的问题是该块溢出。 因此、务必查看堆栈之前的内容。

    要创建硬件观察点、请右键单击 Breakpoint 视图中的"new breakpoint"箭头、然后选择 Hard watchpoint。

    然后添加堆栈基址、并在写入时使其中断

    现在运行应用程序。 如前所述、如果堆栈尚未初始化、则写入0xbebebe 时将触发观察点...只需继续即可。

    一旦堆栈基址被修改(损坏或溢出)、观察点将被触发。 只需查看您所在的位置。 例如、我添加了一些破坏堆栈顶部的代码。  

    执行"*ptr = 0x1234"代码后,监视点停止目标。 现在很容易看到损坏的发生位置。

    Todd

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

    非常感谢您提供的支持。 我可以在我的代码中找到该问题、并解决了该问题。

    谢谢、此致
    Sandra