|
|
это должен делать загрузчик, т.е. маленькая п/п которая не меняется и
управление которой передается при включение процессора.
Основная программа вообще ничего не должна знать о том что
ее копируют и куда копируют и как. Единственное, что возможно,
ей придется узнать что она будет работать не из ПЗУ но это надо
будет прописать в линкере (т.е. разрулить адресное пр-во)
>>И как определить с какого адреса начинается моя программа во
>>внешней Flash и где заканчивается
опять же, в завимости от крутости линкера это надо будет делать в нем,
а именно в начале программы сделать некий заголовок где будет прописано
начало/конец программного кода или начало/размер (параметры
для функции memcpy которая будет копировать Вашу программу)
а также, если нужно, начало/размер секции BSS и других или
еще какую служебную информацию. Т.е. в FLash будет сидеть следующее:
0x00000 - 0x20000 - область загрузчика
0x40000 - 0x40010 - Нeader
0x40010 - 0xA0000 - область программы
цифры адресов от "балды".
Структура Header напрмер такая (допустим под ячейку хидера 4 байта):
0x40000 - начало бинарника программы (хотя если уже жестко все начинается с 0x40010 то можно это поле опустить)
0x40004 - размер бинарника
0x40008 - точка входа в функцию startup
0x4000С - начальное значение указателя стека (это поле на любителя)
загрузчик выполнив всю инициализацию процессора
осуществляет чтение заголовка. И, определив что он верный
вызывает следущую последовательность
void *pFunc(*void);
memcpy(SRAM_DST,*(0x40000),*(0x40008));
pFunc = *(0x40008);
pFunc();
E-mail: info@telesys.ru