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.

[参考译文] TM4C1290NCPDT:尽管堆空间足够、GateMutex 上仍阻止任务(优先级4)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1465577/tm4c1290ncpdt-task-priority-4-blocked-on-gatemutex-despite-sufficient-heap-space

器件型号:TM4C1290NCPDT

工具与软件:

您好!

我正在对我的 TI-RTOS 应用程序中的一个关键问题进行故障排除。 以下是详细信息:
任务名称:操作员任务
任务优先级:4
任务用途:每50ms 馈送一次看门狗。
观察到的问题:GateMutex 上的运算符任务保持阻止、未能按预期执行、从而导致看门狗无法馈送。

RTOS 对象视图(ROV)中的观察结果:

GateMutex (0x200377fc)上阻止了操作员任务。


2.堆内存:
总大小:0x10000
总可用大小:0x7550
最大空闲块:0x74C0
•堆内存看起来足够了。


3.调用堆栈(附加的屏幕截图):
•在尝试分配内存时、操作员任务出现阻塞。
•该故障似乎与 std :: string 操作有关 Var_Presenter ,特别是在 std :: replace 操作期间。



4.代码上下文(附加的屏幕截图):
•阻塞点对应于 Var_Presenter :: Update()函数中 std :: string 对象的 std :: replace 运算。


所采取的调试步骤:
1.已验证 HeapMem ROV 模块中的堆内存—可用空间和最大的可用块似乎足够了。
2.检查调用栈,这表明内存分配问题,可能是由于 std ::字符串操作 涉及操作字符串,用于在 Var_Presenter :: Update ()函数中的显示更新。
3.我们看了 HeapTrack 以查看任务的时间安排,对任何基于操作员任务的信息都没有帮助。

请求帮助:
在 TI-RTOS 中调试或解决 GateMutex 和堆分配故障时、是否有具体建议?


非常感谢您提供任何见解或指导!

