реклама на сайте
подробности

 
 
> WinAVR и ELPM, ставит lpm вместо elpm
ZyBEX
сообщение Sep 30 2008, 21:39
Сообщение #1


Участник
*

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



Столкнулся с такой проблемой:

ATmega1280,
пишу bootloader, в 0 адресе все работает. Передвигаю на 0x01E000 - не запускается.
Смотрю дебагером и обнаруживаю, что там, где должна быть инструкция ELPM - стоит LPM (хотя RAMPZ установлен верно). Соответственно данные читаются не из того места, и переход выполняется в адрес где-то за пределами кода. Пока программа лежала в 0 адресе, не было переполнения на 16-й бит адреса и все работало нормально.

Кто нибудь сталкивался? Может какие ключи компиляции помогут? Или вручную опкоды править?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ZyBEX
сообщение Oct 1 2008, 18:33
Сообщение #2


Участник
*

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



По идее проблему можно решить, создавая объекты только локально. Но, ИМХО, для scmRTOS это невозможно без изменения самой ОС.

Временно решил проблему заменой в хекс редакторе неверных опкодов 9005 и 91F4 соответственно на 9007 и 91F6. Все заработало.

Вот если бы патчик написать, который сам это делать будет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 1 2008, 20:04
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ZyBEX
сообщение Oct 2 2008, 20:22
Сообщение #4


Участник
*

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



[SOLVED]

Цитата(Сергей Борщ @ Oct 2 2008, 00:04) *
Попробуйте добавить в проект ассемблерный файлик, в котором будет правильный код от метки __tablejump2__ до ijmp. При линковке он должен подлинковаться вместо библиотечного.

Действительно, сработало. a14.gif

Создал файл 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
Go to the top of the page
 
+Quote Post
aesok
сообщение Oct 2 2008, 20:32
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 2 2008, 21:04
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ZyBEX
сообщение Oct 3 2008, 00:40
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 3 2008, 08:04
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01466 секунд с 7
ELECTRONIX ©2004-2016