Например TDA7294

Форум РадиоКот • Просмотр темы - Как поместить функцию по заданному адресу Flash памяти
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср дек 17, 2025 14:25:29

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 22 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Чт окт 26, 2023 04:45:05 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2918
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24611
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Можно даже хитрее сделать. Пусть сам бутлоадер располагается ближе к концу флешки, а по нулевому адресу идет переход на него. Далее загрузчик уже сам перемещает себе таблицу векторов. А при собственно прошивке подменяет нулевой адрес из прошивки на свой, а адрес старта сохраняет к себе. Да, алгоритм получается чуть сложнее, но прозрачнее для юзерского кода.

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

Карма: -7
Рейтинг сообщений: 187
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1649
Рейтинг сообщения: 3
если вам потребовалось расположить функцию по фиксированному адресу, то вы явно что-то делаете не так!
Почему? Может он ваяет функцию, которая будет вызываться из разных приложений. Например - из бута и из рабочего ПО. :wink:

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

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 22 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y