谢谢!
Mahima

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

    我们可以考虑`std::replacement`的替代函数、但我们并不期望该函数实际会更改字符。 无论如何、似乎仍然有大量的堆内存可供使用。

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

    您好!

     我不太确定问题是什么。 这可能是由于优先级倒置。 例如、低优先级和高优先级线程共享一个互斥体。 低优先级首先获得互斥体、但它被一组"中等"优先级线程抢先。 在这种情况下、高优先级线程会延迟更长的时间-从而使低优先级和高优先级任务之间的优先级反转。  

     我想你需要的是在使用互斥量首先设定优先级的两个线程中。 如果可以、请参阅以下示例。  

    gateKey = GateMutexPri_enter (MutexPri);//进入 Gate

    CNT +=1;                                //受保护的访问

    GateMutexPri_leave (gateMutexPri. gatekey) // Exit Gate

    这就是说、当高优先级线程运行(或抢先于低优先级线程)时、BIOS 将强制低优先级线程具有与高优先级线程相同的优先级、从而允许低优先级线程完成其访问、然后 BIOS 将在 调用 GateMutexPri_leave ()时将低优先级线程降级到其原始优先级。  

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

    感谢你对优先级倒置和 GateMutexPri 用法的建议。 遗憾的是、这种方法并未解决该问题、因为导致阻塞的互斥量并非由我们的应用程序显式管理。

    相关的 GateMutex 是 TI-RTOS 中 malloc 实现的一部分,并且在 Var_Presenter :: Update ()中的动态内存分配调用( std :: string 操作)期间会发生阻塞。 这意味着互斥量由 TI-RTOS 堆实现在内部进行处理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    •阻塞点对应于 Var_Presenter ::Update()函数中 std :: string 对象的 std :: replace 运算。
     [报价]

    我以前没有使用过您以前使用的格式中的"replace"函数。 您似乎在尝试用空格替换 NULL 字符? 下面是互联网上的一个示例。 您能尝试一些使用非 NULL 字符或简单字符的实验吗、还有 Mutex 问题吗? 例如、将"A"替换为"B"、这样可以吗?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // C++ Program to show, how to use
    // string::replace() for replacing the
    // multiple characters with single repeated
    // character
    #include <bits/stdc++.h>
    using namespace std;
    int main() {
    string str = "Hey World";
    // Defining the range
    auto first = str.begin();
    auto last = str.begin() + 3;
    // Replaces firts 3 character of
    // str with 3 copies of '!'
    str.replace(first, last, 3, '!');
    cout << str << endl;
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    感谢您分享到目前为止的见解。 我想提供我们的最新调查结果和进一步观察结果。

    最新动态:

    在阅读了有关 std :: replacement 导致问题的使用案例的建议后,我们完全删除了该代码行。 但是、故障仍然存在、现在已移至代码中的不同点。 具体来说、故障现在发生在 Format_Value_As_Decimal ()函数中、如下所示。


    代码上下文:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void Format_Value_As_Decimal(std::string &msg, bool editing, double val) {
    std::stringstream ss;
    std::string sign;
    uint8_t digits = Get_Display_Digits();
    bool is_negative = false;
    if (val < 0) {
    val *= (-1);
    is_negative = true;
    }
    if (m_consts.Precision) {
    digits++;
    }
    // Add the sign indicator
    if (m_consts.Is_Signed() && (is_negative == false)) {
    sign = "+";
    } else if (m_consts.Is_Signed() && (is_negative == true)) {
    sign = "-";
    } else {
    sign = " ";
    }
    // Set fill character based on editing state
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


    观察结果:
    1.执行上述函数时会发生故障,特别是在涉及 std :: stringstream 和 std :: string 的动态内存分配操作期间。
    2.堆内存详细信息:
    •HeapMem ROV 视图显示堆有足够的空间。
    总可用大小:0x7550
    最大空闲块:0x74C0
    •堆空闲列表指示某些块在使用中、而其他块可用、这表明没有完全耗尽内存。
    3.调用栈详细信息:
    •调用堆栈在存储器分配期间指向 TI-RTOS malloc 实施内的争用问题、特别是在处理 std::stringstream 和 std::string 操作时。
    4.也在 Heapmem ->威客,我们注意到有自由块和耦合在使用块,这确实 表明空间是自由的

    问题:
    1.即使堆有可用的可用块并且似乎有足够的空间、根本问题是否仍与内存碎片有关?
    2.由于现在在代码的不同部分中观察到该故障(在删除 std::replate 后)、这是否意味着 TI-RTOS 堆/malloc 实现中存在更深的争用或碎片问题?
    c. TI-RTOS 框架中是否有可建议使用的工具或技术来更详细地了解运行时的堆分段或争用?


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

    您好!

     我不知道你这篇文章是否会有所帮助。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/743426/rtos-tm4c129xnczad-understanding-heapmem-sysmem?tisearch=e2e-sitesearch&keymatch=HeapMem#

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

    您好!

    感谢您的回复以及在 HeapMem 和 SysMem 上共享相关帖子。
    虽然该信息提供了有关堆存储器管理方式的有用见解、但我需要一种结构化方法、从看门狗故障开始系统地调试该问题、然后返回根本原因。

    现在,我知道:
    1.看门狗失败、表示操作员任务(优先级4)未按预期执行。
    2.在一个由 TI-RTOS 的 malloc 实施在内部使用的 GateMutex 上、运算符任务被阻止。
    3.堆有足够的可用空间,但任务仍然被阻止。

    应从何处开始调试?

    我希望从看门狗断点开始、然后回溯到根本原因。
    请分享您对此进行调试所需执行的所有步骤。
    此外:  
    当看门狗跳闸时、我的第一步应该是什么?
    •哪些工具或调试方法可以帮助我确定任务未运行的原因?
    •如何跟踪 TI-RTOS 中的互斥对象争用或堆问题?
    RTOS 调度或内存分配中是否存在可能导致此行为的常见缺陷?

    对于从何处开始、我非常感谢您提供任何指导。 请告诉我哪些信息将有助于提供。



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

    您好!

     请按 Todd 参阅此常见问题解答。在"Debugging"下、您可以找到各种资源来调试 TI-RTOS 工程。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/840835/faq-where-can-i-find-ti-rtos-or-sys-bios-faqs/3109064#3109064

    Todd 在下面进行的关于调试 TI-RTOS 项目的演示中提供了一些有用的技巧。 请查看 Memory Allocation 下面的内容、其中可以启用 Heaptrack 来调试动态内存分配问题。

    e2e.ti.com/.../TIRTOS_5F00_CCSDebugging.pdf