LINUX.ORG.RU

STM32 bootloader

 , ,


1

3

Привет,

Хочу добавить в свой девайс возможность обновления (via UART),
Нашел вот такой мануал. В прицнипе все понятно, и на этом можно было бы остановиться, но ... там предполагается, что у нас примерно такая схема флешки:
1KiB, bootloader | other, Firmware
Т.е. у нашей firmware точка входа 0x8000400, а у загрузчика 0x8000000 и всем хорошо.
Я же хочу иметь еще и резервную firmware, т.е. что-то вроде:
1KiB, bootloader | 30KiB, Firmware1 | 30KiB, Firmware2.
И вот тут-то и проблема, Я хочу единую firmware, с одной точкой входа, а не две разных (в случае с firmware2 нам нужна точка входа 0x8007c00), иначе же оно работать не будет ...
Вопрос, как можно избавиться от этой привязки (т.е. что бы firmware не была привязана к какой либо точке входа), или высчитывать её в runtime и «что-то» делать ?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от joy4eg

1. У STM32 в масочном ПЗУ есть возможность шиться через USART1 через stm32flash, без взякого бутлоадера.

2. Кури опцию gcc -fPIC

3. https://github.com/nekromant/maple-bootloader

ncrmnt ★★★★★
()
Последнее исправление: ncrmnt (всего исправлений: 1)
Ответ на: комментарий от ncrmnt

1. У STM32 в масочном ПЗУ есть возможность шиться через USART1 через stm32flash, без взякого бутлоадера.

Да, есть такое. Но мне помимо UART'a нужен еще radio level, поэтому хочу все однообразно :)

2. Кури опцию gcc -fPIC

Добавил, с виду ничего не поменялось:

Dump of assembler code for function loader:
   0x080018a8 <+0>:     push    {r3, lr}
   0x080018aa <+2>:     bl      0x8006884 <SystemInit>
   0x080018ae <+6>:     ldmia.w sp!, {r3, lr}
   0x080018b2 <+10>:    b.w     0x80018d4 <main>
End of assembler dump.

(Ожидал увидеть что-то вроде b.w (current + 42))

3. https://github.com/nekromant/maple-bootloader

Спасибо, посмотрю.

joy4eg ★★★★★
() автор топика
Ответ на: комментарий от joy4eg

-fpic + нужно скрипт линковщика менять.

Кстати, а почему бы просто не поменять для второй прошивки в скрипте линковщика стартовый адрес (естественно, с выравниванием по странице памяти)? Компиляешь первую, смотришь, где она кончается, потом подправляешь линковщик и компиляешь вторую. Соответственно, в makefile прошиваешь дважды: по адресу первой и по адресу второй.

Таким образом, адресное пространство прошивок у тебя пересекаться не будет. И из своего загрузчика ты сможешь выбрать, с какого адреса начать выполнять.

Правда, я, честно говоря, не совсем понял магического смысла сего действия. Разве что если тебе хочется сделать "firmware upgrader". Но это и штатными средствами реализуется...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Спасибо за ссылку :)

Кстати, а почему бы просто не поменять для второй прошивки в скрипте линковщика стартовый адрес (естественно, с выравниванием по странице памяти)?

Потому что Я хочу одну прошивку, которую могу шить в любую область на флешке.

joy4eg ★★★★★
() автор топика
Ответ на: комментарий от joy4eg

Я хочу одну прошивку, которую могу шить в любую область на флешке

Я не уверен, что gcc так умеет. Потому что тебе фактически нужно main() забульбенить по "плавающему" адресу.

А если попробовать сделать прошивку как динамическую библиотеку? Т.е. без main(). Все равно ведь для микроконтроллеров эта main вообще никакого значения не имеет, просто исторически сложилось так обзывать функцию, которая будет лежать по адресу, с которого начинает исполняться.

Назовешь функцию как-нибудь main_2(). Правда, она будет болтатся где-нибудь в мешанине остальных функций...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я не уверен, что gcc так умеет.

Я ему несколько облегчу задачу, под «любую область на флешке» Я имел ввиду, что данный offset мне уже известен, т.е. нужно банально выполнить функцию по адресу ... %)

См. Первое сообщение с «разметкой»

joy4eg ★★★★★
() автор топика
Последнее исправление: joy4eg (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.