gpt4 book ai didi

arm - 在 ARM Cortex-M3 中使用 newlib 的 malloc

转载 作者:行者123 更新时间:2023-12-03 14:53:33 25 4
gpt4 key购买 nike

我正在为 ARM Cortex-M3(NXP 的 LCP17xx)创建代码。到目前为止,我一直在使用静态内存,一切都运行良好。我试图添加动态内存支持,但是一旦我调用 malloc,系统就会卡住。

我正在用 gcc 编译 arm 裸机,并使用 newlib。版本:gcc-arm-none-eabi-4_6-2012q1

为了添加对 malloc 的支持,我实现了一个简单的 _sbrk 函数并修改了我的链接器脚本为堆腾出一些空间(我已经阅读了许多关于这部分的不同教程,但没有一篇涵盖我接下来遇到的问题)。

在一些 LED 的帮助下,我可以确定代码一直运行到调用 malloc 为止。 ,然后它不会继续。它甚至没有到达我的_sbrk功能。此外,它会卡在对 sizeof 的调用中。 ,如果我包括对 malloc 的调用稍后在代码中。

那么,调用 malloc 时我会做错什么?代码在没有到达 _sbrk 的情况下就卡住了还是返回?

盯着malloc时生成的内存图看了半天call 包含在内,如果不包含,我怀疑它与 malloc 使用的结构有关.

这是定义 ram 内存的 ld 脚本的一部分:

.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
_ebss = .;
. = ALIGN (8);
_end = .;
} >sram
. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);
_start_heap = .;
PROVIDE( __cs3_heap_start = _start_heap)

_end_stack = 0x10008000;

然后在中断向量表中设置_end_stack。

现在比较不同的 map 。在代码中不使用 malloc :
 *(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .

在代码中使用 malloc 的内存映射:
*(COMMON)
COMMON 0x10000848 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-reent.o)
0x10000848 errno
0x1000084c _ebss = .
0x10000850 . = ALIGN (0x8)
*fill* 0x1000084c 0x4 00
0x10000850 _end = .

.bss.__malloc_max_total_mem
0x10000850 0x4
.bss.__malloc_max_total_mem
0x10000850 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-mallocr.o)
0x10000850 __malloc_max_total_mem

(...) It goes on (...)
0x1000085c __malloc_current_mallinfo
0x10000884 . = ALIGN (0x4)
0x10000884 _end_bss = .
0x10000900 . = ALIGN (0x100)
0x10000900 _start_heap = .

最佳答案

所以,经过大约 10 个小时的调试,我终于让它工作了。问题出在链接描述文件中。但是,我发布的不是bss部分,而是文本和数据部分。这是有效的脚本。

OUTPUT_FORMAT("elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_startup)

MEMORY
{
rom (rx) : ORIGIN = 0x00000000, LENGTH = 512K
ram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
}

/* Define the top our stack at the end of SRAM */
_end_stack = 0x10008000;

EXTERN(__interrupt_vector_table);

SECTIONS
{
.text :
{
/* Insert the interrupt vector table first */
__interrupt_vector_table = .;
*(.interrupt_vector_table)
/* Startup assembly */
*(.startup)
/* Rest of the code (C) */
*(.text) *(.text.*) *(.glue_7) *(.glue_7t)
*(.vfp11_veneer)
*(.ARM.extab* .gnu.linkonce.armextab.*)
*(.rodata) *(.rodata.*)
. = ALIGN(8);
_end_text = .;
_start_datai = .;
} >rom

.data :
{
_start_data = .;
*(vtable)
*(.data) *(.data.*)
. = ALIGN (8);
_end_data = .;
} >ram AT >rom

.data_init : { _end_datai = .; } >rom

__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > rom
__exidx_end = .;

.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
} >ram

. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);

_start_heap = .;
PROVIDE( __cs3_heap_start = _start_heap);

/* Linker wants .eh_frame section defined because of gcc 4.4.X bug,
* just discard it here. */
/DISCARD/ : { *(.eh_*) }
}

_end = .;
PROVIDE(end = .);

我还必须在我的初始化代码中添加一些变量初始化:
extern unsigned int _start_data;
extern unsigned int _end_data;
extern unsigned int _start_datai;
extern unsigned int _end_datai;

void init(void) {

// (...) Other stuff

// Initialize Global Variables
uint32_t* data_begin = (uint32_t*) &_start_data;
uint32_t* data_end = (uint32_t*) &_end_data;
uint32_t* datai_begin = (uint32_t*) &_start_datai;
uint32_t* datai_end = (uint32_t*) &_end_datai;
while(data_begin < data_end)
{
*data_begin = *datai_begin;
data_begin++;
datai_begin++;
}

这两页很有帮助,尽管我仍然花了很多时间才理解发生了什么: http://fun-tech.se/stm32/linker/index.phphttp://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/473/t/44452.aspx?pi23648=1

我希望这可能对其遇到与我遇到的相同问题的其他人有用。

关于arm - 在 ARM Cortex-M3 中使用 newlib 的 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10467244/

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