|
WinAVR и ELPM, ставит lpm вместо elpm |
|
|
|
Sep 30 2008, 21:39
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 5-05-08
Пользователь №: 37 279

|
Столкнулся с такой проблемой: ATmega1280, пишу bootloader, в 0 адресе все работает. Передвигаю на 0x01E000 - не запускается. Смотрю дебагером и обнаруживаю, что там, где должна быть инструкция ELPM - стоит LPM (хотя RAMPZ установлен верно). Соответственно данные читаются не из того места, и переход выполняется в адрес где-то за пределами кода. Пока программа лежала в 0 адресе, не было переполнения на 16-й бит адреса и все работало нормально. Кто нибудь сталкивался? Может какие ключи компиляции помогут? Или вручную опкоды править?
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Oct 1 2008, 18:33
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 5-05-08
Пользователь №: 37 279

|
По идее проблему можно решить, создавая объекты только локально. Но, ИМХО, для scmRTOS это невозможно без изменения самой ОС.
Временно решил проблему заменой в хекс редакторе неверных опкодов 9005 и 91F4 соответственно на 9007 и 91F6. Все заработало.
Вот если бы патчик написать, который сам это делать будет.
|
|
|
|
|
Oct 1 2008, 20:04
|

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

|
Цитата(ZyBEX @ Oct 1 2008, 21:33)  По идее проблему можно решить, создавая объекты только локально. Ну, это не решение, скорее обход, и не совсем удачный. Цитата(ZyBEX @ Oct 1 2008, 21:33)  Вот если бы патчик написать, который сам это делать будет. Попробуйте добавить в проект ассемблерный файлик, в котором будет правильный код от метки __tablejump2__ до ijmp. При линковке он должен подлинковаться вместо библиотечного.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 2 2008, 20:22
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 5-05-08
Пользователь №: 37 279

|
[SOLVED]Цитата(Сергей Борщ @ Oct 2 2008, 00:04)  Попробуйте добавить в проект ассемблерный файлик, в котором будет правильный код от метки __tablejump2__ до ijmp. При линковке он должен подлинковаться вместо библиотечного. Действительно, сработало. Создал файл tablejump_patch.S со следующим содержимым: Код ;.global __tablejump2__ ;__tablejump2__: ; add r30, r30 ; adc r31, r31
.global __tablejump__ __tablejump__: elpm r0, Z+ elpm r31, Z mov r30, r0 ijmp Здесь tablejump2 закомментирован потому, что он не используется в моем варианте (хотя case есть, вопреки тому что сказал aesok, ссылка на tablejump только в одном месте). Когда наращу программу, если компилятор попросит, раскомментирую. Если что, сюда же можно добавить работу с RAMPZ... Всем спасибо!
Сообщение отредактировал ZyBEX - Oct 2 2008, 20:25
|
|
|
|
|
Oct 2 2008, 20:32
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ZyBEX @ Oct 3 2008, 00:22)  (хотя case есть, вопреки тому что сказал aesok, ссылка на tablejump только в одном месте). Я же писал: Цитата когда в case больше 16 ветвей Анатолий. PS: Безопаснее будет если Вы напишете новые версии __do_global_ctors и __do_global_dtors которые используют не __tablejump__, а новую функцию аналогичную __tablejump__ но с инструкциями ELPM.
Сообщение отредактировал aesok - Oct 2 2008, 20:42
|
|
|
|
|
Oct 2 2008, 21:04
|

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

|
Цитата(aesok @ Oct 2 2008, 23:32)  PS: Безопаснее будет если Вы напишете новые версии __do_global_ctors и __do_global_dtors которые используют не __tablejump__, а новую функцию аналогичную __tablejump__ но с инструкциями ELPM. У него ведь все приложение, включая ветки case находится в верхней памяти. Т.е. при использовании lpm в case программа навернется с тем же успехом. Цитата(ZyBEX @ Oct 2 2008, 23:22)  Когда наращу программу, если компилятор попросит, раскомментирую. Он не попросит. Он молча подтянет __tablejump2__ из библиотеки.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 3 2008, 00:40
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 5-05-08
Пользователь №: 37 279

|
Цитата(Сергей Борщ @ Oct 3 2008, 01:04)  У него ведь все приложение, включая ветки case находится в верхней памяти. Т.е. при использовании lpm в case программа навернется с тем же успехом. . . . Он не попросит. Он молча подтянет __tablejump2__ из библиотеки. Тогда лучше сделать так: Код .global __tablejump2__ __tablejump2__: clr r0 ; очищаем RAMPZ out 0x3B, r0 ; r0 в out'е можно использовать? add r30, r30 ; умножаем Z на 2 adc r31, r31 brcc __tablejump__ ; если было переполнение, RAMPZ = 0x01 ldi r0, 0x01 ; если так нельзя, тогда: clr r0 inc r0 out 0x3B, r0
.global __tablejump__ __tablejump__: elpm r0, Z+ elpm r31, Z mov r30, r0 ijmp
Сообщение отредактировал ZyBEX - Oct 3 2008, 00:57
|
|
|
|
|
Oct 3 2008, 08:04
|

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

|
Цитата(ZyBEX @ Oct 3 2008, 03:40)  Тогда лучше сделать так: Нет, лучше так: Код .global __tablejump2__ __tablejump2__: add r30, r30 ; умножаем Z на 2 adc r31, r31 adc r1, r1 ; r1 всегда содержит 0 в avr-gcc out 0x3B, r1 ; устанавливаем RAMPZ clr r1 ; возвращаем r1 в исходное состояние .global __tablejump__ __tablejump__: elpm r0, Z+ elpm r31, Z mov r30, r0 ijmp
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
ZyBEX WinAVR и ELPM Sep 30 2008, 21:39 demiurg_spb Что за версия компилятора?
Приведите хоть кусочек ... Oct 1 2008, 07:33 ZyBEX Цитата(demiurg_spb @ Oct 1 2008, 11:33) Ч... Oct 1 2008, 10:06  aesok Цитата(ZyBEX @ Oct 1 2008, 14:06) Весь ко... Oct 1 2008, 10:20   ZyBEX Цитата(aesok @ Oct 1 2008, 14:20) А фрагм... Oct 1 2008, 10:41    Сергей Борщ Цитата(ZyBEX @ Oct 1 2008, 13:41) Я же го... Oct 1 2008, 10:50     ZyBEX Цитата(Сергей Борщ @ Oct 1 2008, 14:50) Д... Oct 1 2008, 14:11      aesok GCC Bugzilla Bug 29141
static constructors beyond ... Oct 1 2008, 15:23 ZyBEX Я понял что у меня за таблица, по которой бродит t... Oct 1 2008, 15:54 ZyBEX Проблема датируется 2006 годом. Странно что до сих... Oct 1 2008, 17:09     aesok Цитата(Сергей Борщ @ Oct 3 2008, 01:04) У... Oct 2 2008, 21:10       ZyBEX Цитата(Сергей Борщ @ Oct 3 2008, 12:04) Н... Oct 3 2008, 12:54        Сергей Борщ Цитата(ZyBEX @ Oct 3 2008, 15:54) Если r1... Oct 3 2008, 13:41 aesok Цитата(ZyBEX @ Oct 1 2008, 22:33) Временн... Oct 2 2008, 06:45  ZyBEX Цитата(aesok @ Oct 2 2008, 10:45) А Вы та... Oct 2 2008, 08:21 ZyBEX Цитата(C:/WinAVR/Doc/avr-libc/avr-li... Oct 3 2008, 14:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|