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.

[参考译文] 编译器/TM4C1294KCPDT:VMT 损坏?

Guru**** 2561060 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/896507/compiler-tm4c1294kcpdt-vmt-corruption

器件型号:TM4C1294KCPDT

工具/软件:TI C/C++编译器

您好!

我有一个复杂的项目、最初是用 C++为 TM4C123F MCU 设计的、也被移植到 TM4C1294 MCU。 现在、我遇到了非常严重的问题:

当我运行代码时、我看到其中一个对象的行为如 VMT 损坏、因此当我调试对该对象的函数的调用时、我会看到该调用属于另一个函数。

以下是该项目的详细信息:

1.我有独立于应用程序的内核库,构建为静态库,其中声明了抽象基类 JCApp,并且此类具有虚拟函数:

JCApp 类:公共 EvtTarget、公共 GUI
{

(笑声)

公共:
虚拟空 DefaultConfig(){}
虚拟空 Init()= 0;

(笑声)

};

2.我有应用程序库、bill 作为静态库、其中源自 JCApp 的应用程序类声明:

ASMApp 类:公共 JCApp
{

(笑声)

void DefaultConfig();

(笑声)

公共:

(笑声)

void Init();



。} 

3.在框架工程中,我有一些其他对象,在构造函数内创建和访问 ASMApp 对象:

SummaryApp::SummaryApp (选择 bool)
{

(笑声)

对于(i = 0;i < nApps;i++)
{
(笑声)

apps[i]=新的 ASMApp (真);
}

(笑声)

if ((NewSign!= CONF.AppSms)||(newSize!= CONF.AppTotSize))
{
对于(i = 0;i < nApps;i++)
{
apps[i]->DefaultConfig();
}



。}



。} 

在调试过程中,我在"Apps[i]->DefaultConfig();"行上执行步骤,当我进入时,我意外地进入 Init()函数。  

我曾尝试将此调用替换为"Apps[i]->Init();"、当我使用 ASMApp 的其他功能时。

因此、看起来 VMT 已损坏。

TM4C123F MCU 上的相同代码工作正常。 两个端口中的工具链都是 ti-cgt-arm_20.2.0.LTS

