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.

[参考译文] TMS320F28062F:为一个阵列分配内存会中止程序

Guru**** 2540720 points
Other Parts Discussed in Thread: MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/593400/tms320f28062f-memory-allocation-for-an-array-aborts-program

器件型号:TMS320F28062F
主题中讨论的其他器件:MOTORWARE

目前、我正在尝试将不同的电机配置("配置文件")保存到 EEPROM 中、为此、我必须将结构复制到可通过 I2C 发送的阵列中。  但是当我尝试声明数组时,应用程序会转到 exit.c 中的 abort()函数

下面是出现问题的函数(在执行"uint16_t rawData8[len];"行时发生):

uint16_t EEPROM_saveProfile (HAL_Handle halHandle、Profile *配置文件、uint16_t profileNumber){
uint16_t len = sizeof (Profile)* 2;
uint32_t address = profileDataStartAddr + len * profileNumber;
//确保我们不会超出可用内存。
if ((address+len > EEPROM_SIZE)||(address+len > profileDataStartAddr+profileDataSize)){
return 0;
}

uint16_t rawData8[len];
convert16_8lsb (profile、rawData8、len);

返回 eepromWrite (halHandle->eepromHandle、address、rawData8、len);
} 

我验证了 len=60当相关行到达时、并尝试将其设置为常数60、而不是根据配置文件的大小计算它、但行为没有改变。 注释掉最后两行并设置 len=1仍会导致程序在此处中止。

深入探究之后,我发现 ABORT()在 realloc()返回0后从 vla_alloc.cpp 中的 incree_Curr_VLA pool_capacity()调用,因为 Curr_VLA pool->Capacity * sizeof (A_VLA alla_allocation)是0。 这些文件不是我的项目的一部分(它们位于编译器的 lib/src 文件夹中)。

首先、我认为问题出现的原因是某些段内存不足、因此我更改了.cmd 文件、通过在每个页面中连接所有类似命名的连续内存块、每个内存块中都有大量可用空间、但这并不能解决问题。 它目前的样子如下:

MEMORY
{
PAGE 0:/* Program Memory */
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
RAML0_1 :origin = 0x008000、length = 0x000C00 /*片上 RAM 块 L0和 L1 */
OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */

FLASHA_B_C_D:origin = 0x3E8000、length = 0x00FF80 /*片上闪存*/
csm_RSVD :origin = 0x3F7F80、length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 */
开始 :origin = 0x3F7FF6,length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 //
csm_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /* FLASHA 的一部分。 FLASHA *中的 CSM 密码位置/

FPUTABLES :origin = 0x3FD590,length = 0x0006A0//引导 ROM 中的 FPU 表*/
IQTABLES :origin = 0x3FDC30,length = 0x000B50 //引导 ROM 中的 IQMath 表*/
IQTABLES2 :origin = 0x3FE780,length = 0x00008C //引导 ROM 中的 IQMath 表*/
IQTABLES3 :origin = 0x3FE80C,length = 0x0000AA/*引导 ROM 中的 IQMath 表*/

ROM :origin = 0x3FF3B0,length = 0x000C10 /*引导 ROM */
重置 :origin = 0x3FFFC0,length = 0x000002 引导 ROM 的/*部分*/
向量 :origin = 0x3FFFC2,length = 0x00003E /*部分引导 ROM */

第1页:/*数据存储器*/
/*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
/*寄存器保留在第1页上 //

boot_RSVD:origin = 0x000000,length = 0x000050 // M0的部分,引导 ROM 将此用于栈*/
RAMM0_1 :origin = 0x000050、length = 0x0007B0 /*片上 RAM 块 M0 */
RAML2_3_4_5:origin = 0x008C00,length = 0x005400
USB_RAM :origin = 0x040000、length = 0x000800 /* USB RAM*/

ECANA :origin = 0x006000、length = 0x000040 /* eCAN-A 控制和状态寄存器*/
ECANA_LAM:origin = 0x006040,length = 0x000040 /* eCAN-A 本地接受屏蔽*/
ECANA_MOTS:origin = 0x006080,length = 0x000040 /* eCAN-A 消息对象时间戳*/
ECANA_MOTO:origin = 0x0060C0、length = 0x000040 /* eCAN-A 对象超时寄存器*/
ECANA_MBOX:origin = 0x006100、length = 0x000100 /* eCAN-A 邮箱*/
}


SECTIONS
{

//分配程序区域:*/
.cio :> RAML0_1, PAGE = 0
.cinit :> FLASHA_B_C_D,PAGE = 0.Pinit
:> FLASHA_B_C_D,PAGE = 0
.text :> FLASHA_B_C_D,PAGE = 0
codestart :>开始, PAGE = 0
ramfuncs :load = FLASHA_B_C_D,
运行= RAML0_1、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
PAGE = 0

csmpasswds :>CSM_PWL_P0、 PAGE = 0
csm_rsvd :>CSM_RSVD, PAGE = 0

/*分配未初始化的数据段:*/
.stack :>RAMM0_1, PAGE = 1
.esysmem :> RAML2_3_4_5, PAGE = 1.ebss
:> RAML2_3_4_5, PAGE = 1

/*初始化段要进入闪存*/
/*要使 SDFlash 对这些段进行编程、必须将它们分配到 PAGE 0 */
.econst :> FLASHA_B_C_D,PAGE = 0
.switch :> FLASHA_B_C_D,PAGE = 0

//分配 IQ 数学区域:*/
IQmath :> FLASHA_B_C_D,PAGE = 0 /*数学代码*/
IQmathTables :> IQTABLES, PAGE = 0、TYPE = NOLOAD

/*分配 FPU 数学区域:*/
FPUmathTables :> FPUTABLES, PAGE = 0、TYPE = NOLOAD

DMARAML5:> RAML2_3_4_5,page = 1.reset

:>重置, PAGE = 0、TYPE = DSECT
向量 :>引导程序,页= 0,类型= DSECT

} 

有什么解决方法吗?

P.S. 如果相关、我将使用 Motorware 17中的 proj_lab09作为此项目的基础、但它已经发生了很大变化。

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

    您是否已验证您没有收到堆栈溢出? 您没有为".stack"分配太多资源。

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将项目设置中的堆栈大小从0x3B0增加到0x600、将堆大小从0x400增加到0x800、并将.stack 移动到 RAML2_3_4_5。 它没有帮助、程序的行为仍然相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我创建了一个宏、并直接使用该宏创建了数组。 代码现在起作用...

    #define profile_size sizeof (Profile)*2
    
    uint16_t rawData8[profile_size]; 

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

    [引用用户="Dmitri Ranfft"]

    我创建了一个宏、并直接使用该宏创建了数组。 代码现在起作用...

    #define profile_size sizeof (Profile)*2
    
    uint16_t rawData8[profile_size]; 

    [/报价]

    我遇到了类似的问题... 首先、我通过对阵列大小进行硬接线而不是通过输入参数设置来解决这个问题... 最终我迁移到了全局存储...

    您是否碰巧发现发生了什么情况? 是堆栈溢出还是其他问题?