PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Bootloaders - Programmers - Debuggers - Emulators

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Bootloaders - Programmers - Debuggers - Emulators Những công cụ cần thiết để lập trình cho PIC/dsPIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 01-02-2008, 04:09 PM   #1
dvdsoul
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 10
:
Smile ko chạy được application code sau khi download

Mình viết 1 trình bootloader (cho 18F67J10) và sẽ đặt nó ở vùng gần giữa của memory (bắt đầu từ 0x9000). Trong file linker mình sửa lại thành

CODEPAGE NAME=vectors START=0x0 END=0x29
CODEPAGE NAME=page START=0x9000 END=0x1FD3F // dòng này đc sửa
CODEPAGE NAME=config START=0x1FFF8 END=0x1FFFD
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF

Còn trong c18i.c vẫn giữ _entry_scn=0x000000.

Sau khi nạp xong chương trình sẽ load application code thông qua hyperterminal. Application code sẽ được lưu ở địa chỉ 0x800. Trong linker file của application code mình sửa lại như sau:

CODEPAGE NAME=boot START=0x9000 END=0x1FD3F protected
CODEPAGE NAME=vectors START=0x0 END=0x29 protected
CODEPAGE NAME=rvectors START=0x800 END=0x829 protected
CODEPAGE NAME=page START=0x82A END=0x8000

còn trong file c18i.c , sửa lại _entry_scn=0x000800. File hexa cũng đc export với start address = 0x800

Sau khi download xong application code, bootloader sẽ nhảy đến vùng nhớ có chứa application code (0x800) để bắt đầu thực thi chương trình. Mình viết là:

_asm
clrf STKPTR, 0
goto 0x800
_endasm

Đến đây thì chươgn trình ko chạy được nữa. Toàn bộ quá trình từ đầu đến sau khi download xong application code đều chạy tốt. (mình đã kiểm tra bằng cách đọc trên vùng nhớ của program memory thì thấy bootloader code và application code đều được đặt đúng chỗ)

Ko phải là dân về vi điều khiển nhưng vì có project nên mình phải nhảy ngay vào PIC18 này. Mình vẫn chưa hiểu rõ được:

