Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.11.2007, 12:50
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от tempora
|
1.Не объявляй функцию обработчиком прерывания, или
2.Вставь в функцию-обработчик прерывания ассемблерную инструкцию ret
В любом случае придётся извращаться на уровне встраивания ассемблерных инструкций в сишный код, а это, для такой странной задачи, не будет гладко - одно неверное движение, одна модификация сишного исходника без тщательной проверки промежуточного ассемблерного кода - и ты по уши в эмм... в загадках относительно причин зависона.
Скорее всего, ты идёшь неверным путём. Лучше объясни чего ты хочешь добиться - наверняка есть легальные способы получить нужный результат.
|
1. Не обьявлять функцию обработчиком прерывания, а как ее тогда обьявлять?
2. Такой способ работать не будет. Вот пример из одной программы:
Код:
|
; 690 interrupt [TIM1_COMPA] void timer1_compa_isr(void)
; 691 {
_timer1_compa_isr:
CALL SUBOPT_0x1D
; 692 TCCR1B=0;
CALL SUBOPT_0x1E
; 693 TCNT1=0;
; 694 TCCR2=7;
LDI R30,LOW(7)
OUT 0x25,R30
; 695 if (f1) f1test();
LDS R30,_f1
CPI R30,0
BREQ _0xD5
CALL _f1test
; 696 else if (f2) f2test();
RJMP _0xD6
_0xD5:
LDS R30,_f2
CPI R30,0
BREQ _0xD7
CALL _f2test
; 697 #asm("ret");
_0xD7:
_0xD6:
ret
; 698 }
RJMP _0x11F |
а по адресу _0x11F
Код:
|
_0x11F:
LD R30,Y+
OUT SREG,R30
LD R31,Y+
LD R30,Y+
LD R27,Y+
LD R26,Y+
LD R25,Y+
LD R24,Y+
LD R23,Y+
LD R22,Y+
LD R15,Y+
LD R1,Y+
LD R0,Y+
RETI |
Тобиш если выйду из прерывания досрочно, то значения регистров будут потеряны.
Пока конкретной задачи нет. Просто интересен этот вопрос. Когда писал на асме в этом плане было проще, хочу заканчиваю прерывание командой ret , а хочу reti...
|
|
|
|
25.11.2007, 17:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Мне кажется что придется скриптик писать который подправит ASM и затем ассемблирование запустит.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
25.11.2007, 18:14
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от avr123-nm-ru
|
Мне кажется что придется скриптик писать который подправит ASM и затем ассемблирование запустит.
|
Не думаю что часто будет необходимость выходить из прерывания с запрещенными прерываниями. В этих редких случаях придется вручную асм файл править. Вариантов получается нет!
|
|
|
|
25.11.2007, 18:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от dimonbest
|
Сообщение от avr123-nm-ru
|
Мне кажется что придется скриптик писать который подправит ASM и затем ассемблирование запустит.
|
Не думаю что часто будет необходимость выходить из прерывания с запрещенными прерываниями. В этих редких случаях придется вручную асм файл править.
|
Редко НО МНОГОКРАТНО !!! Ведь отладка бывает обычно.
Задолбаешся каждый раз после правки проги ручками то править и аасемблировать ИМХО.
А в CVAVR можно после компиляции выполнить указаную пользователем прогу.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
25.11.2007, 18:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Автору ИМХО нужно предусмотреть какой то "ключик" после обявления функции позволяющий выходить по RET.
Ключь RET будет в самы раз.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
25.11.2007, 21:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от dimonbest
|
Такой способ работать не будет.
|
Ты о котором, из двух, названных мной? ![Смешно](images/smilies/icon_lol.gif)
Сообщение от dimonbest
|
1. Не обьявлять функцию обработчиком прерывания, а как ее тогда обьявлять?
|
Разумеется, как void function(void), как же ещё? ![Смешно](images/smilies/icon_lol.gif)
Сообщение от dimonbest
|
... если выйду из прерывания досрочно, то значения регистров будут потеряны.
|
Если выходить будешь ты, то да - будут, а в других случаях необязательно.
Сообщение от dimonbest
|
Пока конкретной задачи нет. Просто интересен этот вопрос.
|
К сожалению, мои подозрения оправдались.
|
|
|
|
26.11.2007, 22:30
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Работать не будет второй случай, причину по которой не будет я обьяснил и подкрепил кодом!
Если обявить как функцию void function(void), то это не будет прерыванием, а в моем первоначальном вопросе нужно выйти из прерывания а не из функции!!!
|
|
|
|
27.11.2007, 00:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от dimonbest
|
Работать не будет второй случай, причину по которой не будет я обьяснил и подкрепил кодом!
|
Подкрепиил?! От, оно каак!... " Ты просто не умеешь их готовить". Причем, ни одним из приведенных способов.
Почитай на досуге про Non-local Jump Functions и про прагму savereg. Кстати, как правило, рассказы про прагму savereg иллюстрируют примерами именно подмены своим кодом стандартного кода обработчика прерывания. ![Подмигивание](images/smilies/icon_wink.gif) Эту моду, похоже, ещё Борланд ввёл...
|
|
|
|
27.11.2007, 11:10
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от tempora
|
Подкрепиил?! От, оно каак!... "Ты просто не умеешь их готовить". Причем, ни одним из приведенных способов.
Почитай на досуге про Non-local Jump Functions и про прагму savereg. Кстати, как правило, рассказы про прагму savereg иллюстрируют примерами именно подмены своим кодом стандартного кода обработчика прерывания. Эту моду, похоже, ещё Борланд ввёл...
|
Про Non-local Jump Functions почитаю, еще не разбирался.
А по поводу второго способа:
даже если я запрещу сохранение регистров директивой savereg, то тогда программа будет работать некорректно. Если основная программа использует определенные регистры, и эти же саммые регистры будут использованы в прерывании, то после выхода из прерывания значения будут иными...
К тому же без директивы сохраняются не только регисты общего назначения, но и SREG.
|
|
|
|
27.11.2007, 13:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от dimonbest
|
А по поводу второго способа:...
|
Да ты читай, читай... Не спорь.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
CVAVR while и таймер
|
kr11507 |
Микроконтроллеры, АЦП, память и т.д |
10 |
13.12.2008 21:29 |
Програмирование портов Infenon С167
|
vadimvarn |
Микроконтроллеры, АЦП, память и т.д |
1 |
01.11.2008 02:31 |
Програмирование по SPI
|
EKuzmich |
Микроконтроллеры, АЦП, память и т.д |
2 |
09.07.2008 21:35 |
програмирование АТmega32???
|
TimaON |
Микроконтроллеры, АЦП, память и т.д |
0 |
06.05.2008 14:41 |
Програмирование attiny2313
|
Gorgic |
Микроконтроллеры, АЦП, память и т.д |
1 |
15.12.2007 00:00 |
Часовой пояс GMT +4, время: 11:19.
|
|