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_start
cầ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ĩ