Sự cố quan trọng
Vấn đề này ảnh hưởng đến mã được dự định thực hiện tại chỗ trong flash
bằng cách sử alt_load()
dụng để sao chép các phần có thể ghi vào RAM.
Nếu một phần ELF (ví .bss
dụ) sẽ được sao chép từ
flash sang RAM bằng cách sử dụng alt_load()
, các công cụ xây dựng phần mềm
kiểm tra xem phần đó có phù hợp với RAM không nhưng không phù hợp với
bộ nhớ flash mà nó sẽ được lập trình trong. Các công cụ tạo ra một
tệp lập trình mà không có bất kỳ dấu hiệu nào của lỗi kích thước mã.
Vấn đề này có nhiều khả năng ảnh hưởng đến bạn nếu bộ nhớ mục tiêu của bạn
là flash onchip MAX 10, tương đối nhỏ. Vấn đề này
chỉ ảnh hưởng đến bạn nếu bạn đang sử dụng alt_load()
.
Bạn có thể xác định theo cách thủ công xem mã của mình có phù hợp bằng cách tìm kiếm ở đầu tệp .objdump , được tạo khi bạn xây dựng ứng dụng của mình. Tập tin này chứa thông tin mà bạn có thể sử dụng để xác định xem mỗi phần có phù hợp trong flash hay không bộ nhớ, như được thể hiện trong ví dụ sau.
Tệp .objdump được tạo trong ứng dụng
thư mục cấp cao nhất của ứng dụng. Bạn có thể tạo ra nó từ
dòng lệnh bằng cách gõ make app
vào ứng dụng
Thư mục.
Gần đầu tệp .objdump là danh sách các các phần tương tự như sau:
Sections: | ||||||
Idx | Name | Size | VMA | LMA | File off | Algn |
0 | .entry | 00000020 | 00028000 | 00028000 | 00001000 | 2**5 |
| | CONTENTS, ALLOC, LOAD, READONLY, CODE | ||||
1 | .exceptions | 00000220 | 00028020 | 00028020 | 00001020 | 2**2 |
| | CONTENTS, ALLOC, LOAD, READONLY, CODE | ||||
2 | .text | 00006504 | 00028240 | 00028240 | 00001240 | 2**2 |
| | CONTENTS, ALLOC, LOAD, READONLY, CODE | ||||
3 | .rodata | 0000005c | 00040000 | 0002e744 | 00008000 | 2**2 |
| | CONTENTS, ALLOC, LOAD, READONLY, DATA | ||||
4 | .rwdata | 00001b78 | 0004005c | 0002e7a0 | 0000805c | 2**2 |
| | CONTENTS, ALLOC, LOAD, DATA, SMALL_DATA | ||||
5 | .bss | 00000154 | 00041bd4 | 00030318 | 00009bd4 | 2**2 |
| | ALLOC, SMALL_DATA |
Mỗi phần có giá trị cho kích thước, VMA và LMA. VMA là địa chỉ thời gian chạy và LMA là địa chỉ tải. Nếu một phần không đã sao chép, VMA = LMA. Nếu một phần được sao chép, phần đó sẽ được sao chép từ LMA đến VMA.
Trong trường hợp này, mục đích sử dụng alt_load()
, .entry
và .text
không được sao chép (VMA = LMA). .rodata
, .rwdata
,
và .bss
được sao chép từ địa chỉ flash (LMA) sang RAM
địa chỉ (VMA).
Flash trong ví dụ này có một loạt các khả 0x28000 cho 0x30000.
Phần .rwdata
được lập trình để flash bắt đầu
tại VMA = 0x2e7a0 mở rộng sang Kích thước VMA = 0x2e7a0 0x1b78 =
0x30518. Do đó nó không vừa với flash.