|
|
  |
Функции BootLoader из Main кода, Или как сэкономить Flash |
|
|
|
Mar 26 2010, 08:44
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Mar 26 2010, 10:05)  Могу ли чтобы не сэкономить место во Flash ссылаться на код BootLoader из Main? Как описать в таком случае эти функции? Можете. Причем не только для экономии места, но и для получения приложением серийного номера или каких-то данных о конфигурации конкретного железа. Самый простой метод описания: в приложении extern void func(); в ключах линкера -Dfunc=адрес Недостаток такого метода: после изменения загрузчика или просто перекомпиляции его другой версией компилятора или с другими ключами адреса функций у вас уедут. Поэтому имеет смысл в фиксированном месте загрузчика (скажем, в самом конце) разместить таблицу переходов - команды rjmp на нужные функции и из приложения переходить на эти команды. Их адрес остается неизменным. Если функций немного - можно использовать в качестве такой таблицы неиспользуемые вектора прерываний загрузчика.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2010, 09:09
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Вторая часть сообщения мне понятна конечно. Вот пытаюсь реализовать первую часть. Не знал про ваш метод, далал так: unsigned (*usbCrc16Append)(unsigned data, uchar len) = 0x18e8; В рузльтате в lss получал следующее: Код usbCrc16Append(&txStatus->buffer[1], len); 1b6: ca 01 movw r24, r20 1b8: 61 2f mov r22, r17 1ba: 70 e0 ldi r23, 0x00; 0 1bc: a2 df rcall .-188 ; 0x102 <configDescrCDC+0x1e> это мне кажеться или rcall куда-то не туда? Кстати -Dfunc=addr не канает
|
|
|
|
|
Mar 26 2010, 09:22
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Mar 26 2010, 11:09)  это мне кажеться или rcall куда-то не туда? А адрес функции разве не в словах должен быть указан? Цитата(Alexey Belyaev @ Mar 26 2010, 11:09)  Кстати -Dfunc=addr не канает Да, лопухнулся (это из ИАРа воспоминание всплыло): Код LDFLAGS += -Wl,--defsym,BootLoader=0x1800
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2010, 10:16
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Никогда не понимал отрицательных переходов. Код 1ba: 96 db rcall .-2260 ; 0xfffff8e8 <__eeprom_end+0xff7ef82c> Это куда он попадёт?  На правильный адрес оно переходит на 0x18e8, по этому адресу есть нужная функция.. Но не работает... bootloader рабоатет, а вот main нет. беда
|
|
|
|
|
Mar 26 2010, 10:27
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Mar 26 2010, 12:16)  Никогда не понимал отрицательных переходов. Код 1ba: 96 db rcall .-2260 ; 0xfffff8e8 <__eeprom_end+0xff7ef82c> Это куда он попадёт?  Иначе просто не дотянется. Он сам и посчитал: 0xfffff8e8. Теперь обрежьте до 13 бит: 0x18e8 Цитата(Alexey Belyaev @ Mar 26 2010, 12:16)  На правильный адрес оно переходит на 0x18e8, по этому адресу есть нужная функция.. Но не работает... bootloader рабоатет, а вот main нет. Отлаживайте. Студия в помощь.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2010, 12:16
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
а подскажите как в асме заменить Код breq func на известный адрес функции. точнее как её заставить перейти в адрес которого нет в коде, компилятор ругается чт не сможет туда перейти...  А как сказать что прерывание там-то? Простите конечно, я наверное ваще запарил  А можно как-то сказать компилятору или линкеру, что такая-то переменная всегда в таком-то адресе?
|
|
|
|
|
Mar 26 2010, 12:49
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Mar 26 2010, 14:16)  а подскажите как в асме заменить Код breq func на известный адрес функции. точнее как её заставить перейти в адрес которого нет в коде, компилятор ругается чт не сможет туда перейти...  Сомневаюсь, что ругается именно компилятор. Да точно так же - указать линкеру ее адрес в командной строке. Но! "Длина" перехода по команде breq весьма ограничена и линкер может ругаться на невозможность "дотянуться" до нужного адреса командной breq. Тогда нужно заменить breq func на Код brne 1f rjmp func 1: Цитата(Alexey Belyaev @ Mar 26 2010, 14:16)  А как сказать что прерывание там-то?
А можно как-то сказать компилятору или линкеру, что такая-то переменная всегда в таком-то адресе? Честно говоря не понял, что вы хотели спросить. Переформулируйте эти два вопроса более развернуто.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2010, 13:49
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
а можно краткий примерчик? --section-start=.data.mysection=0x8000200 никак не влияет на линковку  Огн всё равно помещает её туда куда хочет
|
|
|
|
|
Mar 27 2010, 02:46
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Урааа!! Заработало!!! © Шарик Огромное спасибо за наводки. В результате сделал так: Взял avr5.x и отредактировал его вот так: Код .data : AT (ADDR (.text) + SIZEOF (.text)) { PROVIDE (__data_start = .); *(.mydata.InBufOff) *(.mydata.DevAddr) *(.mydata.NewDevAddr) *(.mydata.CurrTok) *(.mydata.RxToken) *(.mydata.RxLen) *(.mydata.TxLen) *(.mydata.RxBuff) *(.mydata.TxBuff) *(.data) *(.data*) *(.rodata) /* We need to include .rodata here if gcc is used */ *(.rodata*) /* with -fdata-sections. */ *(.gnu.linkonce.d*) . = ALIGN(2); _edata = .; PROVIDE (__data_end = .); } > data Далее в Makefile его подключил вот так: Код LDFLAGS += -Wl,-T,avr5_myData.x Не совсем кошерно получилось, но зато каждая переменная стоит всегда в одном месте. И BootLoader работает и Main на базе бутлодера.
|
|
|
|
|
Mar 27 2010, 08:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Mar 27 2010, 04:46)  Взял avr5.x и отредактировал его вот так: Код .data : AT (ADDR (.text) + SIZEOF (.text)) { ... } > data Не совсем кошерно получилось, но зато каждая переменная стоит всегда в одном месте. теперь сделайте следующий шаг Код .data { ... } > data AT > text и объедините данные в структуру - будет совсем красиво.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|