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.

[参考译文] TMS320C6657:使用来自 SWI 的非默认析构函数来初始化静态对象

Guru**** 2457760 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1483286/tms320c6657-instantiation-of-static-object-with-non-default-destructor-from-swi

器件型号:TMS320C6657
Thread 中讨论的其他器件:SYSBIOS

工具与软件:

以下是我们的代码的简化版本、但仍表现出同样的奇怪行为:

class MyClass{
  public:
    int data;
    ~MyClass(){}
};

void funcCalledFromSwiContext(void) {
  static MyClass myObject;
}

如果首次从 SWI 上下文调用、上述函数始终会崩溃、但如果从正常任务调用、则不会崩溃!

在 SWI 上下文中使用静态变量或类是否存在任何限制?

任何建议或类似的经验都是非常感谢!

使用的编译器 C6000_8.3.3

操作系统: SysBIOS

语言:C++

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

    在进行更多汇编级调试后、我们发现以下内容:

      当使用非默认析构函数初始化静态变量时、编译器会插入代码、将析构函数添加到在退出时以相反的构造顺序调用的"析构函数列表"中、这是根据 CPP 标准预期的情况、导致以下问题的原因是将该析构函数添加到列表中受正常互斥(ti_sysbios_gate_gateMutex_enter)保护、当然不允许从软件中断调用!

    我希望 dtor_list.c 中的"TI_atexit"函数直接或间接使用与调用上下文匹配的正确选通实现、但显然不能这样做。  

    即使意味着在程序退出时禁用调用静态析构函数、是否也可以解决该问题?

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

    您好 Assil、

    感谢您解释这个问题并提供调试分析。 我们没有建议的任何权变措施。

    但是、您最好的指南是以下文档:

    https://www.ti.com/lit/ug/spru198k/spru198k.pdf

    https://www.ti.com/lit/ug/sprui04f/sprui04f.pdf 

    谢谢。