Вопрос по программированию задержки внутри прерывания

Обсуждаем контроллеры компании Atmel.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Щас я вас...
kernel.inc
Спойлер

Код: Выделить всё

; Copyright (C) 2011, Shestakov Evgeniy <mazur1978(at)mail.ru>

;===================
#define MAX_TASKS	3

Table_Tasks:
.dw		DRV_LCD
.dw		Proc_Menu
.dw		KBD_DRV
end_array
;===================

;===================
#define CONTEXT_TASK_SIZE 33
;===================

.dseg

;===================
QUANT_TASKS: // Количество задач.
.byte	1

CNT_TASKS: // Номер задачи.
.byte	1

REPLACE_STACK:
.byte	3

MAIN_SPH:
.byte	1
MAIN_SPL:
.byte	1

NUL_BUFFER_1:
.byte	1

#define HEADERS_TASKS_SIZE 8

HEADERS_TASKS:
.byte	HEADERS_TASKS_SIZE*MAX_TASKS

#define TASK_STACK_SIZE 64

STACKS_TASKS: ; Блок стеков задач(Стек вдвигается вверх)
.byte	TASK_STACK_SIZE*MAX_TASKS

.cseg

//************************************************************************
Set_Tasks:
	clr		CNT
//	ldx		STACKS_TASKS+(TASK_STACK_SIZE-(CONTEXT_TASK_SIZE+7))
//	ldy		HEADERS_TASKS
	ldz		Table_Tasks*2

Set_Tasks_Cycle:
; Адрес входа в задачу.
; Указатель на таблицу задач.
; Смещение указателя по номеру задачи
	lpm		r16, Z+
	lpm		r17, Z+
	cp		r16, RSER
	cpc		r17, RSER
	breq	Set_Tasks_End_1

; Сохранение указателя стека (сохранение регистров и SREG).
//	st		Y, XH
//	std		Y+1, XL

	inc		CNT
//	subi	XL, LOW (-TASK_STACK_SIZE)
//	sbci	XH, HIGH (-TASK_STACK_SIZE)
//	adiw	YL, HEADERS_TASKS_SIZE
	rjmp	Set_Tasks_Cycle
Set_Tasks_End_1:
	cpi		CNT, 0
	breq	Queue_Tasks_Empty
	sts		QUANT_TASKS, CNT
	clr		CNT
	rjmp	Load_Task

Queue_Tasks_Empty:
	rjmp	Main
//==================

//==================
Scheduler:
// Сохранение регистров и SREG.
// Смещение указателя стека. Уменьшение значения
// на выход (ret) из Scheduler и из задачи.
// Восстановление регистров и SREG.
	cli
	wdr
	sts		REPLACE_STACK, XL
	in		XL, SREG
	sts		REPLACE_STACK+1, XL
	sts		REPLACE_STACK+2, XH
	in		XL, SPL
	in		XH, SPH
	sbiw	XL, 4 ; Scheduler+Task
	out		SPH, XH
	out		SPL, XL
	lds		XH, REPLACE_STACK+2
	lds		XL, REPLACE_STACK+1
	out		SREG, XL
	lds		XL, REPLACE_STACK

; Сохранение контекста задачи. Регистров и SREG.
	PushRegs

; Вычисление по номеру задачи указателя заголовков задач.
	lds		r18, QUANT_TASKS
	lds		CNT, CNT_TASKS

; Переключение задачи.
	inc		CNT
	cp		CNT, r18
	brlo	Scheduler_A
	clr		CNT
Scheduler_A:
	sts		CNT_TASKS, CNT

Load_Task:
; Восстановление точки входа в задачу.
; Указатель на таблицу задач.
; Смещение указателя по номеру задачи
	clr		ZH
	mov		ZL, CNT
	lsl		ZL
	subi	ZL, LOW(-(Table_Tasks*2))
	sbci	ZH, HIGH(-(Table_Tasks*2))

