Страница 8 из 9

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

Добавлено: Ср фев 05, 2025 12:12:54
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
/************************************************************************/

Вы просто балуетесь со стеком. А я пробовал. Кооперативка, вытесняющий. Пробы. Рабочие. Но. Асм.

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

Добавлено: Ср фев 05, 2025 12:33:35
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 вообще )

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

Добавлено: Ср фев 05, 2025 13:03:24
Demiurg
У многих команд avr свои мнемоники.

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

Добавлено: Ср фев 05, 2025 13:05:52
Вячеслав М.
Да кстати, в языке ASM для меги есть инструкции которых нет, в реале они заменяются другой, это в Дизасме видно.

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

Добавлено: Ср фев 05, 2025 13:08:51
Demiurg
Вы неправильно понимаете. Иструкции есть. И есть мнемоники. читай даташиты!

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

Добавлено: Ср фев 05, 2025 13:36:36
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 загрузишь в регистры оба байта в нужной тебе последовательности.

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

Добавлено: Ср фев 05, 2025 13:37:44
Demiurg
Когда ты играешь со стеком. Знай одно. В регистре SREG ни один флаг не должен сработать. Используй команды, на которые не реагирует этот регистр.

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

Добавлено: Ср фев 05, 2025 13:39:27
Starichok51
Demiurg, загоняешь SREG тоже в стек, и используй любые команды. потом восстанови SREG.

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

Добавлено: Ср фев 05, 2025 13:40:57
Demiurg
Clr обычная команда МК avr

Добавлено after 1 minute 20 seconds:
[uquote="Starichok51",url="/forum/viewtopic.php?p=4679470#p4679470"]Demiurg, загоняешь SREG тоже в стек, и используй любые команды. потом восстанови SREG.[/uquote]
Я показал игры со стеком.
Это вы там балуетесь, ребятишки.

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

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

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

Добавлено: Ср фев 05, 2025 13:47:31
Demiurg
Тема AVR.

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

Добавлено: Ср фев 05, 2025 13:49:43
Adrift
[uquote="Starichok51",url="/forum/viewtopic.php?p=4679468#p4679468"]это не аналог макроса. CLR - это EOR Rd, Rr, где вместо Rr, используется Rd. то есть, CLR = EOR Rd, Rd.[/uquote]
Я так и написал, но если бы такой псевдоинструкции не было, а кто-то таковую захотел, то мог бы добавить в виде макроса.

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

Добавлено: Ср фев 05, 2025 13:52:48
BOB51
Demiurg
Так я ж про возможности АВР и веду речь.
Применение "модели регистров" в рамках регистрового файла и приемов, заимствованных из других семейств, удачно применяемых при работе с АВРками.
8)
АВРки для такого варианта работы весьма удобны.
:hunger:

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

Добавлено: Ср фев 05, 2025 13:55:31
Demiurg
Соглашусь. Вошли в домик. Можем поиграть со sreg. Согласен.

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

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

Добавлено: Ср фев 05, 2025 13:58:28
BOB51
Именно о возможностях, заложенных в ядро АВРок.
Просто использовать его можно по разному для получения результата.
8)
Если МК позволяет применять удачные решения из того, что в других семействах используется - то почему бы такими решениями не воспользоваться?
:wink:

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

Добавлено: Ср фев 05, 2025 14:03:01
Starichok51
Demiurg, мало того, что ты опять нарушил правила форума, о чем я тебя уже предупреждал, так ты еще дважды повторил полную цитату.

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

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

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

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

Starichok51, в принципе ты описал примерно то с чего я начинал.. а то что я частично выложил это уже результат оптимизации :)))

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

Добавлено: Ср фев 05, 2025 15:58:34
Starichok51
ладно, варись в собственном соку...

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

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

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

Добавлено: Пт фев 14, 2025 14:31:51
Demiurg
Тема, вопрос топика. Задержки внутри прерывания. Это проект. Нужно продумывать. И тс-у нужно понимать. Что он делает в прерывании. Бах. Оказался там. Бах выходим.
В прерывании мы делаем минимум действий. Вошли, сделали минимум действий, вышли. Задержки делаем в основном цикле.