malloc崩溃了嵌入式系统

时间:2015-05-05 12:12:22

标签: c matrix malloc cortex-m

我试图在皮质M4核心上乘以任意大小的矩阵。我需要一个malloc ...... 但我不明白为什么在第一次调用时它起作用,而在第二次调用时它不再起作用。它只是跳转到默认的中断处理程序FaultISR。

特此解散代码:

enter image description here

执行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 multiplyMatrices(float *transposedMatrix, int height1, int width1, float *iSunVector,int height2, int width2, float *orbitalSunVector)
{

    int y=0;
    int x = 0;
    int row=0;
    int column =0;
    int k=0;
    int k2=0;
    float result = 0;
    float *output2=NULL;

    int i=0;
    int j=0;

    i=0;
    k=0;
    k2 = 0;


    if(width1 != height2)
    {
        //printf("unmatching matrices, error.\n\n");
        return;
    }

    output2 = malloc(height1 * width2 * sizeof(float)); //<---- jumps o FaultISR


    while(k<width1) //aantal rijen 1ste matrix
    {
        for(j=0;j<height2;j++) //aantal rijen 2de matrix
        {
            result += (*((transposedMatrix+k*width1)+j)) * (*((iSunVector+j*width2)+k2));  //1ste var:aantal kolommen 2de matrix  --2de variabele na de plus = aantal kolommen 2de matrix
            //printf("%f * %f\t + ", (*((transposedMatrix+k*width1)+j)), (*((iSunVector+j*width2)+k2)));
        }

         output2[row* width1 + column] = result;

        k2++;
        x++;
        column++;

        if(x==width2) //aantal kolommen 2de Matrix
        {
            k2=0;
            x=0;
            column=0;
            row++;
            y++;
            k++;
        }
        result = 0;

    }

    //tussenresultaat
    for(i=0;i<height1;i++)
    {
        for(j=0;j<width2;j++)
        {
             orbitalSunVector[j * height1 + i] = output2[i* width1 + j]; //output2[i][j];

        }
    }

    free(output2);
}

2 个答案:

答案 0 :(得分:0)

由于索引计算不正确,您在两个循环中溢出了Error/Warning log at CL MyHost : com.xyz.MyClass] some log message here 矩阵。你有:

output2

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

width2 * height1

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

请注意,它第一次为您工作但不是第二次的原因是由于未定义的行为(UB)。一旦你写完output2[row*width2 + column] = result; ... orbitalSunVector[j*height1 + i] = output2[i*width2 + j]; 的结尾,你就会调用UB,任何事情都可能发生。对你而言,它恰好在第二次通话中显示为故障。对我来说,第一次通话就发生了错误。如果你真的不走运,它可能永远不会出错,只是默默地破坏数据。

答案 1 :(得分:0)

您是否在代码的其他位置使用printf

This page建议从堆大小的0x400开始,即十进制1024:

  

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

您今天有512个,根据TI的推荐,如果可能的话,您至少可以尝试加倍,并看看这会带来什么。

This是一个相关问题。如果您没有工具来动态观察堆分配,请尝试在启动时手动填充堆(memcpy使用已知值,例如ASCII&#39;#==#&#39;, 0xDEADBEEF,或任何可识别的值),然后在通常崩溃之前运行,并在Memory窗口中观察堆的内容。我最好的猜测是你发现堆已经满了。

当您在FaultISR中时,还要查看是否可以看到错误标志寄存器。通常会有某些地方告诉你为什么你来到这里。

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