// Умножение номера задачи на объем стека.
// Смещение указателя на конец стека текущей задачи.
	ldi		r16, TASK_STACK_SIZE
	mul		CNT, r16
	movw	XH:XL, r1:r0
	subi	XL, LOW(-(STACKS_TASKS+(TASK_STACK_SIZE-1)))
	sbci	XH, HIGH(-(STACKS_TASKS+(TASK_STACK_SIZE-1)))

; Указатель стека на конец стека текущей задачи.
	out		SPH, XH
	out		SPL, XL

	ldi		r16, LOW(Scheduler)
	push	r16
	ldi		r16, HIGH(Scheduler)
	push	r16

	lpm		r16, Z+
	lpm		r17, Z+
	push	r16
	push	r17

	in		XL, SPL
	in		XH, SPH

// Смещение указателя на кол-во регистров+SREG.
	sbiw	XL, CONTEXT_TASK_SIZE

	out		SPH, XH
	out		SPL, XL

; Восстановление контекста следующей задачи и выход
; (в стеке адрес точки входа в задачу).
	PopRegs
	reti
/************************************************************************/

Вы просто балуетесь со стеком. А я пробовал. Кооперативка, вытесняющий. Пробы. Рабочие. Но. Асм.
Последний раз редактировалось Demiurg Ср фев 05, 2025 13:05:49, всего редактировалось 1 раз.
Реклама
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Adrift »

[uquote="shonty",url="/forum/viewtopic.php?p=4679429#p4679429"]Ещё смысл вот этой записи не понимаю (встречается иногда):
eor R0, R0
есть же clr[/uquote]
CLR - это псевдоинструкция, реализуемая через EOR. У AVR есть CLR, на других архитектурах может не быть и для очистки применяют EOR, т.е. делать так будет скорее тот кто так делал раньше на всяких z80 ) Можно даже рассматривать CLR как аналог макроса и вы же сами сказали, что в таком случае придется запоминать еще и их. В случае CLR это не так очевидно, но вместо той же SER проще использовать LDI и не знать про эту SER вообще )
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

У многих команд avr свои мнемоники.
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Вячеслав М. »

Да кстати, в языке ASM для меги есть инструкции которых нет, в реале они заменяются другой, это в Дизасме видно.
Реклама
Эиком - электронные компоненты и радиодетали
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Вы неправильно понимаете. Иструкции есть. И есть мнемоники. читай даташиты!
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

clr - это eor регистра с самим собой.
Adrift писал(а):Можно даже рассматривать CLR как аналог макроса
это не аналог макроса. CLR - это EOR Rd, Rr, где вместо Rr, используется Rd. то есть, CLR = EOR Rd, Rd.
shonty писал(а):Если .dw использовать, то при считывании массива через LPM сначала будет считываться low(), потом high(), что усложняет чтнение в цикле.
это ты себе сделал усложнение.
даже 2 усложнения ты сделал:
1. лишние операции через регистр R0.
2. игры с адресом в паре Z.
во-первых, есть команды, загружающие прямо в нужный регистр. а ты сначала загружаешь в R0, а потом пересылаешь в нужный регистр.
во-вторых, командой LPM Rd, Z+ ты без игр с адресом в паре Z загрузишь в регистры оба байта в нужной тебе последовательности.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Когда ты играешь со стеком. Знай одно. В регистре SREG ни один флаг не должен сработать. Используй команды, на которые не реагирует этот регистр.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

Demiurg, загоняешь SREG тоже в стек, и используй любые команды. потом восстанови SREG.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Clr обычная команда МК avr

Добавлено after 1 minute 20 seconds:
[uquote="Starichok51",url="/forum/viewtopic.php?p=4679470#p4679470"]Demiurg, загоняешь SREG тоже в стек, и используй любые команды. потом восстанови SREG.[/uquote]
Я показал игры со стеком.
Это вы там балуетесь, ребятишки.
Последний раз редактировалось Demiurg Ср фев 05, 2025 13:46:04, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

