Khi tôi chạy arm-none-eabi-objcopy -O binary add.elf add.bin
mọi thứ có vẻ ổn. Nhưng, sau này khi tôi chạy, ls -lh add.bin add.elf
đây là đầu ra tôi nhận được:
-rw-r - r-- 1 david david 2,6G nov 23 22:49 add.bin -rwxr-xr-x 1 david david 65K nov 23 22:40 add.elf
đây là một tập tin lớn Nhưng khi tôi chạy du -h add.bin
đầu ra là:
Thêm 8,0K.bin
Chuyện gì đang xảy ra ở đây vậy?
Chỉnh sửa: Đầu ra của arm-none-eabi -A -t -x add.bin
:
Cảnh báo: không thể định vị 'add.bin'. Lý do: Giá trị quá lớn đối với loại dữ liệu được xác định
Đầu ra của arm-none-eabi -A -t -x add.elf
:
phần kích thước phần bổ sung .text 0x2c 0x0 .data 0xc 0xa0000000 .ARM.attribut 0x14 0x0 Tổng 0x4c
Đầu ra của du -bh add.bin
:
Thêm 2,6G.bin
Đây là cách tôi sửa nó:
Ban đầu khi tôi liên kết chương trình với lệnh arm-none-eabi-ld -Tld_script.lds -o add.elf add.o
, tập lệnh ld ld_script.lds
chứa tệp này:
PHẦN { . = 0x00000000; .bản văn : { * (.bản văn); } . = 0xA0000000; / * Địa chỉ bắt đầu RAM * / .dữ liệu :{ * (.dữ liệu); } }
Đoạn mã trên điền từ 0x00000000 đến 0xA0000000 với 0s. Lỗi này có thể được giải quyết theo cách sau:
PHẦN { . = 0x00000000; .bản văn : { * (.bản văn); } flash_sdata = .; / * Bắt đầu dữ liệu trong flash ngay sau văn bản * / . = 0xA0000000; / * Địa chỉ bắt đầu RAM * / ram_sdata = .; / * AT chỉ định addr tải. của phần .data * / .data: AT (flash_sdata) { * (.dữ liệu); } ram_edata = .; / * Địa chỉ kết thúc dữ liệu trong RAM * / data_size = ram_edata - ram_sdata; }
Và sau đó trong nguồn tôi đã thêm một phần để sao chép dữ liệu từ Flash sang RAM. Một cái gì đó như thế này:
@ Sao chép dữ liệu vào RAM. khởi đầu: ldr r0, = flash_sdata ldr r1, = ram_sdata ldr r2, = data_size bản sao: ldrb r4, [r0], # 1 strb r4, [r1], # 1 subs r2, r2, # 1 bản sao
Nếu tiếng Anh của tôi không quá chính xác, đây là liên kết giúp tôi khắc phục vấn đề. (Và một trang web tốt để học lập trình nhúng ARM).
arm-none-eabi-size.exe -A -t -x <file>
.
du -bh add.bin
cái gì?