View Single Post
Old 03-02-2008, 03:28 AM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Bạn có thể sử dụng tiện ích của Microchip (cung cấp dạng mã nguồn cho AN851) hoặc có thể sử dụng một tiện ích của hãng thứ ba (như Tiny Bootloader chẳng hạn). Nếu bạn chọn giải pháp của Microchip, bạn làm theo những hướng dẫn của AN851 để viết bootloader và application code (nhưng theo tôi giải pháp của Microchip rườm rà một cách không cần thiết). Nếu bạn sử dụng Tiny Bootloader chẳng hạn, bạn chỉ cần làm theo quy ước mà Claudiu đã giới thiệu. Lấy ví dụ cụ thể cho PIC18F67J10 của bạn.

Với bootloader, bạn cần dành ra một phần nhỏ ở phía cuối bộ nhớ chương trình (chú ý không đè lên các từ cấu hình). Nếu viết bằng hợp ngữ thì kích thước của bootloader thường không quá 100 word. Nếu viết bootloader bằng C thì bạn có thể xác định kích thước của bootloader bằng cách dịch xong rồi xem vùng nhớ chương trình. Vậy trong linker script của bootloader bạn chỉ cần chỉnh phần dành cho page như sau (bootloader thông thường không sử dụng ngắt):
Code:
CODEPAGE   NAME=page       START=(0x1FFF7-<kích thước của bootloader>)           END=0x1FFF7
Kích thước của bootloader đã kể đến 4 word dùng cho việc lưu trữ 4 word của vectơ reset của chương trình ứng dụng.

Với chương trình ứng dụng, bạn có thể dùng cho đến ô nhớ nằm ngay phía trước vùng nhớ dành cho bootloader, nghĩa là:
Code:
CODEPAGE   NAME=page       START=0x0002A           END=(0x1FFF7-<kích thước của bootloader>)
Đến đây bạn có thể thấy một trong những tác dụng của linker script là mô tả bản đồ bộ nhớ khả dụng cho một project cụ thể (bạn thường dùng nó để thay đổi cách trình biên dịch sử dụng bộ nhớ chương trình, bộ nhớ dữ liệu khi biên dịch project cụ thể). _entry_scn là section sẽ được chạy đầu tiên, hay là điểm vào chương trình (có ý nghĩa với trình biên dịch, chứ không nhất thiết mang ý nghĩa vật lý là điểm vào của chương trình khi bạn cấp nguồn hay reset PIC, vì PIC luôn bắt đầu chạy từ 0x000000 khi cấp nguồn hay reset).

Với cách làm của AN851, bạn thường phải chú thích 1 trong những dòng
Code:
FILES c018i.o
hay
Code:
FILES c018i_e.o
trong linker script, và phải copy c018.c hay c018i.c vào project để sửa đổi, biên dịch và liên kết với riêng project của bạn chứ không tạo ra sự thay đổi mang tính hệ thống.

Phần rvectors trong ví dụ của HPC là phần ánh xạ lại các vectơ ngắt của chương trình ứng dụng, và nếu đọc tập tin 'bootload.asm' của họ thì bạn sẽ thấy họ vẫn phải đặt các lệnh rẽ nhánh ở các vectơ ngắt cứng 0x00008 và 0x00018 để nhảy đến các đoạn xử lý ngắt tương ứng trong mã của chương trình ứng dụng (nói chung cách làm này của Microchip khá rườm rà).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn