Sử dụng SDCC để biên dịch mã nguồn cho 8051 – MS51FB9AE

SDCC là trình biên dịch miễn phí có thể sử dụng để biên dịch mã cho nhiều loại VĐK như 8051, STM8, PIC… Hôm nay mình sẽ sơ lược về cách sử dụng SDCC để biên dịch mã nguồn cho 8051 nói chung và MS51FB9AE, N76E003AT20 nói riêng.

Biên dịch Project chỉ có 1 file

sdcc sourcefile.c

Câu lệnh trên sẽ làm nhiệm vụ dịch mã nguồn C tạo ra mã Assembly, dịch tiếp mã assembly, chạy chương trình liên kết Linker. Kết quả tạo ra nhiều file, trong đó file sourcefile.ihx là file định dạng hex, sử dụng để nạp vào vi điều khiển.

Tạo ra file với phần mở rộng HEX sau biên dịch

Việc này không thực sự quá cần thiết tuy nhiên file ihx do SDCC tạo ra có thể chứa các dòng với độ dài khác nhau và địa chỉ của từng dòng không được sắp xếp sẵn theo thứ tự tăng dần,… hãy sử dụng công cụ có sẵn đi kèm đó là packihx

packihx sourcefile.ihx > sourcefile.hex

Project với mã nguồn chứa trên nhiều file

sdcc chỉ có thể biên dịch 1 file tại 1 thời điểm, giả sử project chứa trên 3 file: foo1.c (chứa một số hàm), foo2.c (cũng chứa một số hàm), foomain.c (chứa một số hàm và hàm main). 2 file đầu tiên cần được biên dịch riêng biệt bằng câu lệnh

sdcc -c foo1.c
sdcc -c foo2.c

Sau đó biên dịch file foomain.c và link bằng câu lệnh

sdcc foomain.c foo1.rel foo2.rel

Một cách khác là biên dịch riêng rẽ file foomain.c giống như file foo1.c và foo2.c như trên bằng câu lệnh

sdcc -c foomain.c

Sau đó link bằng câu lệnh

sdcc foomain.rel foo1.rel foo2.rel

File chứa hàm main phải là file đầu tiên xuất hiện trong câu lệnh biên dịch.

Một số tùy chọn khác

Báo cho sdcc biết loại vi điều khiển:

-mmcs51 // sinh mã cho 8051, đây là tùy chọn mặc định
-mstm8 // sinh mã cho stm8
-mpic14 // sinh mã cho vi điều khiển PIC của microchip
-mpic16 // sinh mã cho vi điểu khiển PIC của microchip
..............
và còn nhiều tùy chọn khác. Danh sách đầy đủ tham khảo thêm trong tài liệu của sdcc


Báo cho sdcc biết dung lượng bộ nhớ ram, rom…

--iram-size <value> chỉ cho linker kiểm tra dung lượng bộ nhớ trong
--xram-size <value> chỉ cho linker kiểm tra dung lượng xram
--code-size <value> chỉ cho linker kiểm tra dung lượng flash
Giá trị <value> có thể viết ở hệ cơ số 10 hoặc 16
Ví dụ với MS51FB9AE
có 256 byte iram, 1KB xram, 16KB flash thì dùng các tùy chọn
--iram-size 256 --xram-size 1024 --code-size 16384