Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Как поместить функцию по заданному адресу Flash памяти

Чт окт 26, 2023 04:45:05

Можно даже хитрее сделать. Пусть сам бутлоадер располагается ближе к концу флешки, а по нулевому адресу идет переход на него. Далее загрузчик уже сам перемещает себе таблицу векторов. А при собственно прошивке подменяет нулевой адрес из прошивки на свой, а адрес старта сохраняет к себе. Да, алгоритм получается чуть сложнее, но прозрачнее для юзерского кода.

Это все ничего не меняет кроме того, что рвет целостность загрузчика, а значит усложняет работу с линкером.
Первая страница флеша не подлежит перепрошивке без риска окирпичить МК, ибо код всегда стартует с нулевого адреса, устанавливая им стек, а стирание может быть только постраничным.
Таким образом, первая страница флеша всегда является частью бутлоадера.
При написании кода 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   
}

Re: Как поместить функцию по заданному адресу Flash памяти

Чт окт 26, 2023 15:56:40

если вам потребовалось расположить функцию по фиксированному адресу, то вы явно что-то делаете не так!
Почему? Может он ваяет функцию, которая будет вызываться из разных приложений. Например - из бута и из рабочего ПО. :wink:

Добавлено after 4 minutes 6 seconds:
вероятность «окирпичивания» в момент прошивания всё таки будет при скачке питания или т.п.
Для сведения такой вероятности к 0, достаточно следовать одному простому правилу: "Никогда не писать поверх рабочего кода". Писать нужно только в пустое место.

Добавлено after 2 minutes 36 seconds:
Первая страница флеша не подлежит перепрошивке без риска окирпичить МК
+++
Ответить