c - 内存未分配(嵌入式 uC MSP430)

标签 c memory embedded buffer

我使用的是 MSP430G2553 微 Controller (500 字节 SRAM 和 16kB 闪存)。我有 4 个环形缓冲区在我的代码初始化时分配内存(使用 malloc)

typedef struct
{
    unsigned char Head;
    unsigned char Tail;
    unsigned char Size;
    unsigned char *Buffer;
} RingBuffer;

void RB_Init(RingBuffer *RB)
{
    RB->Size = 32;
    RB->Tail = 0;
    RB->Head = 0;
    RB->Buffer = (unsigned char*) malloc(RB->Size);
}

基本上我调用了四次 RB_Init 来创建那些环形缓冲区。当大小(环形缓冲区的容量)为 16 时,一切都很好,我检查了所有四个,它们每个都有一个内存地址。 当我将大小更改为 32 时,只有 2 个获取内存地址,最后两个没有分配内存。

根据我从 code composer studio 获得的内存映射(如下所示),看起来我还有很多空间(在 RAM 和闪存下)。 当我的大小为 32 字节时,为什么最后两个缓冲区数组没有获取地址(为什么我似乎达到了 64 字节的限制?)

******************************************************************************
                  MSP430 Linker PC v4.1.5                      
******************************************************************************
>> Linked Fri Dec 27 22:53:28 2013

OUTPUT FILE NAME:   <xxx.out>
ENTRY POINT SYMBOL: "_c_int00"  address: 0000c672


MEMORY CONFIGURATION

         name            origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
  SFR                   00000000   00000010  00000000  00000010  RWIX
  PERIPHERALS_8BIT      00000010   000000f0  00000000  000000f0  RWIX
  PERIPHERALS_16BIT     00000100   00000100  00000000  00000100  RWIX
  RAM                   00000200   00000200  000000cf  00000131  RWIX
  INFOD                 00001000   00000040  00000000  00000040  RWIX
  INFOC                 00001040   00000040  00000000  00000040  RWIX
  INFOB                 00001080   00000040  00000000  00000040  RWIX
  INFOA                 000010c0   00000040  00000000  00000040  RWIX
  FLASH                 0000c000   00003fe0  00000802  000037de  RWIX
  INT00                 0000ffe0   00000002  00000000  00000002  RWIX
  INT01                 0000ffe2   00000002  00000000  00000002  RWIX
  INT02                 0000ffe4   00000002  00000002  00000000  RWIX
  INT03                 0000ffe6   00000002  00000002  00000000  RWIX
  INT04                 0000ffe8   00000002  00000000  00000002  RWIX
  INT05                 0000ffea   00000002  00000000  00000002  RWIX
  INT06                 0000ffec   00000002  00000002  00000000  RWIX
  INT07                 0000ffee   00000002  00000002  00000000  RWIX
  INT08                 0000fff0   00000002  00000000  00000002  RWIX
  INT09                 0000fff2   00000002  00000002  00000000  RWIX
  INT10                 0000fff4   00000002  00000000  00000002  RWIX
  INT11                 0000fff6   00000002  00000000  00000002  RWIX
  INT12                 0000fff8   00000002  00000000  00000002  RWIX
  INT13                 0000fffa   00000002  00000000  00000002  RWIX
  INT14                 0000fffc   00000002  00000000  00000002  RWIX
  RESET                 0000fffe   00000002  00000002  00000000  RWIX

最佳答案

您的系统有多少 RAM 并不重要,在您的情况下配置的堆大小太小。

但是如果你总是需要 4 个固定大小的环形缓冲区,那么通过 malloc 分配它们就没有意义了。
您可以更好地定义静态变量,这样您就可以在链接时知道您的 RAM 是否足够。

#define RING_BUF_SIZE  32

typedef struct
{
    unsigned char Head;
    unsigned char Tail;
    unsigned char buffer[RING_BUF_SIZE];
} RingBuffer;

static RingBuffer myRingbuffer[4];

void RB_Init(RingBuffer *RB)
{
    memset(RB, 0, sizeof(RingBuffer) );
}

初始化它们很重要,因为这里的代码编写器不符合 ANSI-C,并且启动代码不会在启动时将所有变量置零。

关于c - 内存未分配(嵌入式 uC MSP430),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20812039/

相关文章:

java - 非静态字段在 Java 中更改之前是否是静态的?

iphone - 在小框架中显示大图像 UIImageView 仍然消耗大量内存?

非常大的 10G 缓冲区的 c++ FIFO 实现

c - C 中的线程(和 irq)安全动态内存处理程序

c - 无法在 while 循环外保留数组

C Pthreads - 线程安全队列实现的问题

C: 帮助自定义 strpos() 函数

c++ - 跨 C 和 C++ 标准的可靠类型双关

c - 在链中 fork N 个进程

c - 为什么这会让我的显示器发疯? (但只是有时)