嵌入式系统中的内存使用

时间:2016-03-11 14:53:05

标签: c memory

我正在开发一个嵌入式C项目。嵌入式系统的主要问题是内存有限。我遇到了一个问题,我需要使用中断从串行通信链路中获取32字节的数据,然后将这些数据保存到EEPROM中。

在EEPROM中写入一个字节的时间需要4ms的时间。为了节省我的内存,我可以在从串行接口(在ISR内部)接收数据时写入数据。但这不是一个可行的解决方案。

我可以使用的另一种方法是使用一个包含32字节缓冲区的结构:

struct example_struct
{
unsigned char buffer[32];
};

分配32字节的内存,用它来保存我在ISR中的数据,并在写完EEPROM后释放内存。不幸的是,我在C编译器中没有这种自由。开发环境不支持malloc和free。

要具体说明问题,我想优化内存使用。而不是使用全局缓冲区来保存数据可能是在ISR和EEPROM写入功能之间传输数据的可能方式?

可用于处理的RAM限制为368字节。

malloc in embedded systems;  Dynamic memory allocation in embedded C

请咨询

谢谢

4 个答案:

答案 0 :(得分:3)

由于缺少mallocfree,因此"释放"的概念内存变得简单"为了不同的目的重新使用相同的静态分配的内存块"。

为此,您可以通过将其分配到全局union内来重用一块内存,只要您注意不要一次将其用于多个目的。

答案 1 :(得分:1)

我有一次类似的问题。

我的解决方案是将可用内存分成两个缓冲区,而串行ISR写入缓冲区A,将缓冲区B写入EEPROM(在优先级较低的软件中断,如果可用,或在主循环中)。 / p>

填充A后,交换缓冲区并开始将A写入EEPROM。

你还应该告诉我们你的编译器是哪一个。即,对于baremetal gcc,您可以提供malloc()和free()的实现。

答案 2 :(得分:1)

如果您没有.concat()malloc,则应该重复使用内存

我认为使用free可以帮助你做到这一点

它允许您重用与其他类型相同的变量

例如,您可以使用char [8]变量并将其用作int [2](如果int的大小是系统上的4个字节)

使用相同的内存

答案 3 :(得分:1)

您可以实现环形缓冲区。分配两个或多个32字节块的数组。有读写索引;写入索引指向ISR接下来要写入的块,读取索引指向下一个非中断级别任务将写入EEPROM的块。写入索引将仅由ISR递增,读取索引将仅由任务递增。 How do I implement a circular list (ring buffer) in C?