malloc崩溃嵌入式系统

malloc崩溃嵌入式系统,c,matrix,malloc,cortex-m,C,Matrix,Malloc,Cortex M,我试图在cortex M4内核上乘以任意大小的矩阵。我真的需要一个malloc。。。 但我不明白为什么在第一次通话时它能工作,而在第二次通话时它就不再工作了。它只是跳转到默认的中断处理程序FaultISR 特此发布dissasembly代码: 执行BL命令时失败 函数调用: multiplyMatrices( &transFRotMatrix[0][0],3, 3, &sunMeasurements[0][0], 3, 1, *orbitalSunVector); //Work

我试图在cortex M4内核上乘以任意大小的矩阵。我真的需要一个malloc。。。 但我不明白为什么在第一次通话时它能工作,而在第二次通话时它就不再工作了。它只是跳转到默认的中断处理程序FaultISR

特此发布dissasembly代码:

执行BL命令时失败

函数调用:

multiplyMatrices( &transFRotMatrix[0][0],3, 3, &sunMeasurements[0][0], 3, 1, *orbitalSunVector); //Works fine

multiplyMatrices( &firstRotMatrix[0][0],3, 3, &orbitalTMFV[0][0], 3, 1, *inertialTMFV); //doesn t work fine
代码:

void多重矩阵(float*transposedMatrix、int-height1、int-width1、float*iSunVector、int-height2、int-width2、float*orbitalunvector)
{
int y=0;
int x=0;
int行=0;
int列=0;
int k=0;
int k2=0;
浮动结果=0;
float*output2=NULL;
int i=0;
int j=0;
i=0;
k=0;
k2=0;
如果(宽度1!=高度2)
{
//printf(“不匹配的矩阵,错误。\n\n”);
返回;
}

output2=malloc(高度1*width2*sizeof(float));//由于索引计算不正确,两个循环中的
output2
矩阵都溢出。您有:

output2[row*width1 + column] = result;
...
orbitalSunVector[j*height1 + i] = output2[i*width1 + j];
但在这两种情况下,您都应该使用
width2
,因为最终矩阵的大小是
width2*height1
(分配时):

我没有检查任何其他索引,但我会使用一些已知的情况测试函数,以确保它输出正确的结果。如果您进行了更多的调试并检查了数组索引,那么应该很容易发现它


请注意,它第一次但不是第二次对您有效的原因是由于未定义的行为(UB)。只要你写的内容超过了
output2
的结尾,你就会调用UB,任何事情都可能发生。对你来说,它在第二次调用时恰巧出现了错误。对我来说,它在第一次调用时恰巧出现了错误。如果你真的不走运,它可能永远不会出错,只是默默地损坏数据。

你在c的其他地方使用
printf
颂歌

建议堆大小从0x400开始,即1024位小数:

建议在以下情况下以合理的堆大小(如0x400)开始 动态分配有限(如代码中的printf()调用), 并根据应用情况根据需要增加

根据TI的建议,如果可能的话,你至少可以尝试将其翻一番,看看这会把你引向何方

这是一个相关的问题。如果您没有工具动态监视堆分配,请尝试在启动时手动填充堆(
memcpy
it,使用已知值,例如ASCII'#==#'、0xDEADBEEF或任何可识别的值),然后在通常崩溃之前运行到,并在内存窗口中查看堆的内容。我的最佳猜测是,您会发现堆已满

当你在FaultISR时,也请看看你是否能看到错误标志寄存器。通常会有东西告诉你为什么来这里


我不确定TI对
malloc
的实现,但它们可能会保存一个错误值。我不相信这一点,因为在这种情况下它可能会返回NULL,而不是崩溃。

那么
height1
width2
的值是多少?可能内存不足?可能写得太多(或其他)分配内存?除非堆栈和堆设置不正确,否则不会失败,即使height1和width2太大,它也应返回NULL(如果其乘积为负,则为同一情况)。您可以在函数调用中看到这些变量的值。您正在分配
3*3*sizeof(float)
?为什么不能直接执行例如
浮点输出[9]
?因为这不是动态的,不适用于任何大小的矩阵。我更改了它,但不幸的是,这并没有解决我的问题。我错了。如果您同意此处建议的更改,请相应地更新问题中的代码。@rudolf,那么您很可能在其他地方溢出了另一个缓冲区。(例如,检查orbitalSunVector是否与代码假定的一样大)。但请注意,即使这里的函数发生崩溃,可能是由于堆损坏,错误也可能是由其他地方引起的。@rudolf我还想说@uesp感觉索引中有可疑之处,我也感觉到了。您有相当多的变量,其名称不太具描述性。
k
k2
x
,它们是什么以及它们适用于什么矩阵或维度都不是很清楚。我本来打算重构你的函数,但这确实是你应该自己做的事情,比如先把1xN乘以Nx1的向量乘法换成一个单独的函数,m艾比。
output2[row*width1 + column] = result;
...
orbitalSunVector[j*height1 + i] = output2[i*width1 + j];
output2[row*width2 + column] = result;
...
orbitalSunVector[j*height1 + i] = output2[i*width2 + j];