![]() |
|
Tài trợ cho PIC Vietnam |
Bootloaders - Programmers - Debuggers - Emulators Những công cụ cần thiết để lập trình cho PIC/dsPIC |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#10 | |
Trưởng lão PIC bang
|
Trích:
+ Khả năng thứ nhất, bạn không ghi đè reset vector của chương trình ứng dụng lên reset vector của bootloader (reset vector của bootloader và chương trình ứng dụng là giống nhau và đều là 0x000000). Khi đó, lệnh goto đến địa chỉ reset vector của chương trình ứng dụng sẽ sử dụng reset vector của bootloader, và như vậy bootloader sẽ chạy lại, chứ không phải chương trình ứng dụng được gọi. + Khả năng thứ hai, bạn ghi đè reset vector của chương trình ứng dụng lên reset vector của bootloader. Khi đó, lệnh goto đến địa chỉ reset vector của chương trình ứng dụng sẽ chạy chương trình ứng dụng, nhưng reset vector của bootloader đã bị hỏng, dẫn đến lần reset tiếp theo của phần cứng sẽ không thể kích hoạt bootloader, mà chạy thẳng chương trình ứng dụng. Ở đây, vấn đề là bootloader phải được kích hoạt mỗi khi phần cứng được reset, và khi nạp chương trình ứng dụng vào flash của chip thì bootloader phải biết được địa chỉ bắt đầu của chương trình ứng dụng để lưu lại, sau đó sẽ chuyển điều khiển đến địa chỉ đó khi đã nạp xong chương trình ứng dụng vào flash. Theo nguyên tắc, địa chỉ bắt đầu của chương trình ứng dụng phải nằm trong 4 word đầu tiên của flash (tức là các địa chỉ 0x000000 - 0x000003), và nó là thành phần của một lệnh chuyển điều khiển như rcall, call, hay goto. Với Tiny Bootloader, phần công việc xác định địa chỉ bắt đầu của chương trình ứng dụng được phần mềm trên host PC đảm nhiệm (thông qua việc đọc tập tin .hex của chương trình ứng dụng, và phân tích các lệnh nằm trong vùng địa chỉ 0x000000 - 0x000003), do đó firmware của Tiny Bootloader có thể được viết ở mức độ rất đơn giản, với giao thức giữa phần mềm trên host PC và firmware được quy ước ở mức độ tương đối thấp. Với trường hợp của bạn, phần mềm trên host PC (Hyper Terminal) chỉ được dùng để truyền thông tin dạng ASCII đến bootloader, mọi công việc còn lại đều phải được hiện thực trong bootloader, từ việc phân tích tập tin .hex, xác định địa chỉ và giá trị của ô nhớ, đến việc xác định địa chỉ bắt đầu của chương trình ứng dụng cũng như bảo vệ vùng nhớ của bootloader khỏi việc bị ghi đè, ... Theo tôi, cách tiếp cận của Claudiu là hiệu quả nhất, và bạn hoàn toàn có thể tự tin khi phát biểu rằng bootloader là do bạn tạo ra, ngay cả khi bạn chỉ sửa lại mã hợp ngữ của firmware để có thể chạy trên PIC18F67J10 với cấu hình của riêng bạn. Nếu bạn vẫn muốn tiếp tục đi theo con đường hiện nay, bạn hãy tham khảo những gợi ý của tôi. Quan trọng nhất là xác định địa chỉ bắt đầu của chương trình ứng dụng, thông qua 4 từ lệnh của vùng 0x000000 - 0x000003 trong mã lệnh của chương trình ứng dụng, lưu địa chỉ đó lại, sau đó dùng lệnh goto đến địa chỉ đó, khi bootloader đã làm xong nhiệm vụ, chứ không nhảy đến reset vector của chương trình ứng dụng (tức là địa chỉ 0x000000). 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 |
|
![]() |
![]() |
|
|