Здравствуйте.
Я сейчас пытаюсь вникнуть в функцию самопрограммирования(self-program) и у меня возникает несколько вопросов:
1. Область памяти AVR(Мега32 и М64) разделена на 2 секции- RWW и NRWW. Может ли код приложения(т.е. из секции RWW) использовать инструкции SPM и LPM для самомодофикации? Просто везде рассмотрен только случай когда независимый загрузчик из NRWW переписывает всю флешь в RWW, а мне же надо изменить только небольшую часть программы(таблицы данных).
2. CVAVR и его линкер судя по документации не имеют дирректив или настроек для размещения разных подпрограмм по жестко фиксированным адресам(например для подпрограммы-загрузчика в памяти NRWW). Я знаю, что в AVRASM для этого есть дирректива .ORG. Я написал внутри функции ассемблерную вставку:
Код: Выделить всё
/*----------
Modify Flash
----------*/
void load_flash(void)
{
#asm(".org $3e00");
//тело функции
}
Дизассемблер сказал, что функция теперь находится по указанному адресу. Однако меня интересует поведение компилятора, ведь при вызове этой функции он может использовать инструкции с ограниченной областью действия(типа относительных переходов PC+). Учитывает ли С компилятор CVAVR при вызове подпрограмм диррективы ORG чтобы ф-ция была в пределах досягаемости?