옵션 1 : 통역 언어
이것은 직접 하지 않습니다 질문에 대답 (BTW이며, 직접 해결하는 답변에서 배우고 싶습니다) 외부 프로그램을로드하기 위해 외부 프로그램을로드 할 수있는 프로젝트를 수행 할 때 매우 일반적입니다. 통역 언어. 리소스가 부족한 경우 (이 프로세서에서 PIC32 또는 소형 ARM 프로세서 사용에 대해 생각해 보셨습니까?) 언어를 전체 사양의 하위 집합으로 제한하는 것이 일반적입니다. 더 나아가 체인은 몇 가지 작업 만 수행하는 도메인 별 언어입니다.
예를 들어, elua 프로젝트 는 리소스 부족 (64kB RAM) 해석 언어의 예입니다. 일부 기능을 제거하면 32k RAM까지 줄일 수 있습니다 (참고 : 8 비트 아키텍처 인 현재 프로세서에서는 작동하지 않습니다. 외부 RAM을 사용하면 그래픽이 너무 느릴 수 있습니다). 최소한의 API를 제공하면 새로운 사용자가 게임을 쉽게 프로그래밍 할 수있는 빠르고 유연한 언어를 제공합니다. 온라인 언어에 대한 많은 문서가 있습니다. 비슷한 방식으로 사용할 수있는 다른 언어 (Forth 및 Basic과 같은)가 있지만 현재 Lua가 최선의 선택이라고 생각합니다.
비슷한 맥락에서 고유 한 도메인 별 언어를 만들 수 있습니다. 보다 완전한 API와 외부 문서를 제공해야하지만 게임이 모두 비슷하다면 그리 어렵지 않을 것입니다.
어쨌든 PIC18은 아마도 사용자 정의 프로그래밍 / 스크립팅 및 그래픽과 관련된 것에 사용하는 프로세서가 아닐 수도 있습니다. 이 클래스의 프로세서에 익숙 할 수도 있지만, 디스플레이 드라이버와 더 많은 메모리를 사용하는 것이 좋습니다.
옵션 2 : 모든 것을 다시 프로그래밍하십시오
그러나, 이미 C에서 자신을 모든 게임 프로그래밍에 계획하는 경우, 다음로드와 귀찮게하지 않습니다 단지 SD 카드에서 게임 로직을. 32kB의 플래시 만 있으면 다시 프로그래밍 할 수 있으며이를 위해 4GB microSD 카드를 쉽게 얻을 수 있습니다. (참고 : 더 큰 카드는 종종 SDHC이므로 인터페이스하기가 더 어렵습니다). 32kB의 모든 마지막 바이트를 사용한다고 가정하면, 필요한 게임 로직에 관계없이 펌웨어의 131,072 개 사본을 SD 카드에 남겨 둘 수 있습니다.
AN851 과 같이 PIC 용 부트 로더를 작성하기위한 많은 노트가 있습니다. 특정 메모리 영역 (아마도 메모리 영역의 상단, 링커에서 지정)을 차지하도록 부트 로더를 설계하고 전체 펌웨어 프로젝트가이 영역에 도달하지 않도록 지정해야합니다. Appnote는이를 자세히 설명합니다. "PIC18F452의 부팅 섹션"을 "링커에서 지정한 부팅 섹션"으로 바꾸면됩니다.
그런 다음 부트 로더는 사용자가 SD 카드에서 실행할 프로그램을 선택하고 전체를 복사하도록 허용하면됩니다. UI는 사용자가 선택 버튼을 눌러 선택 모드로 들어가야한다는 것일 수 있습니다. 일반적으로 부트 로더는 재설정시이 버튼의 상태를 확인하기 만하고, 누르고 있지 않으면 게임으로 부팅합니다. 이 버튼을 누르고 있으면 사용자가 SD 카드에서 파일을 선택하고 프로그램을 복사 한 다음 [새로운] 게임으로 계속 부팅 할 수 있어야합니다.
이것이 나의 현재 추천입니다.
옵션 3 : 16 진 파일의 일부만 저장하는 깊은 마법
계획된 메커니즘의 문제점은 프로세서가 API 및 함수 호출을 처리하지 않고 숫자 -명령 포인터가 점프 할 수있는 주소를 처리하고 API 사양에 따라 함수 호출을 실행하는 코드가있을 것으로 예상한다는 점입니다. 이 프로그램의 단지 일부를 컴파일하려고하면 링커는 호출 할 때 무엇을해야할지 알 수 없습니다 check_button_status()
나 toggle_led()
. 이러한 기능은 프로세서의 16 진 파일에 존재하지만 어떤 주소에 있는지 정확히 알아야합니다.
링커는 이미 코드를 여러 섹션으로 나눕니다. 이론적으로 이것을 일부 -section
와 #pragma
주문 으로 추가 섹션으로 나눌 수 있습니다 . 나는 이것을 한 적이 없으며 방법을 모른다. 위의 두 가지 방법이 실패하거나 누군가가 여기에 멋진 답변을 게시 할 때 까지이 메커니즘을 배우지 못할 것이므로 가르쳐 줄 수 없습니다.