【问题标题】:microcontroller fails at malloc微控制器在 malloc 失败
【发布时间】:2015-07-05 14:32:59
【问题描述】:

我正在 32 位 cortex m4 微控制器上编写函数。 该函数必须能够乘以不同大小的矩阵,这是我无法预测的。所以我必须使用 malloc...

但我不明白为什么我的 mc 在执行以下行时总是进入默认处理程序中断:

double *output2=NULL;
output2 = malloc(3 *1* sizeof(double *));

这个 mc 不能处理这种类型的操作吗? 虽然这在我的笔记本电脑上运行良好!

**编辑*

这里还有一些代码(仍然需要修改......): 好吧,任何地方的所有maloc都失败了。我无法为“malloced”数组分配任何值。

int main (void)
{

    /*some stuff*/

    float transFRotMatrix[3][3]={0}; //array gets modified by other functions
    float sunMeasurements[3][1] = {{1},{2},{3}}; //test values

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

    /*some stuff*/
}

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;

    int i=0;
    int j=0;
    int t=0;

    float rotationMatrix[3][3]={0};

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


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

    float *output2;

    output2 = malloc(3 *1* sizeof(float *)); //<-----ERROR


    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[k*3 +k2] = result;  //<-----FAILS HERE


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

        if(x==width2)
        {
            k2=0;
            x=0;
            column=0;
            row++;
            y++;
            k++;

        }
        result = 0;

    }

    for(i=0;i<height1;i++)
    {
        for(j=0;j<width2;j++)
        {
             orbitalSunVector[j * height1 + i] = output2[i*3 +j];
        }
    }
    free(output2);
}

【问题讨论】:

  • 可能他不支持浮点数?
  • 最好像@Zelldon 建议的那样隔离浮点问题。如果你 malloc(20) 进入 int* 会发生什么?
  • 您是否 100% 确定是 malloc 调用失败,而不是其后的某些代码? Afaik 你应该分配3 * sizeof( double ) (至少如果我理解正确的话——由于你使用空格的方式,你的代码很难阅读)——这可能是3 * sizeof( double* ) 的两倍,所以你可能正在访问某处数据越界
  • @trilolil 如果你想要双精度数组,那么sizeof(double*) 肯定是错误的。也许您需要发布更多代码。
  • 别人指出output2 = malloc(3 *1* sizeof(double *));是错误的,应该是output2 = malloc(3 * 1 * sizeof *output2);分配3x1doubles。通过取消引用output2 指针,我们不需要重复类型名称,并且如果output2 被重命名或删除,则会出现错误。不过,此修复无法解决您看到的错误。

标签: c pointers malloc microcontroller


【解决方案1】:

malloc() 在这段代码的其他部分工作正常吗?在您对嵌入式设备进行编程时,堆可能没有正确初始化,或者它已经为另一个自定义 malloc()-like 函数初始化。

【讨论】:

  • 这实际上是我使用的唯一malloc。我没有为堆做任何事情。特此截图:imgur.com/JT5W5tK
  • 好吧,任何地方的所有maloc都失败了。我无法为“malloced”数组分配任何值。
  • 您需要检查您的编译器/链接器文档以正确初始化您的 libc 和/或您的堆。如果您有足够的 RAM 并且没有线程,一个更简单的解决方案是分配一个全局变量以尽可能大地分配并使用它。
  • 你是对的!非常感谢您。根本没有分配堆。 0
【解决方案2】:

C 中有两种有效的实现类型:hostedfreestanding。为托管实现编写的程序可以使用任何标准库头文件。然而,独立实现只需要支持&lt;float.h&gt;&lt;iso646.h&gt;&lt;limits.h&gt;&lt;stdalign.h&gt;&lt;stdarg.h&gt;&lt;stdbool.h&gt;&lt;stddef.h&gt;&lt;stdint.h&gt;&lt;stdnoreturn.h&gt;

微控制器支持最少的情况并不少见,因此您的 C 编译器(或者更确切地说,标准库)可能不完全支持 &lt;stdlib.h&gt;(因此也支持 malloc)。但是,在不知道您选择使用哪个编译器和标准库的情况下,这只是猜测。

正如您的问题的 cmets 所暗示的那样,也有可能是在这段代码之前(和/或之后)的某些事情是罪魁祸首。也许你可以生成一个mcve

当您更新以提供更多信息时,请随时在此答案下方发表评论,我很乐意详细说明以提供更多信息。

【讨论】:

  • 感谢您的回答。我正在使用来自 texas instrument 5.4.0.00091 的代码作曲家工作室进行编码。我编辑了我的问题以提供更多代码。 (尽管这些行之前没有任何内容)
【解决方案3】:

您收到的是处理器异常,而不是中断。 它们都映射到同一个处理程序,这是一种常见的做法。 我假设你有硬件故障。 您可以检查寄存器以查看导致异常的原因。 使用this code 作为参考来检查它们。 如果异常发生在 malloc 内部,则可能与 libc 实现有关。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多