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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> WinAVR и ELPM, ставит lpm вместо elpm
aesok
сообщение Oct 2 2008, 20:32
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 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
aesok
сообщение Oct 2 2008, 21:10
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Сергей Борщ @ Oct 3 2008, 01:04) *
У него ведь все приложение, включая ветки case находится в верхней памяти. Т.е. при использовании lpm в case программа навернется с тем же успехом.


Да Вы правы.
Go to the top of the page
 
+Quote Post
ZyBEX
сообщение Oct 3 2008, 00:40
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 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
сообщение Oct 3 2008, 12:54
Сообщение #21


Участник
*

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



Цитата(Сергей Борщ @ Oct 3 2008, 12:04) *
Нет, лучше так:
Код
.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

Если r1 всегда в 0, то прерывание, сработавшее между установкой r1 и его обнулением, не повлияет негативно? Может r0 использовать?

Сообщение отредактировал ZyBEX - Oct 3 2008, 12:56
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 3 2008, 13:41
Сообщение #22


Гуру
******

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



Цитата(ZyBEX @ Oct 3 2008, 15:54) *
Если r1 всегда в 0, то прерывание, сработавшее между установкой r1 и его обнулением, не повлияет негативно? Может r0 использовать?
Срочно читать C:/WinAVR/Doc/avr-libc/avr-libc-user-manual/FAQ.html вопрос № 13. Как по-вашему аппаратное умножение работает?


--------------------
На любой вопрос даю любой ответ
"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, 14:00
Сообщение #23


Участник
*

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



Цитата(C:/WinAVR/Doc/avr-libc/avr-libc-user-manual/FAQ.html @ вопрос № 13)
...Interrupt handlers save and clear r1 on entry, and restore r1 on exit (in case it was non-zero)...

Все понял. К сожалению раньше не читал этот фак. Спасибо.

Сообщение отредактировал ZyBEX - Oct 3 2008, 14:10
Go to the top of the page
 
+Quote Post

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

 


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


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