У Альтеры всё обычно слишком вычурно, если даже отыскать в доках алгоритмы -- русские мозги такое отвергают.
Вызвать свежезагруженный код из С легко через указатель на функцию, присвоив ему нужный адрес.
Но проблема обычно в том, что старая прога и новая пересекаются адресами, ибо их линкуют в одно место, и невозможно быть уверенным, что твоя "стартующая" функция окажется незатёртой при копировании обновления в своё место.
Я лет 5 назад делал 2 функции -- копир с парой адресов откуда-куда и размером, за копиром пустая функция -- чисто чтоб длину кода копира узнать по их адресам, потом копировал копира в адреса стека -- это верх обычно у всех программ, вызывал указатель на копира -- и он грузил новый образ из флэши и переходил по его 0. В дизассемблере полазить пришлось прилично, но зато ничего "демократически-нативного", всё прозрачно.
Образ программы стырить очень просто -- он уже существует правильным в ОЗУ при пуске из-под отладчика !
Я объявлял глобальную переменную, что это первый пуск, проверял на старте, при 1 обнулял переменную, открывал файл на хосте и сливал туда всё ОЗУ. Типа:
Код
int main() {
static bool first = true;
if (first) {
first = false;
FILE *f = fopen("code.bin", "wb");
...
}
...
}
Если этот бинарный образ "code.bin" положить в память в тот же адрес и перейти в начало, то там и стек правильно родится, и обнулятся нужные секции -- инитный код обычно жив и потом. А переменная first уже false, никто на хост лезть не будет при повторном старте.