|
gnu ld - как сделать "дырку" в памяти |
|
|
|
Aug 14 2012, 11:10
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Мне надо расположить прошивку в нижней и верхней части флеша, с пустым местом посередине. Оптимально - чтобы было занято нижние 4к и столько, сколько нужно - сверху. Но в принципе пойдет и указать размер верхнего сегмента руками. Пробовал так: Код MEMORY { ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x0000C000 rom1 (rx) : ORIGIN = 0x08000000, LENGTH = 0x00001000 rom2 (rx) : ORIGIN = 0x08000000 + 0x00040000 - 0x0001000, LENGTH = 0x00001000 }
SECTIONS { .text : { KEEP(*(.vectors)) *(.text .text.*) *(.rodata) } > rom1
.text2 : { *(.text .text.*) *(.rodata) } > rom2 ... } Ругается section `.text' will not fit in region `rom1'. Понятно, что можно руками распихать разные файлы по разным секциям, но нет ли способа сделать это автоматически?
|
|
|
|
|
 |
Ответов
|
Sep 4 2012, 12:39
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(MBR @ Sep 4 2012, 13:48)  Обычно у первичного загрузчика свой протокол, у вторичного - поверх первичного - свой. А зачем второму свой протокол? Цитата Есть таблица вызова функций для работы с железом. В смысле - вторичный загрузчик дергает по этой таблице функции из первичного? Цитата Первичный загрузчик гарантирует доставку пакетов, вторичный - занимается логикой. Ну так получается, что первичный загрузчик должен уже уметь практически все, чтобы запрошить вторичный. Во вторичный особо нечего выносить... Если бы к примеру надо было еще какую-нить дополнительную память писать - датафлеш скажем - ну тогда да, можно было бы вынести в отдельный загрузчик. А так... Цитата Кстати, вторичный загрузчик, вообще можно не держать во флеше. Грузить непосредственно первичным в ram и стартовать оттуда. Решает кучу проблем. А каких? Вроде с флешем только одна проблема - во время записи флеша проц "виснет". При стирании страницы получается ощутимо.
|
|
|
|
|
Sep 5 2012, 05:36
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(Непомнящий Евгений @ Sep 4 2012, 16:39)  А зачем второму свой протокол? Как зачем? Первичный - пакет принял, пакет отправил. Проконтролировал отправку контрольными суммами, если нужно, переслал. Что находится в пакете - ему знать не нужно, он лишь гарантированно доставляет данные, устраняя вероятные ошибки в физическом канале связи. Вторичный - парсит пакеты без траспортных заголовков, определяет, какая там логическая команда, какие данные и занимается непосредственно логикой. OSI же. Цитата(Непомнящий Евгений @ Sep 4 2012, 16:39)  В смысле - вторичный загрузчик дергает по этой таблице функции из первичного? Да. Набор этих функций минимален, и, скорее всего, не будет нуждаться в доработке. Цитата(Непомнящий Евгений @ Sep 4 2012, 16:39)  Ну так получается, что первичный загрузчик должен уже уметь практически все, чтобы запрошить вторичный. Во вторичный особо нечего выносить... Если бы к примеру надо было еще какую-нить дополнительную память писать - датафлеш скажем - ну тогда да, можно было бы вынести в отдельный загрузчик. А так... Надо исходить из того, что основные задачи первичного загрузчика: - транспортный канал с хостом - загрузка вторичного загрузчика через канал связи - обеспечить проверку подлинности и запуск вторичного загрузчика. - запустить основную прошивку, если условия запуска загрузчика не выполнены Все это занимает меньше килобайта. Цитата(Непомнящий Евгений @ Sep 4 2012, 16:39)  А каких? Вроде с флешем только одна проблема - во время записи флеша проц "виснет". При стирании страницы получается ощутимо. Главное: не нужно поддерживать на уровне хоста зоопарк версий. Прогрузили вторичный загрузчик, запустили - вот и новый протокол. Можно их делать несколько - для каждой задачи - прошивка основного флеша, прошивка датафлеш. Да хоть сброс настроек.
|
|
|
|
|
Sep 5 2012, 05:49
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(MBR @ Sep 5 2012, 09:36)  Как зачем? Первичный - пакет принял, пакет отправил. Проконтролировал отправку контрольными суммами, если нужно, переслал. Что находится в пакете - ему знать не нужно, он лишь гарантированно доставляет данные, устраняя вероятные ошибки в физическом канале связи. Вторичный - парсит пакеты без траспортных заголовков, определяет, какая там логическая команда, какие данные и занимается непосредственно логикой. OSI же. Если первому загрузчику надо заливать второй, то так не получится - ему придется парсить пакеты и отвечать на них... А заливка второго загрузчика ничем не отличается от заливки самой программы (по крайней мере в моем случае, когда прога живет во встроенном флеше). Так что опять получается, что в первом загрузчике сидит все, а во втором - почти ничего Цитата Надо исходить из того, что основные задачи первичного загрузчика: - транспортный канал с хостом - загрузка вторичного загрузчика через канал связи - обеспечить проверку подлинности и запуск вторичного загрузчика. - запустить основную прошивку, если условия запуска загрузчика не выполнены Все это занимает меньше килобайта. Ну хз насчет килобайта. У меня практически эта функциональность + шифрование + еще кое-что по мелочи едва влезла в 8 к. Компилятор gnu gcc от бывшего кодесоурсери. Писал на С с классами, без всяких наворотов, CMSIS юзал по минимуму. Цитата Главное: не нужно поддерживать на уровне хоста зоопарк версий. Прогрузили вторичный загрузчик, запустили - вот и новый протокол. Можно их делать несколько - для каждой задачи - прошивка основного флеша, прошивка датафлеш. Да хоть сброс настроек. А зачем нам новый протокол? Опять таки, функциональность устройства по железу фиксирована на момент заливки туда основного загрузчика. Т.е. если в основном загрузчике иметь разные варианты компиляции в зависимости от устройства - это с головой хватит.
|
|
|
|
|
Sep 5 2012, 06:29
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(_Артём_ @ Sep 5 2012, 10:04)  Что-то многовато. Ищи там ФУНКЦИОНАЛ навороченный? На АВР приём-передача по UART-запись-чтение прошивки в dataflash-простейшее шифрование в 4КБ влезало. В 8 наверное AES влезет и приём-передача через GSM например (GSM не проверял). IAR AVR как-то получше оптимизировал. На нем в 8К помимо того, что влезло в АРМ, втиснулась еще и индикация на дисплее. Шифрование у нас ГОСТ, прием-передача конкретно в этом случае по самодельному интерфейсу, чем-то похожему на SPI. Функционал: 1. Запись прошивки (+ проверка на совместимость + дешифровка + проверка цифровой подписи) 2. Чтение прошивки (+ шифровка, цифровая подпись) 3. Чтение информации об устройстве и статуса 4. Широковещательная запись (похожа на 1, но немного другой алгоритм) 5. Всякие мелочи - запуск программы, принудительный переход в программирование Оптимизацией сильно не занимался, просто поигрался с разными комбинациями флагов. Еще можно немного выжать, ужав таблицу прерываний - у меня даже в неиспользуемых прерываниях в конце таблицы все равно лежат нули. Писал на С с классами (просто данные и методы собирал в класс). АСМ не юзал. Цитата(MBR @ Sep 5 2012, 10:07)  Там пакета-то - код команды, блок данных, crc. Ответ ack/nack. Это 5 строчек на сях. Получить блок, проверить crc, скопировать в область памяти, увеличить счетчик. По команде запуска джампнуть на адрес. И 3 команды в минимуме - handshake + load secondary, read/write. Ну 5 строчек - это большое преуменьшение. Надо настроить переферию, прерывания, собственно прием пакетов, дешифровку, проверку цифровой подписи, возврат текущего статуса. На линии могут сидеть несколько устройств, нужно фильтровать свой адрес, уметь его сообщать, поддерживать одновременную запись неск устройств... Цитата Имхо, си c классами в загрузчике, это слишком жирно. Ну может быть. С другой стороны, чем это сильно отличается от функций + глобальных переменных? Единственное отличие - каждая функция получает доп указатель. Но у СТМ по идее тут должно быть все хорошо. Хотя надо ради интереса один класс сделать на статических переменных\функциях, возможно действительно что-то ужмется. Цитата Баги, новые команды. Да что угодно. Если устройств выпустится достаточное количество, поддерживать их будет уже геморно. Баги и новые команды сидят в самой прошивке. Если они вдруг поселятся в первичном загручике - все равно его перепрошить не получится...
|
|
|
|
Сообщений в этой теме
Непомнящий Евгений gnu ld - как сделать "дырку" в памяти Aug 14 2012, 11:10 Непомнящий Евгений Судя по вот этому http://sourceware.org/ml/binutil... Aug 14 2012, 14:40 demiurg_spb В Makefile
КодMY_FLASH_ABS_ADDRESS = 0x0F80
LDFLAG... Aug 15 2012, 05:36  aas Цитата(demiurg_spb @ Aug 15 2012, 09:36) ... Aug 16 2012, 06:30   demiurg_spb Цитата(aas @ Aug 16 2012, 10:30) У нас пр... Aug 16 2012, 07:44 Непомнящий Евгений Да, линкер какой-то недоделанный
Вроде и мощный... Aug 15 2012, 06:40 MBR Цитата(Непомнящий Евгений @ Aug 15 2012, 10... Aug 16 2012, 04:35  Сергей Борщ QUOTE (MBR @ Aug 16 2012, 07:35) С линкер... Aug 16 2012, 04:50  Непомнящий Евгений Цитата(MBR @ Aug 16 2012, 08:35) С линкер... Aug 16 2012, 10:20   aas Непомнящий Евгений,
я так понял, с дыркой собирает... Aug 16 2012, 17:49    Непомнящий Евгений Цитата(aas @ Aug 16 2012, 21:49) Ну то ес... Aug 17 2012, 05:15   MBR Цитата(Непомнящий Евгений @ Aug 16 2012, 14... Sep 4 2012, 07:30 Непомнящий Евгений радикальная идея.
Минусы:
1. надо поместиться в т... Sep 4 2012, 07:40 MBR Цитата(Непомнящий Евгений @ Sep 4 2012, 11... Sep 4 2012, 08:17 Непомнящий Евгений Тогда плиз напишите поподробнее.
Вот у меня загруз... Sep 4 2012, 09:28      _Артём_ Цитата(Непомнящий Евгений @ Sep 5 2012, 09... Sep 5 2012, 06:34    MBR Цитата(Непомнящий Евгений @ Sep 5 2012, 09... Sep 5 2012, 06:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|