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.
工具与软件:
您好!
我正在对我的 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"、这样可以吗?
Fullscreen123456789101112131415161718192021// 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 rangeauto 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// 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; }
感谢您分享到目前为止的见解。 我想提供我们的最新调查结果和进一步观察结果。
最新动态:
在阅读了有关 std :: replacement 导致问题的使用案例的建议后,我们完全删除了该代码行。 但是、故障仍然存在、现在已移至代码中的不同点。 具体来说、故障现在发生在 Format_Value_As_Decimal ()函数中、如下所示。
代码上下文:
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 char fill = ' '; if (editing) { fill = '0'; } // Build the string with left-padded zeros ss << sign << std::fixed << std::setw(digits) << std::setfill(fill); ss << std::fixed << std::setprecision(m_consts.Precision) << val; // Copy string back msg = ss.str(); }
您好!
感谢您的回复以及在 HeapMem 和 SysMem 上共享相关帖子。
虽然该信息提供了有关堆存储器管理方式的有用见解、但我需要一种结构化方法、从看门狗故障开始系统地调试该问题、然后返回根本原因。
现在,我知道:
1.看门狗失败、表示操作员任务(优先级4)未按预期执行。
2.在一个由 TI-RTOS 的 malloc 实施在内部使用的 GateMutex 上、运算符任务被阻止。
3.堆有足够的可用空间,但任务仍然被阻止。
应从何处开始调试?
我希望从看门狗断点开始、然后回溯到根本原因。
请分享您对此进行调试所需执行的所有步骤。
此外:
•当看门狗跳闸时、我的第一步应该是什么?
•哪些工具或调试方法可以帮助我确定任务未运行的原因?
•如何跟踪 TI-RTOS 中的互斥对象争用或堆问题?
•RTOS 调度或内存分配中是否存在可能导致此行为的常见缺陷?
对于从何处开始、我非常感谢您提供任何指导。 请告诉我哪些信息将有助于提供。
您好!
请按 Todd 参阅此常见问题解答。在"Debugging"下、您可以找到各种资源来调试 TI-RTOS 工程。
Todd 在下面进行的关于调试 TI-RTOS 项目的演示中提供了一些有用的技巧。 请查看 Memory Allocation 下面的内容、其中可以启用 Heaptrack 来调试动态内存分配问题。