- cơ chế hoạt động của reset vector và redirect nó như thế nào.
- cách thiết lập chúng ra sao (rvector trong linker file có phải là redirect vector ko? Cách mình nêu ở trên có chỗ nào sai ko?

Mong mọi người hướng dẫn giúp. Cám ơn nhiều
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-02-2008, 04:45 AM   #2
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
Xin được hỏi, dòng
Code:
CODEPAGE NAME=rvectors START=0x800 END=0x829 protected
là ở đâu mà ra (vì trong linker script chuẩn của PIC18F67J10 không có dòng này)?

Theo tôi biết thì PIC18F không hỗ trợ redirect bảng vectơ ngắt. Bạn chỉnh lại c18i.c của chương trình ứng dụng xong thì có rebuild lại startup object file c18i.o hay không? Tôi không thấy cần thiết phải di chuyển bảng vectơ ngắt của chương trình ứng dụng để dùng với bootloader, nếu bootloader được viết một cách thích hợp. Bạn tham khảo tư duy thiết kế bootloader của Claudiu Chiculita ở đây: http://www.etc.ugal.ro/cchiculita/so...bootloader.htm (phần 'General info about Bootloaders', bạn có vẻ đang làm phức tạp hóa vấn đề).

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
Old 02-02-2008, 02:41 PM   #3
dvdsoul
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 10
:
Trích:
Nguyên văn bởi namqn View Post
Xin được hỏi, dòng
Code:
CODEPAGE NAME=rvectors START=0x800 END=0x829 protected
là ở đâu mà ra (vì trong linker script chuẩn của PIC18F67J10 không có dòng này)?
Tham khảo linker của 18f8722 có cái rvector này, mình nghĩ đó là redirect vector để chương trình sẽ nhảy từ bootloader đến user code, nên đem sử dụng vào con MCU của mình. Thực sự là mình ko có nhiều kiến thức về cách hoạt động của bảng vector, nên mới post lên nhờ mọi người giải thích.

Trích:
Nguyên văn bởi namqn View Post
Bạn chỉnh lại c18i.c của chương trình ứng dụng xong thì có rebuild lại startup object file c18i.o hay không?
có, mình đã include 1 copy của c18i.c vào workspace và build nó cùng với các file khác.

Mình đã theo link đọc cách thiết kế của Claudiu Chiculita và cũng có ý định thiết kế bootloader cho mình tương tự vậy. Nhưng vì ko có kiến thức về cấu trúc của MCU (như mình đã nói ban đầu là mình phải nhảy gấp vào nó vì project) nên mình muốn hỏi là thiết lập địa chỉ cho các vector như thế nào để khi reset thì chương trình sẽ nhảy đến bootloader và từ bootloader sau khi download user program xong có thể nhảy đến user program?

Như ở bài viết đầu, mình đặt bootloader ở địa chỉ 0x9000 còn usercode ở 0x800.

Cám ơn.
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-02-2008, 05:03 PM   #4
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
Trích:
Nguyên văn bởi dvdsoul View Post
Tham khảo linker của 18f8722 có cái rvector này, mình nghĩ đó là redirect vector để chương trình sẽ nhảy từ bootloader đến user code, nên đem sử dụng vào con MCU của mình. Thực sự là mình ko có nhiều kiến thức về cách hoạt động của bảng vector, nên mới post lên nhờ mọi người giải thích.
Các linker script chuẩn của PIC18F8722 cũng không hề có dòng đó. Do đó tôi cho là bạn đã tham khảo từ một project nào đó, và bạn chưa cho biết thông tin về project đó (làm sao để đọc được linker script đó cùng các thông tin liên quan). Có thấy được toàn bộ project đó thì mới có cái nhìn rõ ràng hơn chức năng của vùng 'rvectors'. 'rvectors' chỉ là một cái tên cho vùng nhớ chương trình đó, nó không nhất thiết mang ý nghĩa là redirect vector (nhìn vào bản đồ bộ nhớ của các PIC18F thì thấy rõ là các vectơ ngắt có độ ưu tiên cao và thấp chỉ nằm ở 0x000008 và 0x000018 một cách tương ứng, không phụ thuộc vào chế độ làm việc của bộ nhớ chương trình).

Trích:
Nguyên văn bởi dvdsoul View Post
có, mình đã include 1 copy của c18i.c vào workspace và build nó cùng với các file khác.
E rằng cách làm này của bạn không ổn. Bạn hãy đọc mục 3.3.2 - Customization, trong tài liệu 'MPLAB C18 C Compiler User's Guide', nói về cách tùy biến startup code. Tài liệu này có thể download ở link sau:
http://ww1.microchip.com/downloads/e...ide_51288j.pdf
Trích:
Nguyên văn bởi dvdsoul View Post
Mình đã theo link đọc cách thiết kế của Claudiu Chiculita và cũng có ý định thiết kế bootloader cho mình tương tự vậy. Nhưng vì ko có kiến thức về cấu trúc của MCU (như mình đã nói ban đầu là mình phải nhảy gấp vào nó vì project) nên mình muốn hỏi là thiết lập địa chỉ cho các vector như thế nào để khi reset thì chương trình sẽ nhảy đến bootloader và từ bootloader sau khi download user program xong có thể nhảy đến user program?

Như ở bài viết đầu, mình đặt bootloader ở địa chỉ 0x9000 còn usercode ở 0x800.

Cám ơn.
Bạn không có kiến thức về cấu trúc của riêng PIC hay không có kiến thức về cấu trúc của các MCU nói chung? Thông tin về background của bạn sẽ giúp chúng tôi, những người đang tìm cách hỗ trợ, có được cách hỗ trợ thích hợp hơn cho bạn.

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
Old 02-02-2008, 09:12 PM   #5
dvdsoul
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 10
:
Post

Bạn nói đúng, mình đã làm vấn đề phức tạp hơn nhiều.
Sau khi tham khảo link bạn đưa và bài viết tóm tắt nội dung tìm hiểu về Tiny bootloader của Nguyễn Trung Chính (link http://picvietnam.com/forum/showthread.php?t=439), mình đã hiểu thêm đc một số điều. Theo đó giờ mình sẽ trình bày lại chương trình đã đc sửa như sau (theo như cấu trúc của bootloader mà Claudiu Chiculita đưa ra):

Bootloader sẽ được dịch với linker
vectors = 0x00 - 0x07 (4 word cho reset vector để nhảy đến boot code)
page = 0x9000 - 0x1FD3F
còn c018i vẫn ko thay đổi.

Khi download user code (dưới dạng 1 file binary),bootloader sẽ thực hiện cắt 4 word đầu tiên của file này, ghi vào ngay trên vùng nhớ chứa bootloader (0x8FF8), đồng thời thay thế vào đó 4 word đầu tiên của bộ nhớ (nằm tại vị trí 0x00). Sau đó toàn bộ user code đc ghi vào memory (từ vị trí 0x00)

Sau khi ghi xong, mình sẽ chuyển program counter đến vùng nhớ chứa 4 word được ghi ngay trên bootloader (bằng lệnh goto 0x8FF8) . Tại đây theo mình biết thì program counter sẽ đọc instruction ở đó và nhảy đến user program, lại đọc các instruction và bắt đầu thực thi.

Trong user program, mình cấu hình linker như sau:

vector 0x00 - 0x29
page 0x2A - 0x1FFF

Theo đó thì user program sẽ được ghi bắt đầu từ vị trí 0x2A. Còn các vector sẽ nằm trong khoảng 0x00-0x29.

Ko biết mình làm vậy có đúng chưa? Mình vẫn chưa hiểu rõ tác dụng của file linker, và vai trò của _entry_scn trong c018i.c

À, còn cái linker của PIC18F8722 thì mình tham khảo từ project về HPC của Microchip (http://www.microchip.com/stellent/id...&part=DM183022). Mình đọc file FAQ & trouble shooting, câu 11 có nhắc đến cái rvectors.

Mình chỉ có kiến thức rất sơ đẳng về MCU nói chung, (viết C cho các ứng dụng đơn giản sử dụng interrupt, timer, I/O, USART), những cái khác mình đọc chỗ này một ít chỗ khác một ít nên ko thực sự hiểu rõ lắm. Với PIC thì mình mới làm quen vài tuần.

Cheers
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
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
Old 20-02-2008, 06:13 PM   #7
dvdsoul
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 10
:
Cám ơn Namqn rất nhiều về những hướng dẫn rất cặn kẽ và nhiệt tình từ đầu thread đến giờ. Đây cũng là một kinh nghiệm đáng nhớ của mình khi vừa mới tập tành trong lĩnh vực MCU.

Hôm nay mình đã trao đổi với supervisor và có vài thay đổi trong project. Những phần cần thiết phải dùng C mình sẽ ko tiếp tục nữa. Do vậy mình chuyển qua dùng bootloader sẵn có viết bằng hợp ngữ. Sau khi tham khảo mình quyết định dùng AN851 vì đã có sắn 1 sample project cho con pic8F67j10.

Vấn đề còn lại là mình cần nắm nhanh được hợp ngữ để có thể điều chỉnh được chương trình theo những chức năng cần thiết của project. Mình nghĩ đi theo hướng này có thể sẽ dễ dàng hơn cho những trao đổi trên diễn đàn. Có gì thắc mắc mong mọi người cùng giúp mình với nhé.

Một lần nữa xin cảm ơn namqn
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-02-2008, 01:50 AM   #8
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
Trích:
Nguyên văn bởi dvdsoul View Post
Cám ơn Namqn rất nhiều về những hướng dẫn rất cặn kẽ và nhiệt tình từ đầu thread đến giờ. Đây cũng là một kinh nghiệm đáng nhớ của mình khi vừa mới tập tành trong lĩnh vực MCU.

Hôm nay mình đã trao đổi với supervisor và có vài thay đổi trong project. Những phần cần thiết phải dùng C mình sẽ ko tiếp tục nữa. Do vậy mình chuyển qua dùng bootloader sẵn có viết bằng hợp ngữ. Sau khi tham khảo mình quyết định dùng AN851 vì đã có sắn 1 sample project cho con pic8F67j10.

Vấn đề còn lại là mình cần nắm nhanh được hợp ngữ để có thể điều chỉnh được chương trình theo những chức năng cần thiết của project. Mình nghĩ đi theo hướng này có thể sẽ dễ dàng hơn cho những trao đổi trên diễn đàn. Có gì thắc mắc mong mọi người cùng giúp mình với nhé.

Một lần nữa xin cảm ơn namqn
Bạn dùng từ supervisor và project, vậy có lẽ bạn đang làm việc trong một công ty liên doanh/nước ngoài, cũng có thể bạn đang học ở một trường đại học nước ngoài?

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
Old 25-02-2008, 08:43 AM   #9
dvdsoul
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 10
:
Smile

Uh, mình đang thực tập cho 1 công ty nhỏ ở Singapore. Task chính của mình là software nhưng lại được giao viết firmware (cụ thể là bootloader cho con PIC) Lĩnh vực này cũng mới với mình. Hỏi thăm vài người bạn thì được giới thiệu lên PICVIETNAM

Hân hạnh được làm quen. À, mà chắc namqn đã đi làm rồi phải k?

thay đổi nội dung bởi: dvdsoul, 25-02-2008 lúc 08:51 AM.
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-02-2008, 07:36 PM   #10
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
Trích:
Nguyên văn bởi dvdsoul View Post
Uh, mình đang thực tập cho 1 công ty nhỏ ở Singapore. Task chính của mình là software nhưng lại được giao viết firmware (cụ thể là bootloader cho con PIC) Lĩnh vực này cũng mới với mình. Hỏi thăm vài người bạn thì được giới thiệu lên PICVIETNAM

Hân hạnh được làm quen. À, mà chắc namqn đã đi làm rồi phải k?
Tôi làm việc ở DHBK HCM được 8 năm thì đi học PhD ở Anh, đến nay đã hơn 3 năm rồi.

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
Old 26-02-2008, 01:44 PM   #11
dvdsoul
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 10
:
Vậy thì anh Nam lớn hơn em nhiều. Thất lễ quá.
Em cũng học BKHCM 2 năm trước khi qua Singapore, tính ra cũng được gần 3 năm rồi
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 10:48 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam