即使我在这里释放,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 }
- 在
line 7
中,我正在使用malloc
为xData
创建内存,在line 14
中,我正在向它提供一些数据,在[=15=中] 我使用 free
释放它,我只在 for
循环的一次迭代中释放 xData
但当我看到预期的输出时。即使在释放分配的内存后,xData
又如何被填满?
- 我能得到关于
line 20
的更好解释吗,我有 pixels
大小为 246,我正在复制 246+1
它仅适用于 247,如果不是 247 一个字节的数据最后不见了。这是为什么?
- 在
line 9
,我将在 12bits
中每个传感器获得 64 个读数,并存储为 data[0] = 8 bits
和 data[1] = 4 bits
。这可能是float/int
。我知道我在第 14 行做的是错误的。如何克服这个问题?
调用free()
后访问内存地址是未定义的行为,任何事情都可能发生。 What is undefined behavior and how does it work?
具体来说,不存在“删除”物理内存值这样的事情 - 大多数时候您只是将地址标记为 invalid/not 已使用,但最后存储在那里的值可能仍然存在。对于一个很好的类比(使用堆栈,而不是堆,但两种方式都是一样的),请查看 Can a local variable's memory be accessed outside its scope?
您正在通过复制 247 个字节越界访问数组。这也是一个未定义的行为错误。 “它只适用于 247”- 不,不是,你可能在其他地方也有不同的错误。
您可能应该将数组交换为类型 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 .
这是我的代码,我几乎不熟悉编码和处理我的第一个嵌入式任务,真的需要一些帮助。提前致谢。
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 }
- 在
line 7
中,我正在使用malloc
为xData
创建内存,在line 14
中,我正在向它提供一些数据,在[=15=中] 我使用free
释放它,我只在for
循环的一次迭代中释放xData
但当我看到预期的输出时。即使在释放分配的内存后,xData
又如何被填满? - 我能得到关于
line 20
的更好解释吗,我有pixels
大小为 246,我正在复制246+1
它仅适用于 247,如果不是 247 一个字节的数据最后不见了。这是为什么? - 在
line 9
,我将在12bits
中每个传感器获得 64 个读数,并存储为data[0] = 8 bits
和data[1] = 4 bits
。这可能是float/int
。我知道我在第 14 行做的是错误的。如何克服这个问题?
调用
free()
后访问内存地址是未定义的行为,任何事情都可能发生。 What is undefined behavior and how does it work?具体来说,不存在“删除”物理内存值这样的事情 - 大多数时候您只是将地址标记为 invalid/not 已使用,但最后存储在那里的值可能仍然存在。对于一个很好的类比(使用堆栈,而不是堆,但两种方式都是一样的),请查看 Can a local variable's memory be accessed outside its scope?
您正在通过复制 247 个字节越界访问数组。这也是一个未定义的行为错误。 “它只适用于 247”- 不,不是,你可能在其他地方也有不同的错误。
您可能应该将数组交换为类型
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 .