即使我在这里释放,xData 又是如何再次分配的?

How is the xData is still getting allocated again even though I'm freeing here?

这是我的代码,我几乎不熟悉编码和处理我的第一个嵌入式任务,真的需要一些帮助。提前致谢。

1 int *xData;
2 char Pixels[246];
3 uint8_t data[128];
4 char* Pixel_data;

5 while(1)
6 {
7   xData= (int*)malloc(sizeof(int));
8
9   ReadSamples(data);
10  int j=0;
11  for (int i=0;i<=127;i+=2)
12  {
13  
14      *xData = data[i] + data[i+1];
15      temp_c[j] = (*xData)*(mult);
16      free(xData);
17      j++;
18  }
19  Pixel_data = Create_heatmap(temp_c);  //Create_heatmap returns char* ptr of size 246
20  memcpy(Pixels, Pixel_data,246*sizeof(char) + 1);
21  //Transfers the whole converted data
22  HAL_UART_Transmit(&huart1,(uint8_t*) Pixels, sizeof(Pixels), 100);
23  free(Pixel_data);
24 }
  1. line 7中,我正在使用mallocxData创建内存,在line 14中,我正在向它提供一些数据,在[=15=中] 我使用 free 释放它,我只在 for 循环的一次迭代中释放 xData 但当我看到预期的输出时。即使在释放分配的内存后,xData 又如何被填满?
  2. 我能得到关于 line 20 的更好解释吗,我有 pixels 大小为 246,我正在复制 246+1 它仅适用于 247,如果不是 247 一个字节的数据最后不见了。这是为什么?
  3. line 9,我将在 12bits 中每个传感器获得 64 个读数,并存储为 data[0] = 8 bitsdata[1] = 4 bits。这可能是float/int。我知道我在第 14 行做的是错误的。如何克服这个问题?
  1. 调用free()后访问内存地址是未定义的行为,任何事情都可能发生。 What is undefined behavior and how does it work?

    具体来说,不存在“删除”物理内存值这样的事情 - 大多数时候您只是将地址标记为 invalid/not 已使用,但最后存储在那里的值可能仍然存在。对于一个很好的类比(使用堆栈,而不是堆,但两种方式都是一样的),请查看 Can a local variable's memory be accessed outside its scope?

  2. 您正在通过复制 247 个字节越界访问数组。这也是一个未定义的行为错误。 “它只适用于 247”- 不,不是,你可能在其他地方也有不同的错误。

  3. 您可能应该将数组交换为类型 uint16_t

    或者您可以 (uint32_t)data[i]<<8 | data[i+1]; 取决于哪个字节包含 MSB - 这取决于 ADC 硬件和字节顺序。强制转换为 uint32_t 是为了防止在小整数类型上进行移位——我怀疑这是一个 Cortex M,因此理想情况下,你的位移应该作为无符号 32 进行。

    请注意,ADC 通常有一个选项来设置您希望如何移动数据。假设 Little Endian 和 12 位 ADC,则 LSB 在字节 0 位 0(左移)或 LSB 在字节 0 位 4(右移)

总的来说,这段代码非常幼稚,如果这是您的第一个嵌入式项目,这当然很自然。其他一些注意事项:

  • 在嵌入式系统中处理整数时,您应该只使用 stdint.h 中的类型。你很少需要有符号的数字,你永远不应该使用普通的 int.

  • 嵌入式系统一般不用动态分配,因为没有任何意义,see this。在您的特定情况下,这只是非常低效的开销膨胀 - 您应该改用静态分配的缓冲区。

  • 同样,浮点运算只能用于具有实际 FPU 的微控制器。这意味着至少 Cortex M4 .