Tôi đang tạo mã cho ARM Cortex-M3 (NXP's LCP17xx). Tôi đã sử dụng bộ nhớ tĩnh đến nay và mọi thứ hoạt động tốt. Tôi đã cố gắng để thêm hỗ trợ bộ nhớ động, nhưng một khi tôi gọi malloc, hệ thống bị mắc kẹt.Sử dụng malloc newlib trong ARM Cortex-M3
Tôi đang biên dịch bằng gcc cho kim loại trần cánh tay và sử dụng newlib. Phiên bản: gcc-arm-none-eabi-4_6-2012q1
Để thêm hỗ trợ malloc, tôi đã thực hiện một hàm _sbrk đơn giản và sửa đổi tập lệnh trình liên kết của tôi để tạo khoảng trống cho heap (Tôi đã đọc nhiều hướng dẫn khác nhau về điều này một phần, nhưng không bao gồm vấn đề mà tôi gặp phải tiếp theo).
Với sự trợ giúp của một số đèn LED, tôi có thể chắc chắn rằng mã chạy lên cho đến khi nó gọi là malloc
, sau đó nó không tiếp tục. Nó thậm chí không đạt được chức năng _sbrk
của tôi. Ngoài ra, nó sẽ bị kẹt trong một cuộc gọi đến sizeof
, nếu tôi bao gồm một cuộc gọi đến malloc
sau này trong mã.
Vì vậy, tôi có thể làm gì sai khi gọi malloc
mã bị kẹt mà không bao giờ đạt đến _sbrk
hoặc quay lại?
Sau khi xem bản đồ bộ nhớ được tạo khi cuộc gọi malloc
được bao gồm và khi không, tôi nghi ngờ rằng nó liên quan đến cấu trúc được sử dụng bởi malloc
.
Đây là một phần của kịch bản ld định nghĩa bộ nhớ ram: sau đó
.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 được thiết lập trong bảng vector ngắt.
Và bây giờ so sánh các bản đồ khác nhau. Mà không sử dụng malloc trong các mã:
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .
bản đồ bộ nhớ sử dụng malloc trong các mã:
*(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 = .
Bạn có chắc là bạn đang gọi mã khởi động đúng cách, điều này sẽ khởi tạo cấu trúc heap? –
Tôi rõ ràng đang làm điều gì đó sai, vấn đề là tôi không biết tôi đang làm gì sai. Tôi đã thêm thông tin bổ sung về bản đồ bộ nhớ, hy vọng sẽ giúp tìm ra lỗi. –
Một vấn đề rất giống nhau xảy ra khi sử dụng sprintf. Vì vậy, nó không chỉ là một vấn đề malloc. Nó phải làm với toàn bộ công cụ mới. Nó có thể cần một sự thay đổi trong kịch bản liên kết, mặc dù tôi không thể tìm ra cái gì. –