Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存未分配(嵌入式uC MSP430)_C_Memory_Embedded_Buffer - Fatal编程技术网

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

内存未分配(嵌入式uC MSP430),c,memory,embedded,buffer,C,Memory,Embedded,Buffer,我使用的是MSP430G2553微控制器(500字节的SRAM和16kB的闪存)。我有4个环形缓冲区在初始化代码时分配内存(使用malloc) 基本上,我要调用RB_Init四次来创建这些环形缓冲区。当大小(环形缓冲区的容量)为16时,一切正常,我检查了所有四个,它们都有一个内存地址当我将大小更改为32时,只有2个get内存地址,最后两个没有得到内存分配。 根据我从CodeComposer studio(如下所示)获得的内存映射,看起来我还有很多空间(在RAM和闪存下)当我的大小为32字节时,为

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

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

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

******************************************************************************
MSP430链接器PC v4.1.5
******************************************************************************
>>链接:2013年12月27日星期五22:53:28
输出文件名:
入口点符号:“\u c\u int00”地址:0000c672
内存配置
名称使用的原始长度未使用的属性填充
----------------------  --------  ---------  --------  --------  ----  --------
SFR 00000000000010 00000000000010 RWIX
外围设备\u 8BIT 000000 1000 000000 F0 000000000000 F0 RWIX
外围设备\u 16位00000100 00000100 00000000 00000100 RWIX
RAM 00000 200 00000 200 000000 CF 00000131 RWIX
INFOD 000010000000 40 000000000000 40 RWIX
INFOC 000010400000000040 00000000000040 RWIX
INFOB 00001080000000040 00000000 00000040 RWIX
INFOA 000010C0000000 40 000000000000 40 RWIX
闪存0000c000 00003fe0 00000802 000037de RWIX
INT00 000000FFE0000000020000000000000002 RWIX
INT01 0000FFE2000000020000000000000002RWIX
INT02 0000ffe4 0000000 2 0000000 2 00000000 RWIX
INT03 0000ffe6 0000000 2 0000000 2 00000000 RWIX
INT04 000000FFE8 0000000 2 00000000 0000000 2 RWIX
INT05 0000ffea 0000000 2 0000000 0000000 2 RWIX
INT06 0000ffec 00000002000000000 RWIX
INT07 0000ffee 00000002000000000 RWIX
INT08 0000FFF00000000 2 00000000 0000000 2 RWIX
INT09 0000FFF200000002000000000 RWIX
INT10 0000fff4 0000000 2 0000000 0000000 2 RWIX
INT11 0000fff6 0000000 2 0000000 0000000 2 RWIX
INT12 0000fff8 0000000 2 00000000 0000000 2 RWIX
INT13 0000fffa 0000000 2 0000000 0000000 2 RWIX
INT14 0000fffc 0000000 2 0000000 0000000 2 RWIX
重置0000fffe 0000000 2 0000000 2 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标准,并且启动代码不会在启动时将所有变量归零。

对于配置的堆大小太小的情况,系统有多少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()失败。这不是创建健壮嵌入式系统的好方法。看起来堆大小和系统堆栈设置为80。我对这一点有点不熟悉,但在不中断任何其他操作的情况下,将其增加到什么样的合理数字呢?在这样的小型RAM系统上进行嵌入式编程时,我认为应该不惜一切代价避免malloc()!如果您只执行一次分配,请使用静态变量,正如@jeb建议的那样。如果您正在执行真正的动态分配,那么很可能会将堆分割开来,并最终导致malloc()失败。这不是创建健壮的嵌入式系统的好方法。
#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) );
}