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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25163
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4493455#p4493455"]Можно даже хитрее сделать. Пусть сам бутлоадер располагается ближе к концу флешки, а по нулевому адресу идет переход на него. Далее загрузчик уже сам перемещает себе таблицу векторов. А при собственно прошивке подменяет нулевой адрес из прошивки на свой, а адрес старта сохраняет к себе. Да, алгоритм получается чуть сложнее, но прозрачнее для юзерского кода.[/uquote]
Это все ничего не меняет кроме того, что рвет целостность загрузчика, а значит усложняет работу с линкером.
Первая страница флеша не подлежит перепрошивке без риска окирпичить МК, ибо код всегда стартует с нулевого адреса, устанавливая им стек, а стирание может быть только постраничным.
Таким образом, первая страница флеша всегда является частью бутлоадера.
При написании кода 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	
}
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4492810#p4492810"]если вам потребовалось расположить функцию по фиксированному адресу, то вы явно что-то делаете не так![/uquote]Почему? Может он ваяет функцию, которая будет вызываться из разных приложений. Например - из бута и из рабочего ПО. :wink:

Добавлено after 4 minutes 6 seconds:
[uquote="MarkTok",url="/forum/viewtopic.php?p=4493824#p4493824"]вероятность «окирпичивания» в момент прошивания всё таки будет при скачке питания или т.п.[/uquote]Для сведения такой вероятности к 0, достаточно следовать одному простому правилу: "Никогда не писать поверх рабочего кода". Писать нужно только в пустое место.

Добавлено after 2 minutes 36 seconds:
[uquote="КРАМ",url="/forum/viewtopic.php?p=4493833#p4493833"]Первая страница флеша не подлежит перепрошивке без риска окирпичить МК[/uquote]+++
Ответить

Вернуться в «ARM»