Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Функции BootLoader из Main кода
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Spider
Всем привет!

Имею ATMega8 и WinAVR. Имеется BOOTLOADER в котором есть некий код, точно такой же код используется и в самом приложении Main. Могу ли чтобы не сэкономить место во Flash ссылаться на код BootLoader из Main?
Как описать в таком случае эти функции?
Сергей Борщ
Цитата(Alexey Belyaev @ Mar 26 2010, 10:05) *
Могу ли чтобы не сэкономить место во Flash ссылаться на код BootLoader из Main?
Как описать в таком случае эти функции?
Можете. Причем не только для экономии места, но и для получения приложением серийного номера или каких-то данных о конфигурации конкретного железа.
Самый простой метод описания: в приложении extern void func(); в ключах линкера -Dfunc=адрес
Недостаток такого метода: после изменения загрузчика или просто перекомпиляции его другой версией компилятора или с другими ключами адреса функций у вас уедут. Поэтому имеет смысл в фиксированном месте загрузчика (скажем, в самом конце) разместить таблицу переходов - команды rjmp на нужные функции и из приложения переходить на эти команды. Их адрес остается неизменным. Если функций немного - можно использовать в качестве такой таблицы неиспользуемые вектора прерываний загрузчика.
Spider
Вторая часть сообщения мне понятна конечно. Вот пытаюсь реализовать первую часть.
Не знал про ваш метод, далал так:
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 не канает
Сергей Борщ
Цитата(Alexey Belyaev @ Mar 26 2010, 11:09) *
это мне кажеться или rcall куда-то не туда?
А адрес функции разве не в словах должен быть указан?
Цитата(Alexey Belyaev @ Mar 26 2010, 11:09) *
Кстати -Dfunc=addr не канает
Да, лопухнулся (это из ИАРа воспоминание всплыло):
Код
LDFLAGS += -Wl,--defsym,BootLoader=0x1800
Spider
Никогда не понимал отрицательных переходов.
Код
1ba:    96 db           rcall    .-2260   ; 0xfffff8e8 <__eeprom_end+0xff7ef82c>

Это куда он попадёт? smile.gif

На правильный адрес оно переходит на 0x18e8, по этому адресу есть нужная функция.. Но не работает... bootloader рабоатет, а вот main нет.
беда sad.gif
Сергей Борщ
Цитата(Alexey Belyaev @ Mar 26 2010, 12:16) *
Никогда не понимал отрицательных переходов.
Код
1ba:    96 db           rcall    .-2260  ; 0xfffff8e8 <__eeprom_end+0xff7ef82c>

Это куда он попадёт? smile.gif
Иначе просто не дотянется. Он сам и посчитал: 0xfffff8e8. Теперь обрежьте до 13 бит: 0x18e8
Цитата(Alexey Belyaev @ Mar 26 2010, 12:16) *
На правильный адрес оно переходит на 0x18e8, по этому адресу есть нужная функция.. Но не работает... bootloader рабоатет, а вот main нет.
Отлаживайте. Студия в помощь.
Spider
а подскажите как в асме заменить
Код
breq    func

на известный адрес функции.


точнее как её заставить перейти в адрес которого нет в коде, компилятор ругается чт не сможет туда перейти... sad.gif

А как сказать что прерывание там-то?

Простите конечно, я наверное ваще запарил smile.gif
А можно как-то сказать компилятору или линкеру, что такая-то переменная всегда в таком-то адресе?
Сергей Борщ
Цитата(Alexey Belyaev @ Mar 26 2010, 14:16) *
а подскажите как в асме заменить
Код
breq    func

на известный адрес функции.


точнее как её заставить перейти в адрес которого нет в коде, компилятор ругается чт не сможет туда перейти... sad.gif

Сомневаюсь, что ругается именно компилятор. Да точно так же - указать линкеру ее адрес в командной строке. Но! "Длина" перехода по команде breq весьма ограничена и линкер может ругаться на невозможность "дотянуться" до нужного адреса командной breq. Тогда нужно заменить breq func на
Код
    brne 1f
    rjmp func
1:

Цитата(Alexey Belyaev @ Mar 26 2010, 14:16) *
А как сказать что прерывание там-то?

А можно как-то сказать компилятору или линкеру, что такая-то переменная всегда в таком-то адресе?
Честно говоря не понял, что вы хотели спросить. Переформулируйте эти два вопроса более развернуто.
Spider
Я хочу чтобы и в бутлодере и в приложении некоторые переменные были в одном и том же адресе
Сергей Борщ
Цитата(Alexey Belyaev @ Mar 26 2010, 14:59) *
Я хочу чтобы и в бутлодере и в приложении некоторые переменные были в одном и том же адресе
Размещайте их в свою секцию (.data.mysection (или .bss.mysection)) и в скрипте линкера перед описанием выходной секции .data (.bss) опишите свою выходную секцию, в которую сложите эти секции. Имя должно начинаться с .data или .bss, ибо по этому имени переменные получают дополнительные атрибуты.
Spider
а можно краткий примерчик?

--section-start=.data.mysection=0x8000200

никак не влияет на линковку sad.gif Огн всё равно помещает её туда куда хочет
Spider
Урааа!! Заработало!!! © Шарик
Огромное спасибо за наводки.
В результате сделал так:
Взял 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 на базе бутлодера.
Сергей Борщ
Цитата(Alexey Belyaev @ Mar 27 2010, 04:46) *
Взял avr5.x и отредактировал его вот так:
Код
.data      : AT (ADDR (.text) + SIZEOF (.text))
  {    
...
  }  > data
Не совсем кошерно получилось, но зато каждая переменная стоит всегда в одном месте.
теперь сделайте следующий шаг
Код
.data
  {    
...
  }  > data AT > text
и объедините данные в структуру - будет совсем красиво.
Spider
Про структуру я читал, но вот у меня пока проблема как обращаться к элементам структуры из asm.
как-то так: структура+смещение?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.