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.

[参考译文] CCS:CCS:启动期间,C++(g++)程序在Mallo_r中崩溃

Guru**** 2538950 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/571408/ccs-ccs-c-g-program-crash-in-mallo_r-during-startup

主题中讨论的其他部件:EnergiaMSP432P401R

工具/软件:Code Composer Studio

您好!

我正在使用CCSv7和MSP432启动板(黑色)进行C++开发。 我使用的是gcc/g++(CCS.3),它与4.9 一起提供(我检查了它是应用中心提供的最新版本)。
我还尝试了较新的编译器(g++ 6.2 .4),但没有成功。

我已将我的问题最小化到以下简单文件:

#include "msp.h"

class A {
public:
a(){}
虚拟~A(){};


A Mya;

int main(void){

返回0;}

当我在MSP432支架上运行此程序时,它会在启动代码期间立即崩溃。 我从一个新的CCS C项目开始,并将main.c重命名为main.cpp。 我还在链接器配置中添加了libstdc++.a库。 程序编译和上载时没有错误。

一些进一步的调查显示,访问无效地址(如0xD000xxxx)时,malloc_r中会发生崩溃。

有人能帮我解决这个问题吗? 我猜它与链接程序脚本有关(堆大小?) 或者在全局CTORs/DTOR的情况下,有关gcc启动代码的其他一般性问题。

由于CCS不提供“新C++项目”功能,我也不确定CCS中的一般C++支持。

Energia正在大量使用C++,奇怪的是,上述程序在Energia中运行时没有任何问题(我不能使用,因为我不需要/不需要多线程功能,这是强制性的...)。

我们非常欢迎您的帮助!

Br,Andreas

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

    由于CCS不提供“新C++项目”功能, 我也不确定CCS中的一般C++支持。

    在 MSP432上具有GCC的C++项目中,线程Global构造函数 发现CCS默认msp432p401r.lds链接器脚本中存在错误,错误地放置了堆栈,导致启动期间崩溃。

    建议您首先检查链接程序脚本是否包含与引用的线程中详细描述的相同问题。

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

    您好!

    非常感谢-错误的SP确实是问题的一部分。 我改变了
    我的链接程序脚本相应地!

    但是为了使我的程序正常工作,我在启动例程中添加了一些代码:

    void Reset_Handler(void){
    
    uINT32_t *pui32Src,*pui32Dest;
    
    //
    //将数据段初始化程序从闪存复制到SRAM。
    //
    pui32Src =&__data_load__;
    for (pui32Dest =&__data_start_; pui32Dest <&__data_end_;)
    {
    *pui32Dest++=*pui32Src++;
    }
    
    /*呼叫系统初始化例程*/
    SystemInit();
    
    /*跳至主初始化例程。 */
    _mainCRTStartup();
    }
    

    某种程度上,数据段未被初始化,必须复制到SRAM。 我在中找到了此修复程序
    以下链接(TIVA-C的报告): http://processors.wiki.ti.com/index.php/Using_GCC_with_Tiva_in_CCSv6

    我不确定链接程序脚本中是否也可以解决此问题,或者我是否可以以更优雅的方式解决此问题。
    有什么想法?

    Br,Andreas

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

    我不确定链接程序脚本中是否也可以解决此问题,或者我是否可以以更优雅的方式解决此问题。
    有什么想法吗?[/QUOT]您已以正确的方式修复了代码。 我发现我以前在 CCS 6.1 中报告过msp432_startup_CCs_gcc.c中的问题。0.0.0104万 缺少将数据段初始化程序从闪存复制到的代码

    刚在CCS MSP432P401R的CCS 7.0 .0.0.0042万 中创建了一个新项目,由CCS添加到项目中的默认startup-msp432p401r_gcc.c仍缺少 Reset_Handler()中用于将 数据段初始化程序从闪存复制到SRAM的代码。

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

    也许您还可以添加代码来初始化BSS段:

    //将数据段初始化程序从闪存复制到SRAM。
    pui32Src =&__data_load__;
    对于(pui32Dest =&__data_start_; pui32Dest <&__data_end_;){
    *pui32Dest++=*pui32Src++;
    }
    
    //在BSS段中复制零
    对于(pui32Src =&__bss_start_; pui32Src <&__bss_end_;){
    *pui32Src++=0;
    }
    

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

    不要忘记外部头盖:

    外部UINT32_t __data_load__;
    外部UINT32_t __data_start__;
    外部UINT32_t __data_end__;
    外部UINT32_t __BSS_start__;
    外部UINT32_t __BSS_END__;
    外部UINT32_t __StackTop; 

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

    \n也许您还可以添加代码来初始化BSS段:

    _mainCRTStartup() 函数 (从Reset_Handler()调用),将.BSS部分归零。 因此,不需要在 Reset_Handler()中直接将.BSS段归零。

    [STARTUP_msp432p401r_gcc.c的早期版本直接从 Reset_Handler()调用main(),因此.BSS段在 Reset_Handler()中初始化。 _mainCRTStartup()初始化.BSS段并执行其他启动代码,如在最后调用main()]之前调用全局构造函数

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

    啊好的。 所以我将取出BSS初始化的代码!

    BTW:你知道从哪里获取mainCRTStartup代码的来源吗?
    它是一个带有gcc的库,对吧?

    Br,Andreas

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

    BTW:您知道从何处获取mainCRTStartup代码的来源吗?
    它是gcc的一个库,对吗?

    我从 GCC源包中获得了mainCRTStartup代码的源代码。

    如果您使用的是GCC v.4.9 3, https://launchpad.net/gcc-arm-embedded/的4.9 /4.9 -2015-Q3-update上有源包的链接