микроконтроллеры Гарвардской архитектуры
Многие небольшие микроконтроллеры (Microchip PIC, Atmel AVR, Intel 8051, Cypress PSoC и т. Д.) Имеют гарвардскую архитектуру.
Они могут выполнять код только из памяти программы (флэш-память или ПЗУ).
Можно скопировать любой байт из памяти программы в оперативную память.
Однако (2) копирование исполняемых инструкций из ПЗУ в ОЗУ не является ответом - с этими небольшими микроконтроллерами счетчик программ всегда ссылается на некоторый адрес в памяти программ. Невозможно выполнить код в оперативной памяти.
Копирование данных из ПЗУ в ОЗУ встречается довольно часто.
При первом включении питания типичное встроенное программное обеспечение обнуляет всю оперативную память, а затем копирует начальные значения неконстантных глобальных и статических переменных из ПЗУ в ОЗУ непосредственно перед запуском main ().
Всякий раз, когда приложению необходимо выдвинуть фиксированную строку из последовательного порта, оно считывает эту строку из ПЗУ.
В ранних версиях этих микроконтроллеров внешний «программатор устройств», подключенный к микроконтроллеру, является единственным способом изменить программу.
В обычном режиме работы устройства не было рядом с «программатором устройства».
Если программное обеспечение, работающее на микроконтроллере, необходимо записать в ПЗУ памяти программы - извините, слишком плохо
это было невозможно.
Многие встроенные системы имели энергонезависимую ЭСППЗУ, в которую код мог записывать, но это было только для хранения значений данных. Микроконтроллер может выполнять код только в ПЗУ программы, а не в ЭСППЗУ или ОЗУ.
Люди могли делать замечательные вещи с этими микроконтроллерами, в том числе с интерпретаторами BASIC и байт-кодами Forth.
Так что, очевидно, (1) код никогда не должен записываться в память программы.
С несколькими недавними микроконтроллерами с «самопрограммированием» (от Atmel, Microchip, Cypress и т. Д.),
на чипе установлено специальное оборудование, позволяющее программному обеспечению, работающему на микроконтроллере, стирать и перепрограммировать блоки собственной флэш-памяти программ.
Некоторые приложения используют эту функцию «самопрограммирования» для чтения и записи данных в «дополнительные» флэш-блоки - данные, которые никогда не выполняются, поэтому они не считаются самоизменяющимся кодом - но это ничего не делает Вы не могли бы сделать с большей EEPROM.
До сих пор я видел только два вида программного обеспечения, работающего на микроконтроллерах Гарвардской архитектуры, которые записывают новое исполняемое программное обеспечение для своей собственной программы Flash: загрузчики и компиляторы Forth.
Когда запускается загрузчик Arduino (загрузчик начальной загрузки) и обнаруживает, что доступен новый образ прошивки приложения, он загружает новую прошивку приложения (в ОЗУ) и записывает ее во Flash.
В следующий раз, когда вы включите систему, она будет использовать новую версию прошивки приложения 16.98, а не неуклюжую старую версию приложения 16.97.
(Блоки Flash, содержащие сам загрузчик, конечно, остаются без изменений).
Это было бы невозможно без функции «самопрограммирования» записи в программную память.
Некоторые реализации Forth работают на небольшом микроконтроллере, компилируя новый исполняемый код и используя функцию «самопрограммирования» для сохранения его в программе Flash - процесс, в некоторой степени аналогичный компиляции JVM «точно в срок».
(Кажется, что все другие языки требуют слишком большого и сложного компилятора для запуска на небольшом микроконтроллере, и поэтому имеют цикл редактирования-компиляции-загрузки-запуска, который занимает намного больше времени настенных часов).