有人可以帮助解决这个问题吗? 谢谢!

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

    当您正常运行代码时、代码是否正常运行?  如果是、这可能是编译器优化的情况、因此难以调试代码。

    [引用 user="Oleg Kobrin"]在调试过程中,我在"Apps[i]->DefaultConfig();"行上执行步骤,当我步入时,我会意外地进入 Init()函数。  [/报价]

    DefaultConfig 是否调用 Init?  如果 Init 被内联、则调试时可能会出现这种情况。

    谢谢、此致、

    乔治

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

    针对所有项目关闭优化。

    DefaultConfig 不调用 Init。

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

    其他信息:

    此问题存在于从 JCApp 派生的每个类中。

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

    不幸的是,我只看到一条前进的道路。  这是为了向我发送 CCS 项目、以便我重现问题。  和其他人一样、我在家工作。  我没有任何要试验的 TM4C 系统、但我有一个不同的系统、其中 CPU 是 ARM Cortex-M4F。  因此、我有合理的机会重现此问题。

    若要创建项目 zip 文件、请按照文章 共享项目中的说明进行操作。  如果您不愿意将其附加到论坛帖子中、欢迎您将其私下发送给我。  将鼠标悬停在我的屏幕名称或头像上。 将弹出一个框。 单击 发送私人邮件。 在出现的消息撰写界面中,使用回形针图标附加 zip 文件。  

    谢谢、此致、

    乔治

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

    谢谢!

    我认为更好的方法:当我在家办公时、远程在办公室计算机上、我可以授予您 TeamViewer 访问此计算机的权限、在该计算机中、所有项目都在 CCS 中打开、并且设备与 XDS100连接并正常工作。 此系统为全天候运行、因此您可以随时访问它。

    下面是有关项目的简短摘要:

    1、残桩。  

    • JC2_Kernel 是一个内核库、其中定义了 JCApp 类。 标头位于"include/kernel"目录中、实现位于"kernel"目录中。
    • JC2_HPLC_SimpleApps、JC2_HPLC_SDS、JC2_HPLC_CD512、JC2_HPLC_ECD2000、JC2_HPLC_ASM 是应用库、每个库至少定义一个类、源自 JC2App。 SimpleApps 具有额外的抽象类 SimpleApp、源自 JCApp。
    • JC2_HPLC 是一个框架项目、用于构建最终可执行文件。 它还具有静态对象创建文件 static_objects.cpp 以确保创建顺序。 应用程序对象从此文件中使用 AppFactory 对象创建。

    2.定位问题。

    当前器件配置为运行 DFCSApp 应用。 在 DFCSApp 构造函数中设置断点并重新启动设备(因为在 main()之前调用该构造函数)将捕获断点。 进入 initconfig()调用,然后单步执行直到 DefaultConfig()调用并单步执行。 很遗憾,您将进入 DFCSApp::Init()。  

    临时将 DefaultConfig()替换为 JCApp 的任何其他成员函数将显示相同的行为:您将进入不同的函数。

    我将在私人消息中为您发送 TeamViewer 登录名和密码。

    谢谢你。

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

    遗憾的是、TI 采取的安全措施阻止了我安装 TeamViewer。

    我可能仍然需要获取 CCS 项目。 我的职责是收集一个测试案例、以简洁的方式重现问题。 然后、我提交一份错误报告、供开发团队调查。 它们通常在编译器工具受调试器控制的情况下执行问题源文件的构建。 这使他们能够找到根本原因并修复它。 要点:问题项目不能远程定位。

    谢谢、此致、

    乔治

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

    无线。 太糟糕了。 如果没有硬件、则发现问题过于全面。 即使您在家工作、您也无法使用 TeamViewer? 也许我们可以使用任何其他远程除名访问? 也就是说,我可以通过某个隧道授予 RDP 访问权限?

    我将尝试向您发送一个项目(实际上、多个项目)。 最简单的方法是将 git 访问权限传递到存储库、但我需要联系我的管理人员以请求提供访问权限。

    我的希望是今晚这个问题会被某种程度的安慰,但让我们等到明天晚上(今天,你的早晨)。 无论如何都谢谢。

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

    其他一些需要考虑的事情...

    确保堆栈没有溢出、并且堆没有用尽。 让它们尽可能大、看看这是否有用。  我怀疑其中任何一项都是问题的根本原因。 但是、如果您愿意尝试一下、我将不胜感激。

    考虑其他一些错误可能会导致虚拟表被覆盖。  这很难赶上。  虚拟表位于.const 段中。  在执行期间、.const 段中的任何内容都不应更改。  因此、请在程序加载后立即尝试捕获副本、在出现问题后、确保它没有更改。

    谢谢、此致、

    乔治

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

    你好!

    堆和堆栈是巨大的 ehough、甚至不用于10%。

    .const 段位于闪存中、无法更改。 无论如何、这看起来虚拟表不会完全损坏、而是只是偏移(我想是一个字)、再说一次、问题不会在 TM4C123F MCU 上重现、而是在 TM4C1294 MCU 上重现。

    不同 MCU 的构建配置存在很大差异:

    • 不同的时钟初始化和引脚映射;
    • 添加了用于 TM4C1294的 lwIP 和用于 TCP 的协议链路层。

    下面是压缩的项目:

    e2e.ti.com/.../HPLC.zip.txt

    JC2_HPLC 项目中的构建配置为"IP_Conv"。

    顺便说一下、我们激活了 TeamViewer 帐户并激活了商业订阅、我将向您发送一封包含登录名和密码的私人邮件、以便您可以使用它连接计算机。

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

    感谢您提交项目。  我在构建它时遇到了很多问题。  我在某种程度上忽略了我需要将构建配置更改为 IP_Conv.  在我这么做之后、它会构建良好。  为此、我深表歉意。

    但是、我没有运行它的硬件。  一位同事也这样做、但他现在不再有空了。  我将在星期一开始讨论。

    谢谢、此致、

    乔治

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

    谢谢!

    但是、由于电路板是我们的设计、因此我认为在没有某些补丁的情况下、项目不会仅在某些 EVM 上运行。 在此处连接远程信息处理系统。

    e2e.ti.com/.../_10041A041B042104_-105-550-001-_1F043B04300442043004_-_43043F044004300432043B044F044E044904350433043E04_-_3C043E04340443043B044F04_-_4104_-ethernet.pdf.txt

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

    还有一件事-如何重现问题。

    1.您将需要一个 python3来运行我附加的简单程序。 此外、您还需要使用"pip install pyserial"命令在 python 中安装 pyserial 模块。

    2.根据您使用的 python、windows 或 cygwin 生成、您需要按如下方式修补 run.py 文件:在设备管理器中加载项目创建后、确定电路板创建的 COM 端口;编辑代码:

    返回序列(
    port='/dev/ttyS6、
    波特率=19200、
    奇偶校验=奇偶校验无、
    stopbits=stopbits_one、
    字节大小= EIGHTBITS、
    xonxoff=错误、
    timeout=15、
    rtscts=False、
    dsrdtr=False
    )
    

    并替换 port='...' 使用 COMx 进行 Windows 编译、或使用/dev/ttySn 进行 cygwin 编译、其中 n = COM 端口号- 1。

    3.从 CCS 中的 JC2_HPLC_SimpleApps 项目中打开 DFCSApp.cpp 文件,并在 initconfig()处设置断点;在 DFCSApp 构造函数中调用。

    4.从命令行运行"python3 run.py"、并等待"Enter bytes:"提示。 输入"050011"并按 ENTER 键、然后输入"13"并按 ENTER 键。 器件将重新启动、断点将命中。 进入 initconfig(),然后单步执行直到 DefaultConfig()调用。 单步执行,如果存在问题,您将进入 Init()而不是 DefaultConfig()。

    e2e.ti.com/.../configurator.zip.txt

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

    关于这个问题的进一步对话是通过私人信息进行的。  事实证明、问题是在构建库子项目之一时未能预定义预处理器符号。

    谢谢、此致、

    乔治