Как возможна встроенная сборка на 8-битном AVR?
Я знаю, что это близко к категории "глупый вопрос", но я изучал, как выполнять машинный код после 8-битной загрузки AVR, и пришел к выводу, что Гарвардская архитектура, которая используется в AVR 8- битовые микроконтроллеры делают невозможным выполнение кода нигде, кроме флэш-памяти. Как тогда можно вводить новый исполняемый код во время выполнения, используя встроенный asm?
2 ответа
Вы путаете три вещи:
Встроенная сборка
Встроенная сборка используется для передачи инструкций ассемблера компилятору C (или любого другого языка). Компилятор добавит эти инструкции ассемблера в код, который он производит. В конце инструкции встроенного ассемблера сохраняются так же, как инструкции, сгенерированные компилятором. Если вы записываете программу во флэш-память, встроенные инструкции также будут находиться во флэш-памяти.
Загрузчик
Загрузчик обычно считывает данные с некоторого входа (например, через интерфейс USB) и записывает данные во флэш-память. Таким образом, программа, отправленная в AVR, будет позже выполняться из флэш-памяти, а не из ОЗУ.
Выполнение кода из ОЗУ
Многие процессоры поддерживают это. Также многие загрузчики (для других микроконтроллеров) позволяют загружать код в ОЗУ вместо флэш-памяти и выполнять код оттуда. Вы правы: по крайней мере, большинство (может быть, все) микроконтроллеров AVR не поддерживают это!
... Гарвардская архитектура, которая используется в 8-битных микроконтроллерах AVR, делает невозможным выполнение кода из любого места, кроме флэш-памяти.
Ваше понимание верно, код может быть только из флэш-памяти.
Как тогда можно вводить новый исполняемый код во время выполнения, используя встроенный asm?
Вы можете написать код, который записывает / читает флэш-память как простые данные. На самом деле это именно то, что делают любые загрузчики. Даже если нет явного "раздела загрузчика", такого как в семействе attiny, доступ к флэш-памяти таким образом возможен. Таблица данных вашей части (стр. 263 в этом примере) содержит главу по этой теме, я бы посоветовал прочитать ее подробнее.
Тем не менее, я еще не видел код, который использует эту функцию для запуска дополнительных. Дополнительная сложность может сделать его невозможным для небольшого микроконтроллера с низким энергопотреблением, такого как AVR.