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.

[参考译文] CODECOMPOSER:调用从 ram 运行的函数时初始化数据的问题:_SYSTEM_POST_Cinit()错误

Guru**** 2586755 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1073066/codecomposer-issue-with-initializating-data-when-calling-a-function-running-from-ram-_system_post_cinit-error

部件号:CODECOMPOSER

平台:

设备:F28379

CCS:版本:11.1.0.00011

编译器 TI v21.6.0.LTS

使用构造函数(或在运行到主数据之前初始化的任何数据)调用设置为从 RAM 运行的函数时,我遇到问题。

详细信息:

如果我有一个对象在初始化时调用 run-from -RAM-function,系统将在启动时崩溃。 由于 初始化发生在到达 main 之前,因此该函数尚未移动到 ram。 因此:出现_SYSTEM_POST_Cinit()错误。  代码按预期工作,但没有单独的运行位置。

我想说,这是意料之中的行为,但肯定是不必要的。

  1. 解决此问题的一种方法是不从 RAM 运行此功能。 如果有多个函数在执行此操作,那么跟踪这一点会有点困难。
  2. 修复此问题的另一种方法是在 memcpy 函数后执行初始化,但如果数据需要存储,则需要推入堆。 (就我而言是这样)。

我希望周围能有一个优雅的工作。 感谢您的任何指导!

示例(Psuedo)代码:

课堂演示{
私人:
国际一级;
国际 j;
公共:
Geti();
GetJ();
}
演示::Geti (){Return I;}

code_section (“RunFromRam”);
演示::GetJ(){return j;}

演示 A; //演示 A 在使用前实例化。

Const int X= A.Geti ();//按预期工作
const int Y= A.GetJ();//初始化时崩溃

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

    威廉

    很抱歉我们方的回复延迟,由于某种原因,我星期五没有看到这条线索。

    我要问其他人,但我想,处理这个问题的强力方法是在调用 cinit 之前修改 CodeStartBranch.asm 文件。  

    您必须知道本节的放置位置,然后手动(并使用 ASM 说明)将这些操作码移至所需的位置。  这对我来说听起来不是很实用,也不是很有用,但我想 把它扔在那里,同时我会研究更多。

    我将尝试使用任何更新再次回复。

    最佳
    马修

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

    你好,马修,

    谢谢你。  我希望你们在这种情况下有一个“最佳实践”,因为我想我不是唯一遇到这种情况的人。

    这可能是一个全球性问题:

    1. 使用 C++,特别是单个模块的类
    2. C++的标准实践要求在构造函数中初始化成员,事实上,这是唯一应该初始化常量成员的地方。
    3. 标准实践将所有成员设置为私有成员,并通过访问程序/突变函数(gets 和 sets)进行操作。
    4. 如果您的一个类是用于关键控制,则您希望它从 RAM 运行以获得最佳性能。
    5. 由于函数可能很多(由于#3和其他原因),因此最有效的方法是将关键类的整个 OBJ 文件设置为从 RAM 运行。
    6. 但是,执行#5也会将构造函数设置为从 ram 运行,从而导致上述问题。
    7. 由于#3意味着许多函数(现在忽略内联),白名单从 RAM 开始运行非常麻烦,容易出错。
      1. 如果这样说,将整个 obj (除构造函数(和相关的)设置为 run-from -ram (即黑名单),可能是合理的... 我尝试找到解决方案,但可以解决问题。
      2. 另一个解决方案是每个类有两个 cpp 文件,一个设置为从 ram 运行,另一个设置为默认值。 我在写这篇文章之前就开始这样做了,但我觉得这件事过于复杂了。

    供参考,这是一个调试难题;当发生此崩溃时,不会指示发生在何处,即没有要分析的堆栈帧。 我不得不从电影中逐步了解正在发生的情况,由于大多数代码都是从 Flash 中运行的,因此断点限制在周围工作并不有趣。