主题中讨论的其他器件: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作为此项目的基础、但它已经发生了很大变化。