Цитата
1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?)
Забыли шаг 0. Необходимо собрать (слинковать) исполняемую программу с адреса 0х40000000 в бинарник(если конечно хотите просто копировать в RAM без всяких преобразований). Естественно таблица векторов исполняемой программы должна быть в этом бинарнике и располагаться вначале.
После этого записать бинарник на внешний носитель (датафлэш ,SD).
Цитата
Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?)
Как считали данные с внеш. носителя: отключить прерывания, скопировать данные в RAM с адреса 0х40000000. При этом загрузчик, который записан во флэш контроллера, должен быть собран так, чтобы переменные загрузчика не располагались по адресам 0х40000000 - (0х40000000+Длина исполняемой программы) иначе при копировании загрузчик похерит сам себя.
Цитата
3. Настроить -- MEMMAP=0x02
Да.
Цитата
4. Запустить
start=(void (*)(void))0x40000040(или0х40000000);
start();
с адреса 0х40000000 или 0х0, если сделали ремап на ОЗУ, то это уже одни и теже адреса.
первые 64 байта исполняемой программы должны быть вида:
CODE
_exception_vectors:
LDR PC, ResetAddr /* Reset */
LDR PC, UndefAddr /* Undefined instruction */
LDR PC, SWIAddr /* Software interrupt */
LDR PC, PAbortAddr /* Prefetch abort */
LDR PC, DAbortAddr /* Data abort */
NOP /* Reserved */
LDR PC, IRQAddr /* IRQ interrupt */
LDR PC, FIQAddr /* FIQ interrupt */
ResetAddr:
.word ResetHandler
UndefAddr:
.word UndefHandler
SWIAddr:
.word SWIHandler
PAbortAddr:
.word PAbortHandler
DAbortAddr:
.word DAbortHandler
NOP
IRQAddr:
.word IRQHandler
FIQAddr:
.word FIQHandler
Цитата
5. Пить пиво
Можно и коньячку.
При использовании загрузчиков, одна из основных загвоздок, это правильно слинковать загрузчик и исполняемую программу. И правильно скопировать таблицу векторов исполняемой программы в ОЗУ (здесь тоже возможно несколько вариантов).
Удачи.