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.

[参考译文] TM4C1294KCPDT:以太网上的多个任务提供故障 ISR 或看门狗复位

Guru**** 2538950 points
Other Parts Discussed in Thread: TM4C1294KCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/844545/tm4c1294kcpdt-multiple-tasks-on-ethernet-gives-fault-isr-or-watchdog-reset

器件型号:TM4C1294KCPDT

大家好、

我使用的是 Tiva tm4c1294kcpdt。 在我的应用程序中,以太网接口上有多个任务:将数据记录到服务器、用于调试的 telnet 服务器、用于访问内存卡的 ftpd 服务器等  

如果我尝试同时处理所有任务、则器件将进入故障 ISR 或为我提供看门狗中断。

我在 10msec SysTick ISR 中调用 lwIPTimer(),所有这些任务都写入 while (1)循环中。

另外一点,当系统通过看门狗或'sysctlreset()' API 函数进行复位时,我的代码会在 lwip_init()函数中挂起

是否有人可以建议我如何系统地处理 lwip/以太网 ISR 并解决此问题?

请提供任何帮助。

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

    您好!

     您当前的堆栈大小和堆大小是多少? 是否可以尝试增加堆栈大小和堆大小(如果使用动态内存)? 它会产生影响吗? 很多时候、堆栈溢出导致故障跳闸。 故障异常可能会使您转至 FaultISR(),它是在 startup_ccs.c 文件中定义的硬故障的默认异常处理程序。 如果您没有编写自己的例程,FaultISR()只是在 while (1)循环中旋转。 由于它在 while 循环中旋转、如果您在应用程序中配置看门狗、它将在稍后使看门狗复位。

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

    [引用 USER="URVI SHA"]如果我尝试同时处理所有任务,则器件将进入故障 ISR 或为我提供看门狗中断。[/QUERPLECTION]

    供应商的 Charles 很好地强调、"堆栈和/或堆不充分"是"常见的嫌疑人"。    实际上-这提供了快速/轻松的、边界性的无痛"修复"。

    如果问题仍然存在, 并为了满足你提出的"程序"解决的要求,我谨 建议:

    • 仔细/系统地-删除(仅一个)多个任务-然后重新运行程序
    • 从不会(几乎从不会)"重新移动"的第一个任务证明"问题的原因"-因此(几乎)可以确定您的"问题"仍然存在
    • 重新启用该任务(最初删除的任务)并删除另一个任务-再次观察"问题"是否已解决
    • 重复此操作、"选择性移除和测试/观察"-直到执行了多个任务中的每个/每个任务

    描述的程序旨在确定 "一个或甚至几个"任务的标识-这"导致您的问题"   此方法使用"消除流程"系统地"探测"任务失败。

    有一种更快速的方法来实现上述内容:

    • 将您的任务划分为"可重复"的相等部分-并禁用/删除"其中一个部分"
    • 运行程序,以便测试问题的存在情况
    • 如果问题未发生-重复测试-但仅在"完成"任务半部分后。"   (即工作的任务一半现在被禁用、"未测试的任务一半"现在被测试。)

    通过这种方式-以下分析结果:

    • 如果两个"任务半部分"都通过(无故障)-则 Charles 的"堆栈/堆"建议会升高(甚至更高)
    • 如果个和只有一个"任务一半"失败-问题( 可能) 包含在"该一半的任务清单之一"中
    • 如果两个"任务半部分"都失败-"堆/堆"可能再次证明"有罪"
    • 在1或2个"任务一半"故障的情况下-采用先前(上述详细)的程序-确定(可能)有问题的任务

    事实证明、"安排每个任务的调用/排序顺序"通常很有帮助-这可以检测 "等效灵敏度" 、通常(不)被视为"任务故障"。   (还有其他系统方法可以"消除"敏感性影响(如果证明存在问题)-以及...)

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

    您好!

    您可以尝试修改 lwipplib.c 、为  每个协议添加额外的调用计时器、同时(1)处理程序、将 计时器添加到 lwipopts.h、 相同的 GPTM 调用中断处理程序。 如果 Pbuf 池损坏、可能会怀疑 tiva129c_hal.c HAL 存在 DMA 描述符崩溃、将 dog 设置为 barking。

     不可恢复的 DMA I/O 错误被视为 通过 CCS 调试的永久 DMARIS RxBuffer Full 标志。  最坏情况下 FBI 会涉及检查 sysctl 以确定是否存在致命总线错误。 检查 NVIC 寄存  器是否存在总线错误类型精确或非精确、指示存储器地址有效或路由(未知)。

    已知修复!

    #if no_SYS
    静态空
    lwIPServiceTimers (void)
    {
    //
    //为第一台 ETH_Client_1主机提供服务。
    //
    #if host_TMR_INTERVAL1
    if ((g_ui32LocalTimer - g_ui32HostTimer1)>= HOST_TMR_INTERVAL1)
    {
    G_ui32HostTimer1 = g_ui32LocalTimer;
    lwIPHostTimerHandler1();
    
    }
    #endif
    //
    //为第二台 ETH_Client_2主机提供服务。
    //
    #if host_TMR_INTERVAL2
    if ((g_ui32LocalTimer - g_ui32HostTimer2)>= HOST_TMR_INTERVAL2)
    {
    G_ui32HostTimer2 = g_ui32LocalTimer;
    lwIPHostTimerHandler2();
    
    
    }
    #endif 

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

    您好、Urvi、

     我没有听到你的反馈。 阅读您的其他帖子、我希望您已经超越了这一棘手问题。 我希望 CB1和 BP101的建议对您有所帮助。 我现在要关闭这个线程。 如果硬故障未解决、您可以更新此帖子并提供其他信息。