|
Размещения одной и тойже прошивки по разным адресам флеш, как разместить код в произвольной области флеш? |
|
|
|
Feb 19 2009, 03:40
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Доброго времени суток, столкнулся с необходимостью размещения одной и тойже прошивки по разным адресам флешки, да ещё чтобы работало. Есть код скомпилённый начиная с адресса, пусть 0х00001000 его требуется разместить по адресамм начиная с 0х00048000. Можно это организовать? Если можно, что для этого и где требуется поправить? Что-то я совсем в этом вопросе плаваю.
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Feb 19 2009, 03:53
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(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.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Feb 19 2009, 05:44
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Хм... засада ещё в том, что кроме кода у меня ничего нет. Все мучения для осуществления удалённой смены прошивки. Флешка может хранить две копии прошивки. Удалённая сторона, которая посылает новую прошивку не знает куда (по какому из двух возможных адресов) положит её мой загрузчик, а он будет складыват соответственно в область свободную от исполняемого кода. Таким образом как не компили не угадаешь. Разбираться надо на месте, тобишь в бутлоадере. Можно, конечно, опросить сначала мою LPC2378 где, что у неё лежит и как она себя чувствует, а потом уже слать прошивку, но это совсем последний вариант.
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Feb 19 2009, 07:31
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(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.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 19 2009, 08:26
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Цитата Вам нужно просто разместить или исполнять с разного адреса один и тот-же бинарик? Если второе - то нужно скомпилить с position independent code - для gcc опция -fPIC. Нужно разместить код скомпиленный с адреса 0х1000 по адресу (0х1000+0х8000) и исполнять. В IAR есть галка position independent code, чтот с наскока не нашёл.
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Feb 19 2009, 08:45
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Цитата Если не нужно, чтобы работали обе версии - можно копировать новую на место старой. В устройстве должна постоянно работать одна из прошивок. То есть, как ни крути, задействована вся флешка со всеми вытекающими от сюда разногласиями по поводу адресного пространства.
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Feb 19 2009, 08:54
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Цитата А как такой вариант: посылать 2 версии прошивки, а загрузчик игнорирует ненужную и записывает нужную? тоже вариант, но если принимать прошивку удалённо, скажем по gprs, то при увесистой прошивки и большом количестве объектов будет накладно. дешевле всё таки, думаю, запрашивать место положение прошивки. хотя не очень красивый вариант. должно быть какое-то изящное решение  , наверное
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Feb 19 2009, 08:56
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Вам нужен просто elfloader. Все компилеры под ARM создают выходной ELF файл. У Keil-а он имеет расширение axf например. В ELF файле программа лежит не привязанная к адресам. elfloader получает задание разместить программу по нужному адресу, делает необходимые преобразования elf файла и выдает бинарный имидж готовый к загрузке и исполнению с заданного адреса Очень компактный elfloader есть в проекте http://www.sics.se/contiki/ Цитата(TanT @ Feb 19 2009, 10:45)  В устройстве должна постоянно работать одна из прошивок. То есть, как ни крути, задействована вся флешка со всеми вытекающими от сюда разногласиями по поводу адресного пространства.
|
|
|
|
|
Feb 19 2009, 09:06
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Цитата Как вариант переключения с одной прошивки на другую - текущая прошивка вызывает загрузчик, а он копирует новую на место текущей и запускает ее. А потом менять версию второй прошивки надо на более свежую. И она опять же исполняется с другого адреса. Получиться надо переписывать всю влешку, но по половинам. и всё равно держать в Центе две копии прошивки компиленные для двух диапазонов адресов. тоже вариант, тоже трудоёмкий. вот так можно и до истинны добраться  пасиб
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Feb 19 2009, 09:12
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

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

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Цитата(meister @ Feb 19 2009, 13:12)  Флэшка: [загрузчик][исполняется все время тут][пусто][новая пишется все время сюда][пусто]
Исполняется все время с одного и того же адреса. Да, только в вашем варианте работа останавливается на время перекачивания новой прошивки. Что есть большой минус. По моим расчётам для переписывания 256 кб понадобиться приблизительно 1,5 с = 400 мс стереть + 1000 переписать. билин, ещё проверить надо. хоть бы в 2 секунды уложиться. И надо в ботлоадере предусмотреть вариант востановления после сбоя во время перекачки или ошибки при перекачки, но это не сложно.
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|