Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размещения одной и тойже прошивки по разным адресам флеш
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
TanT
Доброго времени суток, столкнулся с необходимостью размещения одной и тойже прошивки по разным адресам флешки, да ещё чтобы работало. Есть код скомпилённый начиная с адресса, пусть 0х00001000 его требуется разместить по адресамм начиная с 0х00048000. Можно это организовать? Если можно, что для этого и где требуется поправить? Что-то я совсем в этом вопросе плаваю.
A. Fig Lee
Цитата(TanT @ Feb 18 2009, 22:40) *
Доброго времени суток, столкнулся с необходимостью размещения одной и тойже прошивки по разным адресам флешки, да ещё чтобы работало. Есть код скомпилённый начиная с адресса, пусть 0х00001000 его требуется разместить по адресамм начиная с 0х00048000. Можно это организовать? Если можно, что для этого и где требуется поправить? Что-то я совсем в этом вопросе плаваю.


лихко! (теоретицки) на практике у меня так и не получилось.
то есть в линкер скрипте там опция есть "AT":

например:
Код
SECTIONS
{
     . = 0;                              /* set location counter to address zero  */

    startup : { *(.startup)} >flash     /* the startup code goes into FLASH */


     .text :                             /* collect all sections that should go into FLASH after startup  */
     {
        *(.text)                        /* all .text sections (code)  */
        *(.rodata)                      /* all .rodata sections (constants, strings, etc.)  */
         *(.rodata*)                     /* all .rodata* sections (constants, strings, etc.)  */
        *(.glue_7)                      /* all .glue_7 sections  (no idea what these are) */
        *(.glue_7t)                     /* all .glue_7t sections (no idea what these are) */
        _etext = .;                     /* define a global symbol _etext just after the last code byte */
    } >ram AT>flash                            /* put all the above into RAM and copy in FLASH */


код должен скомпилится для локейшен RAM, но записатся во FLASH.

онако - фигушки, VMA и LMA один и тот же - RAM.
TanT
Хм... засада ещё в том, что кроме кода у меня ничего нет.
Все мучения для осуществления удалённой смены прошивки. Флешка может хранить две копии прошивки. Удалённая сторона, которая посылает новую прошивку не знает куда (по какому из двух возможных адресов) положит её мой загрузчик, а он будет складыват соответственно в область свободную от исполняемого кода. Таким образом как не компили не угадаешь. Разбираться надо на месте, тобишь в бутлоадере.
Можно, конечно, опросить сначала мою LPC2378 где, что у неё лежит и как она себя чувствует, а потом уже слать прошивку, но это совсем последний вариант.
amw
Цитата(TanT @ Feb 19 2009, 07:44) *
Хм... засада ещё в том, что кроме кода у меня ничего нет.
Все мучения для осуществления удалённой смены прошивки. Флешка может хранить две копии прошивки. Удалённая сторона, которая посылает новую прошивку не знает куда (по какому из двух возможных адресов) положит её мой загрузчик, а он будет складыват соответственно в область свободную от исполняемого кода. Таким образом как не компили не угадаешь. Разбираться надо на месте, тобишь в бутлоадере.
Можно, конечно, опросить сначала мою LPC2378 где, что у неё лежит и как она себя чувствует, а потом уже слать прошивку, но это совсем последний вариант.

Вам нужно просто разместить или исполнять с разного адреса один и тот-же бинарик?
Если второе - то нужно скомпилить с position independent code - для gcc опция -fPIC.
И стартап нужно написать правильно, без привязки к конкретным адресам, а вычисляя их по время выполнения.
Куда прошивку будет ложить бутлоадер - это ему (бутлоадеру) придется решать. Он на то и бутлоадер, чтобы знать что и где у него лежить и куда писать новую прошивку.

Цитата(A. Fig Lee @ Feb 19 2009, 05:53) *
лихко! (теоретицки) на практике у меня так и не получилось.
то есть в линкер скрипте там опция есть "AT":

например:
Код
SECTIONS
{
     . = 0;                              /* set location counter to address zero  */

    startup : { *(.startup)} >flash     /* the startup code goes into FLASH */


     .text :                             /* collect all sections that should go into FLASH after startup  */
     {
        *(.text)                        /* all .text sections (code)  */
        *(.rodata)                      /* all .rodata sections (constants, strings, etc.)  */
         *(.rodata*)                     /* all .rodata* sections (constants, strings, etc.)  */
        *(.glue_7)                      /* all .glue_7 sections  (no idea what these are) */
        *(.glue_7t)                     /* all .glue_7t sections (no idea what these are) */
        _etext = .;                     /* define a global symbol _etext just after the last code byte */
    } >ram AT>flash                            /* put all the above into RAM and copy in FLASH */


код должен скомпилится для локейшен RAM, но записатся во FLASH.

онако - фигушки, VMA и LMA один и тот же - RAM.

На практике нужно стартап написать так, чтобы он не использовал абсолютной адресации и скопировал себя (т.е. всу прошивку) в RAM.
meister
Цитата(TanT @ Feb 19 2009, 09:44) *
Флешка может хранить две копии прошивки.


Если не нужно, чтобы работали обе версии - можно копировать новую на место старой.
TanT
Цитата
Вам нужно просто разместить или исполнять с разного адреса один и тот-же бинарик?
Если второе - то нужно скомпилить с position independent code - для gcc опция -fPIC.


Нужно разместить код скомпиленный с адреса 0х1000 по адресу (0х1000+0х8000) и исполнять.

В IAR есть галка position independent code, чтот с наскока не нашёл.
scifi
А как такой вариант: посылать 2 версии прошивки, а загрузчик игнорирует ненужную и записывает нужную?
TanT
Цитата
Если не нужно, чтобы работали обе версии - можно копировать новую на место старой.

В устройстве должна постоянно работать одна из прошивок. То есть, как ни крути, задействована вся флешка со всеми вытекающими от сюда разногласиями по поводу адресного пространства.
meister
Цитата(TanT @ Feb 19 2009, 12:45) *
В устройстве должна постоянно работать одна из прошивок. То есть, как ни крути, задействована вся флешка со всеми вытекающими от сюда разногласиями по поводу адресного пространства.


Как вариант переключения с одной прошивки на другую - текущая прошивка вызывает загрузчик, а он копирует новую на место текущей и запускает ее.
TanT
Цитата
А как такой вариант: посылать 2 версии прошивки, а загрузчик игнорирует ненужную и записывает нужную?


тоже вариант, но если принимать прошивку удалённо, скажем по gprs, то при увесистой прошивки и большом количестве объектов будет накладно.
дешевле всё таки, думаю, запрашивать место положение прошивки. хотя не очень красивый вариант.

должно быть какое-то изящное решение smile.gif , наверное sad.gif
MrYuran
Цитата(TanT @ Feb 19 2009, 11:26) *
В IAR есть галка position independent code, чтот с наскока не нашёл.

Нажмите для просмотра прикрепленного файла
Заглавная вкладка свойств проекта
AlexandrY
Вам нужен просто elfloader.
Все компилеры под ARM создают выходной ELF файл.
У Keil-а он имеет расширение axf например.
В ELF файле программа лежит не привязанная к адресам.
elfloader получает задание разместить программу по нужному адресу, делает необходимые преобразования elf файла и выдает бинарный имидж готовый к загрузке и исполнению с заданного адреса
Очень компактный elfloader есть в проекте http://www.sics.se/contiki/

Цитата(TanT @ Feb 19 2009, 10:45) *
В устройстве должна постоянно работать одна из прошивок. То есть, как ни крути, задействована вся флешка со всеми вытекающими от сюда разногласиями по поводу адресного пространства.
TanT
Цитата
Как вариант переключения с одной прошивки на другую - текущая прошивка вызывает загрузчик, а он копирует новую на место текущей и запускает ее.

А потом менять версию второй прошивки надо на более свежую. И она опять же исполняется с другого адреса. Получиться надо переписывать всю влешку, но по половинам. и всё равно держать в Центе две копии прошивки компиленные для двух диапазонов адресов. тоже вариант, тоже трудоёмкий. вот так можно и до истинны добраться wink.gif пасиб
meister
Цитата(TanT @ Feb 19 2009, 13:06) *
А потом менять версию второй прошивки надо на более свежую. И она опять же исполняется с другого адреса. Получиться надо переписывать всю влешку, но по половинам. и всё равно держать в Центе две копии прошивки компиленные для двух диапазонов адресов. тоже вариант, тоже трудоёмкий. вот так можно и до истинны добраться wink.gif пасиб


Флэшка: [загрузчик][исполняется все время тут][пусто][новая пишется все время сюда][пусто]

Исполняется все время с одного и того же адреса.
TanT
Цитата(meister @ Feb 19 2009, 13:12) *
Флэшка: [загрузчик][исполняется все время тут][пусто][новая пишется все время сюда][пусто]

Исполняется все время с одного и того же адреса.


Да, только в вашем варианте работа останавливается на время перекачивания новой прошивки. Что есть большой минус. По моим расчётам для переписывания 256 кб понадобиться приблизительно 1,5 с = 400 мс стереть + 1000 переписать. билин, ещё проверить надо. хоть бы в 2 секунды уложиться.
И надо в ботлоадере предусмотреть вариант востановления после сбоя во время перекачки или ошибки при перекачки, но это не сложно.
TanT
Ууу, сколько уже времени прошло. Загрузчик я сделал, по варианту, когда рабочая прошивка всегда лежит по одному фиксированному адресу. Но сейчас опять задумался про ELFloader. AlexandrY давал ссылку, но что-т я там ничего не обнаружил. Есть рекомендации как строить ELFLoader для LPC 23 серии в условиях ограниченных ресурсов? wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.