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.

[参考译文] TM4C129XNCZAD:任务应用程序使用 TI-RTOS 卡在队列中

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos

器件型号:TM4C129XNCZAD

工具与软件:

尊敬的 专家:

我参考以下链接以尝试找出程序有什么问题。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/854484/faq-how-do-i-trace-backward-to-the-code-that-caused-an-exception-in-my-ti-rtos-app#Open_Registers_View

当前信息如下:

PC:0x000351c4
LR:0x0002A959

TI RTOS:tirtos_tivac_2_16_01_14

我们发现程序在队列中结束、 我们不知道如何找出原因。

为了解决问题的原因、我们需要提供哪些信息?

非常感谢

Ray Yang

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

    您好!

    下图显示了如何创建和发送邮箱。

    Ray Yang

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

    您好!

     你似乎在邮箱中处于挂起状态、因为你在2903行中调用了 Mailbox_pend。 它会一直等待、就像它正在等待信标一样。

     您的 Task1MessageDat 是否曾被调用? 如果您在 Task1MessageDat 中放置断点、它会在这里停止吗?  

      Task1MessageDat 的 优先级是否低于 Task11Message? 您可以更改优先级吗?如果这会产生什么影响?  

      问题是立即发生还是邮箱在一段时间后停止工作?

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

    尊敬的 Charles:

    1)我们将编译的二进制文件刻录到我们的设备中,然后测试了3个月。 8个器件经过测试、其中3个器件已崩溃。

    2) 2)不可能设置断点来查询 MCU 崩溃时的当前情况、而是将 CPU 的当前寄存器写入未初始化的 RAM 中。在 MCU 被外部 WDT 芯片复位后、CPU 会将此信息转储到 LCD、通过此方法获取 PC 和 LR 信息。

    3)当时的信息如下

    PC:0x000351c4             

    LR:0x0002A959

    ThreadType_0中发生异常                  

    名称:Task1句柄:0x3

    堆栈基址:0x20000fa8

    BFAR:0x209d0098

    堆栈大小:0x1400

    AFSR:0x00000000

    PSR:0x21000000

    UFSR:0x0000

    ICSR:0x00416803

    HFSR:0x40000000

    MMFSR:0x00

    DFSR:0x00000000

    BFSR:0x82

    MMAR:0x209d0098

    4) Task1MessageDat 与 Task11Message 之间的关系如下所示

    Task11消息(LCD_WAKEUP);                   --(a)

    空 Task11消息(MbxMsg1Type msg)

       Task1MessageDat (msg、0、0);                      --(b)  
    }


    void Task1MessageDat (MbxMsg1Type msg、uint8_t data1、uint32_t data2)     --(c)

       Mailbox1Struct curMessage;
       静态 uint8_t count = 0;

       curMessage.msgid = msg;
       curMessage.dat1 = data1;
       curMessage.dat2 = dat2;

       如果(! Mailbox_post (gMailbox1、CurMessage、BIOS_no_wait)
       {
           count++;

           如果(计数=100)
           {
               计数= 0;
           }
       }
    }

    5) 5)您是否有未发布的论坛? 有些信息因其内容而不便于在公共论坛上讨论。

    非常感谢

    Ray Yang

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

    TM4C 崩溃的频率约为每个月一次。

    Ray Yang

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

    尊敬的 Ray:

     好的。 这个问题比我原来想的要更深、更难。 在前面、您刚刚介绍了邮箱无法正常工作的情况。 这让我觉得问题出在软件开发过程中。 现在、您说的问题只会在设备运行一个月后发生。 将来、请准确地提供问题发生的方式和时间的详细信息。  

    如果您的错误日志是正确的、那么当处理器可能正在从0x209d0098进行某种类型的读取时、这是一个精确的故障。 SRAM 基址从0x20000000开始。 偏移地址为0x9d0098。 它大于10MB。 SRAM 大小仅为256KB。 处理器正在以某种方式从该非法地址读取。 PC 等于 0x000351c4。 您是否能够跟踪代码以找出接近此地址的 CPU 指令?  

    您正在进行哪种类型的测试? 您是否对器件进行了恶劣环境压力测试? 所有八个器件均使用相同的固件运行三个月。 如果是软件问题、我预计所有八个问题都有相同的问题、而且我预计问题会很快发生、而不是在3个月后发生。  

    3)当时的信息如下

    PC:0x000351c4             

    LR:0x0002A959

    ThreadType_0中发生异常                  

    名称:Task1句柄:0x3

    堆栈基址:0x20000fa8

    BFAR:0x209d0098

    堆栈大小:0x1400

    AFSR:0x00000000

    PSR:0x21000000

    UFSR:0x0000

    ICSR:0x00416803

    HFSR:0x40000000

    MMFSR:0x00

    DFSR:0x00000000

    BFSR:0x82

    MMAR:0x209d0098

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

    尊敬的 Charles:

    我很抱歉没有告诉你首先发生的事情的细节。

    1)老化试验(设备可靠性试验),在室内进行,类似于典型的实验室环境。

    2)" PC 等于0x000351c4。 您是否能够跟踪代码以找出此地址附近的 CPU 指令?"

    跟踪代码以尝试找出程序出错的位置、您的意思是"0x000351c4"吗?

    如果是、正如我在第一篇文章中所说的、PC 最终会出现在邮箱程序区域中。

    3) 3)请看一下以下图片中的1)和2)关于堆栈和堆设置。 这两个(堆栈/堆)是相同的东西还是不同的宇宙东西?


          1) 1)它们是在 ARM 链接器中设置的。
          2) 2)它们在.cfg 中设置。
            

    程序编译后生成的.map 文件显示当前堆栈大小为8192字节。

    4) 4) 让我们检查是否有足够的任务堆栈空间来处理 TI-RTOS 中的4个任务?
        从下图可以看出、堆栈峰值不会超过任务堆栈空间。

         任务堆栈是否在上述3)中占用了堆栈大小?

     


    其他信息:

    XDC 工具版本:3.32.25

    CCS 版本:8.3.0.00009

    编译器版本:T1 v18.1.4 LTS

    非常感谢

    Ray Yang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5376411 #5376411"]

    3) 3)请看一下以下图片中的1)和2)关于堆栈和堆设置。 这两个(堆栈/堆)是相同的东西还是不同的宇宙东西?


          1) 1)它们是在 ARM 链接器中设置的。
          2) 2)它们在.cfg 中设置。
            

    [报价]

    cfg 将覆盖系统堆栈的链接器设置。 系统。  

    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5376411 #5376411"]

    程序编译后生成的.map 文件显示当前堆栈大小为8192字节。

    [报价]

     8192是系统堆栈。

    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5376411 #5376411"]

    4) 4) 让我们检查是否有足够的任务堆栈空间来处理 TI-RTOS 中的4个任务?
        从下图可以看出、堆栈峰值不会超过任务堆栈空间。

         任务堆栈是否在上述3)中占用了堆栈大小?

     

    [报价]

    未超过为每个任务分配的最大堆栈。  

    您能否进行 ABA 交换测试? 你说8个中有3个会在3个月后崩溃。 这意味着其他5个板不会崩溃。 这是正确的理解吗?

    您是否可以将 MCU 从三个可疑的板之一切换为五个正常板之一、反之亦然。 这将有助于找到问题所在。

    是否全部8个电路板都运行相同的固件? 您能否确认这一点? 我之所以提出这个问题、是因为我希望在出现软件问题时、所有8个电路板的行为都相同、尤其是在运行这么长时间之后。 如果软件有问题(例如堆栈),那么它应该是一个确定的行为。  

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

    尊敬的 Charles:

    感谢您的答复、关于 ABA 测试、我们将不得不与我们的硬件工程师讨论是否可以执行测试、并继续尝试找出发生这种情况的原因。

    您是否要使用 ABA 测试来确定问题是 TM4C 还是电路板上的问题?

    如此处下图所示

    对于"Scan for errors"、问题是调试设置、CCS 实用程序软件还是代码本身?


    "你说8个中有3个会在3个月后崩溃。 这意味着其他5个板不会崩溃。 这是一个正确的理解吗?"

    "是否全部8块电路板都运行相同的固件?"

    "你怎么知道的?" 我们的器件配备了可显示最新固件版本的 LCD 显示模块。

    Ray Yang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5378845 #5378845"]

    您是否要使用 ABA 测试来确定问题是 TM4C 还是电路板上的问题?

    [报价]

    尊敬的 Ray:

     正确。 ABA 交换测试将把问题隔离到电路板或 MCU。  

    。  A-B-A  交换方法是一种简单的交叉检查测试、可确认发现的问题不是系统性问题。

    • A-B-A  交换方法
      (1)拆下可疑部件( A )。
      (2)更换可疑部件( A )、带有已知良好的组件( B )并检查原主板现在是否正常工作。
      (3)安装可疑部件( A )连接到已知良好的电路板、然后查看是否在正常电路板上出现相同的故障。

    步骤3很重要、因为它可以帮助我们排除问题是由系统问题或良好电路板上多个轻微损坏元件相互作用引起的任何可能性。

    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5378845 #5378845"]

    如此处下图所示

    对于"Scan for errors"、问题是调试设置、CCS 实用程序软件还是代码本身?

    [报价]

    我以前从未使用过"扫描错误"。 我不确定他们提供了什么信息。 在良好的设备上、执行扫描错误时会看到什么。

    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5378845 #5378845"]

    "是否全部8块电路板都运行相同的固件?"

    "你怎么知道的?" 我们的器件配备了可显示最新固件版本的 LCD 显示模块。

    [报价]

    感谢您的确认。 正如我所说的、如果所有八个电路板在运行很长时间后都运行相同固件、我希望它们会以某种方式显示相同的行为。 如果是 TI-RTOS 问题、我可能会想到某种类型的未知存储器泄漏问题。 但事实并非如此。 5个良好的设备在3个月后运行正常。 如果存在内存泄漏、则这5个应该会出现同样的情况。  

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

    新闻更新。

    在上次讨论后、我们更新了10个器件的程序、然后进行了老化测试。 运行了大约10天,其中一个设备崩溃,采用了将 CPU 寄存器转储到 LCD 的方式,我们得到了 PC、LR 和 SP 的信息,并在跟踪程序代码后,程序保持在与我第一次发布文章的代码截图相同的行号。

    在 ABA 测试方面、我们要移除采用 BGA 封装的芯片、然后将其替换为未崩溃的板、硬件工程师会觉得很难、并将其置于停止状态。


    堆栈基址:0x20000fa8

    BFAR:0x20330098

    堆栈大小:0x1400

    AFSR:0x00000000

    PSR:0x21000000

    UFSR:0x0000

    ICSR:0x00415803

    HFSR:0x40000000

    MMFSR:0x00

    DFSR:0x00000000

    BFSR:0x82

    MMAR:0x20330098

    Ray Yang

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

    尊敬的 Ray:

     对不起,我真的不知道这里出了什么问题。 我不知道为什么只有一个失败,而不是其他,当他们都运行相同的代码和受到相同的老化测试。  正如您所指出的、失败时、代码卡在同一行上。 您能做一个实验吗? 您是否可以尝试使用队列而不是邮箱? 我想您是否会看到相同的问题? 这里还有一些可能有所帮助的 TI-RTOS 项目调试链接。  

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

    尊敬的 Charles:

    感谢您的答复,我们提出了一个非常棘手的问题,给您带来了很多麻烦!

    TI E2E 论坛中是否有专门的 TI RTOS 论坛?

    谢谢你。

    Ray Yang

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

    尊敬的 Ray:

     遗憾的是、没有专门的 TI-RTOS 论坛。 我希望各种调试链接都会有所帮助。 我想您是否能够:

     -用一个简单的程序,使用邮箱,而不是你的完整的应用固件进行实验。 您会看到邮箱有任何问题吗? 我从来没有看到过 TI-RTOS 邮箱出现问题的报告。 目前、我还不能完全相信这是邮箱问题。  但是、您会报告说、每次器件崩溃时、它始终处于邮箱功能中。 这就是我建议尝试使用简单邮箱程序的原因。  

     -使用队列而不是邮箱进行实验。 您可以在 x 天后重复同样的问题吗?

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

    尊敬的 Charles:

    1)我们将尝试将邮箱更改为队列。  

    2) 2)我不是在问邮箱、我只是想知道为什么 MCU 每次都在同一个程序块中挂起。

    3) 3)我怀疑邮箱叠加在队列上。 原因是在跟踪代码时、我们看到它有来自 queue 函数的调用 Queue_get 函数、不同之处在于其属性在原子性上。


    https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/bios/sysbios/6_76_04_02/exports/bios_6_76_04_02/docs/cdoc/ti/sysbios/knl/Queue.html#get

    非常感谢

    Ray Yang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5398113 #5398113"]

    1)我们将尝试将邮箱更改为队列。  

    [报价]

    尊敬的 Ray:

     感谢您尝试进行实验。  

    [报价 userid="521643" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1403560/tm4c129xnczad-the-task-apps-are-stuck-in-the-queue-with-ti-rtos/5398113 #5398113"]

    2) 2)我不是在问邮箱、我只是想知道为什么 MCU 每次都在同一个程序块中挂起。

    [报价]

    抱歉、我无法解释为什么它只在邮箱功能上挂起、而不是其他、我也无法解释为什么只有10个设备中的一个会在运行多天之后出现故障。  

    3)我怀疑邮箱叠加在队列上。 原因是在跟踪代码时,我们看到它有来自 queue 函数的调用 Queue_get 函数,不同之处在于其属性原子性。

    感谢跟踪代码。 我知道的是、邮箱都是基于复制的、这意味着邮箱的生产者和使用者都必须为它分配内存、而对于队列、大小可以在运行时扩展和收缩。