Доброго всем времени суток!
Пробовал поискать по форуму, но слишком много всего открывается, не получилось найти решения. Проблема в следующем. Для реализация прошивки контроллера новой версией firmware мне необходимо послать команду перехода на загрузчик, который я расположил в самом конце флэш-памяти процессора (по-моему, это нормально). Пока я имел дело с Mega32, все было в порядке и легко реализовывалось следующей командой:
( *( void( * )()) UPDATER_ADDR )();
где UPDATER_ADDR определялось для конкретного процессора (Mega32) как 0x7D00
Теперь адаптирую тот же загрузчик для Mega128. Там такая же конструкция приводит с адресом 0x1FD00 к переходу по адресу 0xFD00, так как упомянутая выше конструкция в ассемблерном листинге приводит к генерации конструкции ICALL, учитывая только два байта.
Судя по всему, конструкция с ссылкой на функцию интерпретируется именно так, и использовать ее в контроллерах с памятью выше 64кб не получится. Пока что я вышел из положения так:
asm("JMP 0x1FD00");
Но решение мне не нравится, так как адрес дается непосредственно в тексте модуля, который к типу контроллера никакого отношения не имеет. Есть ли возможность обойти эту проблему как-то более в духе Си?
Заранее спасибо!!!