Вт фев 24, 2015 21:05:03
Вт фев 24, 2015 22:20:38
Ср фев 25, 2015 07:52:17
Ср фев 25, 2015 20:28:25
Чт мар 05, 2015 11:24:21
Вт апр 21, 2015 19:40:04
Пн июн 08, 2015 07:58:46
Interrupt_Label: ; Сюда ссылается один из (r)jmp из таблицы векторов
push r16
rcall inten
... ; Здесь располагается индивидуальная программа обслуживания
... ; этого конкретного прерывания
ret ; Заканчивается она RET'ом, а не RETI. Регистр R16 будет восстановлен позже,
; в общей программе, о нем заботиться не нужно.
cli
rcall ttyout
sei
Пн июн 08, 2015 08:04:12
akl писал(а):Здравствуйте. Недавно, на соседнем форуме был задан вопрос о быстром умножении 24-разрядных чисел. Было предложено использование алгоритма Дональда Кнута. В результате появился код, который выполняет
Умножение 24р*24р=48р выполняется за 75 тактов и занимает 65 слов
Умножение 32р*32р=64р выполняется за 134 такта и занимает 117 слов
Формат представления чисел старший-младший
Пн июн 08, 2015 08:21:05
Пн июн 08, 2015 09:26:21
Пн июн 08, 2015 10:26:17
Не всегда (далеко не всегда) это критично. Программа обслуживания конкретного прерывания, обычно, короткая - максимум - десяток-другой команд, а чаще всего - меньше. Большие же действия лучше исполнять "в фоне".BOB51 писал(а):По АВРкину варианту... ( по посту afz )
Надо сначала прерывание текущего уровня закрыть, а уж затем на "хвост" переходить.
Ибо пока будет действовать текущее прерывание все другие прерывания будут недоступны.
Зачем? Чем ему плохо в стеке? Если же задержка от прерывания до реакции на него сильно критична, то этим приемом лучше не пользоваться.BOB51 писал(а):Т.Е. более оптимально подстановка адреса сопровождающей подпрограммы в стек и RETI с последующим RET из сопровождающей подпрограммы.
in rn,SREG
ldi r16,low (prog)
push r16
ldi r16,high (prog)
push r16
reti
Одначе там несколько нюансов по SREGу - запись не в стек, а в один из регистров регистрового файла
Я бы в таком случае не стал открывать прерывания "для всех", то есть в общей части. Если уж приспичило их открыть, то это надо делать в индивидуальном обслуживании, предварительно сняв у устройства бит разрешения прерываний от него, а затем сделав SEI. Ну, и, окончив эти (длительные) действия сделал бы CLI, взвел бит разрешения прерываний от устройства и вышел. Естественно, такое можно делать только с устройствами, которые могут подождать. Но лучше, все-таки, перенести длительную обработку в фон.BOB51 писал(а): и на момент восстановления окантовка из
prog:
; собственно текст программы
CLI
out SREG,rn ; n=2-15
SEI
RET
Правда это только в случае, ежли прерывание данного уровня не произойдет ранее, чем закончится его "хвост" обработки - иначе потребуется "флажковый семафор" для отработки "наложения в период исполнения".
Пн июн 08, 2015 14:47:23
Вт июн 23, 2015 15:03:54
Пн июн 29, 2015 05:32:57
Я надеялся скопипастить...akl писал(а):Для AVR использую такую. Она, правда, примитивна как лом и, наверно, не очень смотрится в этой теме, но в качестве основы, думаю, пойдёт.
Пн июл 13, 2015 13:37:48
Сб авг 08, 2015 20:27:53
baghear писал(а):Вопрос снят разобрался.
Сб авг 08, 2015 22:57:57
Вс авг 09, 2015 01:22:17
Вс авг 09, 2015 07:50:49
Вс авг 09, 2015 14:04:31