【问题标题】:Memory not allocating (Embedded uC MSP430)内存未分配(嵌入式 uC MSP430)
【发布时间】:2014-01-15 17:10:07
【问题描述】:

我使用的是 MSP430G2553 微控制器(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 个获得内存地址,最后两个没有分配内存。

根据我从代码编写器工作室获得的内存映射(如下所示),看起来我还有很多空间(在 RAM 和 FLASH 下)。 当我的大小为 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

【问题讨论】:

    标签: c memory embedded buffer


    【解决方案1】:

    您的系统有多少 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 标准,并且启动代码不会在启动时将所有变量归零。

    【讨论】:

    • 看起来堆大小和系统堆栈设置为 80。我对此有点不熟悉,但是在不破坏其他任何东西的情况下将其增加到多少是合理的?
    • 在像这样的小型 RAM 系统上进行嵌入式编程时,我认为应该不惜一切代价避免 malloc()!如果您只进行一次分配,请按照@jeb 的建议使用静态变量。如果您正在执行真正的动态分配,您可能会分割您的堆并最终导致 malloc() 失败。不是创建强大的嵌入式系统的好方法。
    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 2016-01-30
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2011-09-06
    相关资源
    最近更新 更多