Можно даже хитрее сделать. Пусть сам бутлоадер располагается ближе к концу флешки, а по нулевому адресу идет переход на него. Далее загрузчик уже сам перемещает себе таблицу векторов. А при собственно прошивке подменяет нулевой адрес из прошивки на свой, а адрес старта сохраняет к себе. Да, алгоритм получается чуть сложнее, но прозрачнее для юзерского кода.
Это все ничего не меняет кроме того, что рвет целостность загрузчика, а значит усложняет работу с линкером.
Первая страница флеша не подлежит перепрошивке без риска окирпичить МК, ибо код всегда стартует с нулевого адреса, устанавливая им стек, а стирание может быть только постраничным.
Таким образом, первая страница флеша всегда является частью бутлоадера.
При написании кода application нужно проделать всего два телодвижения, чтобы привести уже отлаженный код к работе с boot. Я не понимаю что там может быть "непрозрачного"....
Начало
main для application с комментом для отладки без boot (для boot отведено 0x4000 в начале флеша) :
- Код:
int main (void)
{
SCB->VTOR = 0x4000; // закомментировать для отладки без boot
__enable_irq();
... бла-бла-бла...
}
Установить в ноль начальный адрес кода в настройке линкера для дебага application без boot (скрин для Keil, но в IAR аналогично):
Переход на application в boot с возможностью дебага boot без application:
- Код:
void GoToApp(void)
{
uint32_t appJumpAddress;
typedef void(*pFunction)(void);
pFunction JumpToApplication;
if(!flags.reqGoToApp) return; // проверка флага требования выхода в application
flags.reqGoToApp = false;
#ifdef DEBAG_MODE
return;
#else
__disable_irq();
appJumpAddress = *( uint32_t*) (APP_ADDRESS+4); // to Reset App
JumpToApplication = (pFunction)appJumpAddress;
__set_MSP(*(__IO uint32_t*) APP_ADDRESS); // SP App
JumpToApplication();
#endif
}