У каждой из инструкций есть еще свойство влияния на флаги.
:wink:
Когда мало стека аппаратного делают и программный.
Да еще у АВРок можно "шустрый стек" на основе регистрового файла и MOVW организовать...
Как и смену рабочего банка регистров ( модель Z80/MCS51) или "теневой" хранитель критичных данных у 18 серии ПИКовых (есть такое и у "улучшенных среднемладших" ПИКовых)).
Возможности достаточно широкие - только обычно задачи любительские крайне редко их требуют.
:tea:
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Тема AVR.
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Adrift »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4679468#p4679468"]это не аналог макроса. CLR - это EOR Rd, Rr, где вместо Rr, используется Rd. то есть, CLR = EOR Rd, Rd.[/uquote]
Я так и написал, но если бы такой псевдоинструкции не было, а кто-то таковую захотел, то мог бы добавить в виде макроса.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Demiurg
Так я ж про возможности АВР и веду речь.
Применение "модели регистров" в рамках регистрового файла и приемов, заимствованных из других семейств, удачно применяемых при работе с АВРками.
8)
АВРки для такого варианта работы весьма удобны.
:hunger:
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Соглашусь. Вошли в домик. Можем поиграть со sreg. Согласен.

Добавлено after 2 minutes 7 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=4679481#p4679481"]Demiurg
Так я ж про возможности АВР и веду речь.
Применение "модели регистров" в рамках регистрового файла и приемов, заимствованных из других семейств, удачно применяемых при работе с АВРками.
8)
АВРки для такого варианта работы весьма удобны.
:hunger:[/uquote]
Пофик. Речь ведём об avr
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Именно о возможностях, заложенных в ядро АВРок.
Просто использовать его можно по разному для получения результата.
8)
Если МК позволяет применять удачные решения из того, что в других семействах используется - то почему бы такими решениями не воспользоваться?
:wink:
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

Demiurg, мало того, что ты опять нарушил правила форума, о чем я тебя уже предупреждал, так ты еще дважды повторил полную цитату.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Starichok51 писал(а):это ты себе сделал усложнение.
даже 2 усложнения ты сделал:
там даже не 2 усложнения, но это всё в свете ускорения работы с TFT дисплеями на авр-ках))
Starichok51 писал(а):1. лишние операции через регистр R0.
в коде разницы нет, через R0 или другой регистр:

Код: Выделить всё

	lpm
	out SPDR, R0
я в общих чертах ответил на вопрос про минус 20, а придирок как к законченному пректу :)))
Starichok51 писал(а):во-вторых, командой LPM Rd, Z+ ты без игр с адресом в паре Z загрузишь в регистры оба байта в нужной тебе последовательности.
мне не нужно грузить в два регистра, и вообще это всё проделывается проще, даже можно через озу, но нужна была скорость. в ущерб коду и всему остальному..

Starichok51, в принципе ты описал примерно то с чего я начинал.. а то что я частично выложил это уже результат оптимизации :)))
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

ладно, варись в собственном соку...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Jack_A »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4679471#p4679471"]Clr обычная команда МК avr[/uquote]
А что, бывают и сверхъестественные?
Одна и та же команда МК в асме может иметь разные мнемоники. Касаемо той же CLR: глупо было бы выдумывать отдельную команду для очистки регистра, поэтому применили EOR регистра с самим собой. Можно было бы, положим, для CLR взять SUB регистра с самим собой - эффект был бы тот же. Но выбрали EOR - какая разница.
Другое дело: заменяя одну команду другой, нужно быть точно уверенным в полной идентичности результата. (Сам, помню, напоролся на раннем этапе освоения: SUBI... 1 и DEC не совсем равнозначны по причине флагов).
Изображение
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Тема, вопрос топика. Задержки внутри прерывания. Это проект. Нужно продумывать. И тс-у нужно понимать. Что он делает в прерывании. Бах. Оказался там. Бах выходим.
В прерывании мы делаем минимум действий. Вошли, сделали минимум действий, вышли. Задержки делаем в основном цикле.
Ответить

Вернуться в «AVR»