gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:04 25 4
gpt4 key购买 nike

我使用的是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com