|
WinAVR и ELPM, ставит lpm вместо elpm |
|
|
|
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)
|
|
|
|
|
Oct 3 2008, 12:54
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 3 2008, 14:00
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|