Cách 1: Ngôn ngữ được giải thích
Điều này không trả lời trực tiếp câu hỏi (đó là một câu hỏi xuất sắc, BTW và tôi hy vọng sẽ học được từ một câu trả lời trực tiếp giải quyết nó), nhưng nó rất phổ biến khi thực hiện các dự án có thể tải các chương trình bên ngoài để viết các chương trình bên ngoài một ngôn ngữ diễn giải. Nếu tài nguyên eo hẹp (chúng sẽ có trên bộ xử lý này, bạn đã nghĩ đến việc sử dụng bộ xử lý PIC32 hoặc ARM nhỏ cho việc này chưa?), Việc giới hạn ngôn ngữ trong một tập hợp con của thông số kỹ thuật đầy đủ là điều phổ biến. Thậm chí xa hơn trong chuỗi là các ngôn ngữ dành riêng cho tên miền chỉ làm một vài điều.
Ví dụ, dự án elua là một ví dụ về ngôn ngữ được giải thích tài nguyên thấp (RAM 64 kB). Bạn có thể giảm xuống còn 32k RAM nếu bạn loại bỏ một số tính năng (Lưu ý: Nó không hoạt động trên bộ xử lý hiện tại của bạn, đó là kiến trúc 8 bit. Sử dụng RAM ngoài có thể sẽ quá chậm đối với đồ họa). Nó cung cấp một ngôn ngữ nhanh, linh hoạt trong đó người dùng mới có thể dễ dàng lập trình trò chơi nếu bạn cung cấp API tối thiểu. Có rất nhiều tài liệu có sẵn cho ngôn ngữ trực tuyến. Có những ngôn ngữ khác (như Forth và Basic) mà bạn có thể sử dụng theo cách tương tự, nhưng tôi nghĩ rằng Lua là lựa chọn tốt nhất vào lúc này.
Trong một tĩnh mạch tương tự, bạn có thể tạo ngôn ngữ dành riêng cho tên miền của riêng bạn. Bạn sẽ phải cung cấp API đầy đủ hơn và tài liệu bên ngoài, nhưng nếu các trò chơi hoàn toàn giống nhau thì điều này sẽ không quá khó khăn.
Trong mọi trường hợp, PIC18 có thể không phải là bộ xử lý mà tôi sử dụng cho một cái gì đó liên quan đến lập trình / kịch bản và đồ họa tùy chỉnh. Bạn có thể quen thuộc với lớp bộ xử lý này, nhưng tôi đề nghị rằng đây sẽ là thời điểm tốt để sử dụng một cái gì đó với trình điều khiển hiển thị và nhiều bộ nhớ hơn.
Cách 2: Chỉ cần lập trình lại toàn bộ
Tuy nhiên, nếu bạn đã có kế hoạch tự lập trình tất cả các trò chơi trong C, thì đừng bận tâm đến việc chỉ tải logic trò chơi từ thẻ SD. Bạn chỉ cần 32kB Flash để lập trình lại và có thể dễ dàng nhận được thẻ nhớ 4 GB cho việc này. (Lưu ý: thẻ lớn hơn thường là SDHC, khó giao tiếp hơn). Giả sử rằng bạn sử dụng mọi byte cuối cùng trong 32 kB của mình, sẽ chừa chỗ trên thẻ SD cho 131.072 bản sao chương trình cơ sở của bạn với bất kỳ logic trò chơi nào bạn cần.
Có rất nhiều chú thích để viết bộ tải khởi động cho PIC, như AN851 . Bạn cần thiết kế bộ tải khởi động của mình để chiếm một vùng bộ nhớ cụ thể (có thể là đỉnh của vùng nhớ, bạn sẽ chỉ định điều này trong trình liên kết) và chỉ định rằng các dự án phần sụn đầy đủ không đến được vùng này. Các appnote đánh vần điều này chi tiết hơn. Chỉ cần thay thế "Phần khởi động của PIC18F452" bằng "Phần khởi động tôi chỉ định trong trình liên kết" và tất cả sẽ có ý nghĩa.
Sau đó, bộ tải khởi động của bạn chỉ cần cho phép người dùng chọn một chương trình để chạy từ thẻ SD và sao chép toàn bộ nội dung. Một giao diện người dùng có thể là người dùng phải giữ một nút ấn để vào chế độ lựa chọn. Thông thường, bộ nạp khởi động sẽ chỉ kiểm tra trạng thái của nút này khi thiết lập lại và nếu không được nhấn, hãy khởi động vào trò chơi. Nếu nó được giữ, nó sẽ cần cho phép người dùng chọn một tệp trên thẻ SD, sao chép chương trình và tiếp tục khởi động vào trò chơi [mới].
Đây là khuyến nghị hiện tại của tôi.
Tùy chọn 3: Phép thuật sâu liên quan đến việc chỉ lưu trữ một phần của tệp hex
Vấn đề với cơ chế được hình dung của bạn là bộ xử lý không xử lý các lệnh gọi API và hàm, nó xử lý các số - địa chỉ mà con trỏ lệnh có thể nhảy và dự kiến sẽ có mã thực hiện lệnh gọi hàm theo thông số API. Nếu bạn cố gắng biên dịch chỉ là một phần của chương trình, trình liên kết sẽ không biết phải làm gì khi bạn gọi check_button_status()
hoặc toggle_led()
. Bạn có thể biết rằng các hàm đó tồn tại trong tệp hex trên bộ xử lý, nhưng nó cần biết chính xác địa chỉ mà chúng cư trú.
Trình liên kết đã chia mã của bạn thành nhiều phần; bạn về mặt lý thuyết có thể phá vỡ này thành các phần bổ sung với một số -section
và #pragma
những câu thần chú. Tôi chưa bao giờ làm điều này, và không biết làm thế nào. Cho đến khi hai phương pháp trên làm tôi thất bại (hoặc ai đó đăng câu trả lời tuyệt vời ở đây), tôi có thể sẽ không học cơ chế này và vì vậy tôi không thể dạy nó cho bạn.