Thông tin chi tiết về bộ tải khởi động Arduino


11

Ai đó có thể vui lòng giải thích làm thế nào bộ tải khởi động Arduino hoạt động? Tôi không tìm kiếm một câu trả lời cấp cao ở đây, tôi đã đọc mã và tôi nhận được ý chính của nó. Tôi cũng đã đọc qua bài viết khác này (tôi thậm chí đã từng là một trong những người trả lời nó).

Có một loạt các tương tác giao thức xảy ra giữa Arduino IDE và mã bộ nạp khởi động, cuối cùng dẫn đến một số hướng dẫn lắp ráp nội tuyến tự lập trình flash với chương trình được truyền qua giao diện nối tiếp.

Những gì tôi không rõ ràng là trên dòng 270:

void (*app_start)(void) = 0x0000; 

... mà tôi nhận ra là khai báo và khởi tạo thành NULL, của một con trỏ hàm. Có các cuộc gọi tiếp theo đến app_start ở những nơi mà bộ tải khởi động được dự định ủy quyền để thực thi mã do người dùng tải.

Chắc chắn, bằng cách nào đó app_startcần phải có được một giá trị không phải là NULL tại một số điểm để tất cả kết hợp lại với nhau. Tôi không thấy rằng trong mã bootloader ... nó có được liên kết một cách kỳ diệu bởi chương trình được tải bởi bootloader không? Tôi đoán rằng chính của bộ nạp khởi động là điểm vào phần mềm sau khi thiết lập lại chip.

Được gói trong 70 dòng lắp ráp phải là vòng giải mã bí mật cho biết chương trình chính trong đó app_start thực sự là gì? Hoặc có lẽ đó là một số kiến ​​thức ngầm được Arduino IDE tận dụng? Tất cả những gì tôi biết là nếu ai đó không thay đổi app_start để trỏ đến một nơi nào đó khác 0, mã bộ tải khởi động sẽ tự quay mãi mãi ... vậy thì mẹo gì?

Trên một lưu ý riêng, liệu mã bootloader có thể dựa vào các ngắt hay không, có phải là không?

Biên tập

Tôi quan tâm đến việc cố gắng chuyển bộ tải khởi động sang Tiny AVR (cụ thể là ATTiny44A) không có không gian bộ nhớ riêng cho mã bộ tải khởi động. Khi tôi thấy rõ rằng mã bộ nạp khởi động phụ thuộc vào một số cài đặt cầu chì và hỗ trợ chip nhất định, tôi đoán điều tôi thực sự quan tâm là biết điều gì cần thiết để chuyển bộ nạp khởi động sang một con chip không có cầu chì và phần cứng hỗ trợ (nhưng vẫn có khả năng tự lập trình)?

Tôi đã nghĩ rằng tôi có thể sử dụng triển khai AVR307 để sử dụng USI như một UART bán song công (sử dụng ngắt Timer0 và ngắt thay đổi pin). Bất cứ ai cũng có thể cung cấp hướng dẫn về cách viết / chuyển mã bộ nạp khởi động cho một con chip không hỗ trợ phần cứng cho bộ tải khởi động?

Tôi đoán rằng tôi sẽ đặt mã bộ nạp khởi động của mình ở vị trí bình thường cho địa chỉ chính (ví dụ 0x029e hoặc bất cứ nơi nào trình biên dịch đặt chính). Sau đó, tôi sẽ làm cho nó để 'địa chỉ' trong mã bộ tải khởi động đã thêm một phần bù khiến tôi vừa đi qua phần cuối của chính và đặt 'app_start' thành địa chỉ đó. Tôi đang suy nghĩ về điều này một cách chính xác hay tôi hoàn toàn thiếu một cái gì đó? Cảm ơn!

CHỈNH SỬA 2

FWIW, tôi đã tìm thấy một quy trình tài liệu về cách tải các bản phác thảo Arduino lên ATTiny85 , đó là nơi ban đầu tôi đi với câu hỏi này ... khá gọn gàng tôi nghĩ


1
stackoverflow.com/questions/3652233/arduino-bootloader/... Đã tự hỏi nơi câu trả lời của tôi đã đi ...
Nick T

Câu trả lời:


12
void (*app_start)(void) = 0x0000; 

Đây không phải là một con trỏ NULL. Đây thực sự là địa chỉ bắt đầu của mã ứng dụng, mà bộ nạp khởi động nhảy tới. Trình liên kết sắp xếp để mã ứng dụng của bạn bắt đầu tại địa chỉ 0. Xem bảng 26-6 trong biểu dữ liệu ATMEGA168.

Mã bootloader bắt đầu cao hơn trong flash. Chính xác nơi phụ thuộc vào cầu chì bootloader.


Mã chính của bộ nạp khởi động nằm ở đâu ...
Abbeyatcu

1
@Joby, ah ok ... xem cập nhật cho câu hỏi của tôi - Tôi quan tâm đến việc cố gắng chuyển bộ tải khởi động sang một Tiny Tiny không có không gian bộ nhớ riêng cho mã bộ tải khởi động.
Abbeyatcu

1
@Joby, do đó, mã bộ nạp khởi động dựa vào "... Cầu chì khởi động lại có thể được lập trình để Thiết lập lại Vector đang trỏ đến địa chỉ khởi động Boot Flash sau khi đặt lại. Trong trường hợp này, Trình tải khởi động được khởi động sau khi đặt lại. "
Abbeyatcu

3
Bạn có đặc biệt muốn bộ tải khởi động Arduino? Nó mô phỏng một lập trình viên STK500 và như vậy là hơi cồng kềnh. Có một phiên bản atmega8 trong thư mục bootloaders biên dịch dưới 1K với gcc-3, nhưng ngay cả điều đó sẽ khiến bạn khá ngắn trên đèn flash có sẵn.
Peter Gibson

3
bạn thậm chí có thực sự muốn một bộ tải khởi động không? chắc chắn đối với ATTiny, bạn nên lập trình thiết bị bằng chương trình ICSP (chẳng hạn như usbTinyISP)
SingleNegationElimination
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.