繁体   English   中英

访问STM32评估板上的malloc声明的数组

[英]Accessing array declared by malloc on STM32 Eval board

我目前正在将为其他嵌入式系统编写的代码移植到STM评估板(STM32F407)。 我在旧板上使用malloc的方式如下(为简化起见,已简化):

float* values = (float*)malloc(sizeof(float)*NO_OF_ATT);

values[0] = 1.0;
values[1] = 2.0;
values[2] = 3.0;
values[3] = 4.0;

该代码按预期工作。 但是,在STM板上,当我运行此代码时,似乎无法以这种方式访问​​数组,而不是它的值仅输出3.85205412e-034之类的值。 我以C表示法x [y]等于*(x + y)? 任何人都可以帮助我尝试了解正在发生的事情吗? 提前致谢!

编辑:这是非简化的代码:

    l = (dllist*)calloc(sizeof(dllist),0);

l->Distance = 0;

for (int i = 0; i < NO_OF_ATT; i++)
{
    l->Value[i] = featureValues[i];

    if (i == (NO_OF_ATT - 1))
    {
        l->Value[i] = (int)featureValues[i];
    }
}


sglib_dllist_add(&queryList, l);

featureValues数组具有正确的值,但l-> value数组没有。 截图: 在此处输入图片说明

编辑2:

结构定义:

typedef struct dllist {
   float Value[NO_OF_ATT];
   float Distance;
   struct dllist *ptr_to_next;
   struct dllist *ptr_to_previous;
} dllist;

我只想澄清一下:我的代码在Visual Studio和第二个嵌入式系统中运行良好。 它在我的STM板上无法正常工作。

您没有正确使用calloc:

l = (dllist*)calloc(sizeof(dllist),0);

void* calloc (size_t num, size_t size);

为一个num元素数组分配一个内存块,每个元素的大小为字节长,并将其所有位初始化为零。

您要的是sizeof(dllist)零尺寸的元素。 换句话说,您请求calloc为您分配零字节,并且它返回NULL指针,如您的屏幕快照所示。

尝试将上述calloc呼叫替换为:

l = (dllist*)calloc(1,sizeof(dllist));
float* values = calloc(sizeof(float)*NO_OF_ATT,0);

values[0] = 1.0;
values[1] = 2.0;
values[2] = 3.0;
values[3] = 4.0;

这将使用0初始化所有变量。现在使用它来打印值...

printf("%f",values[<any index you wanna print>]);

它应该正确打印,实际上malloc也可以。 但请让我知道您的打印方式(发布这些语句并输出,如果仍然这样的话)

编辑

在l的结构中,当您声明该float数组的时间时,您只需要为那个数组分配内存。

l = (dllist*)calloc(sizeof(dllist),0)

dllist是您的结构...正确吗? 因此,当给那个分配内存时,您在结构中提到的任何大小的数组都会被初始化。现在,当您分配值时,请使用此语法。

*(l->values[i]) = featureValues[i] ; 
           *or*
*(l.(values + i))  = featureValues[i] ; 

这应该可以解决您的问题

如您在调试屏幕截图中所见, l变量的地址为0x00000000 这意味着calloc因为没有空间分配请求的大小而返回NULL

首先,每次使用malloc calloc等时, 必须检查其返回值:

retPointer = malloc(sizeof(yourStruct);
if (retPointer == NULL) 
{ 
   // There wasn't room into heap memory
}

对于许多MCUs地址0ISP (Initial Stack Pointer) ,地址0x00000004 (在32位存储空间中)是IPC (Initial Program Counter) 这些地址属于闪存,因此无法通过简单的分配进行修改。

如果尝试在十六进制中显示array[0] a和array[1]值,则可以看到在链接描述文件中编程的ISPIPC值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM