Чт окт 07, 2021 08:45:40
BOB51 писал(а):Только для топикстартера похоже смысл так и остался непонятным...
Чт окт 07, 2021 08:54:12
флаги - это не переменные. флаги для того и нужны, чтобы в одном мете поставить, а в другом проверить и если поставлен, выполнить действия и сбросить флаг.
Именно так работают неправильно написанные кольцевые буферы.
для меня в МК вообще не существует переменных - я пишу на ассемблере и у меня есть только регистры и ячейки памяти ОЗУ.
Чт окт 07, 2021 09:26:21
из соображений экономии сишному компилятору как-то больше нравятся целые переменные в качестве флагов, но иногда и битовые поляCOKPOWEHEU писал(а):Из соображений экономии вы отвели под это дело биты 0,1,2 ячейки 0x0084.
Чт окт 07, 2021 09:30:53
Да компилятору с высокой горки на...., все зависит от программиста.slav0n писал(а):из соображений экономии сишному компилятору нравятся
Чт окт 07, 2021 09:44:14
ни чуть не усложняет.COKPOWEHEU писал(а):Если под данные отводится больше одной ячейки, такой подход только все усложняет.
совершенно верно сказано. лично мне нравится называть "параметр", и неважно, сколько ячеек он занимает.COKPOWEHEU писал(а):Но опять-таки, какая разница как это назвать.
Чт окт 07, 2021 09:52:44
Чт окт 07, 2021 09:59:13
Чт окт 07, 2021 10:16:19
Чт окт 07, 2021 10:27:30
Чт окт 07, 2021 11:05:01
из соображений экономии сишному компилятору как-то больше нравятся целые переменные в качестве флагов, но иногда и битовые поля
lds r16, FLAGS_REG
sbrs r16, FLAG_TIM
rjmp TIM_CLEARED
cbr r16, FLAG_TIM
sts FLAGS_REG, r16
;флаг был поднят, обрабатываем
TIM_CLEARED: ;возвращаемся к выполнению
lds r16, TIM_FLAG
tst r16
brne TIM_CLEARED
clr r16
sts TIM_FLAG, r16
;флаг был поднят, обрабатываем
TIM_CLEARED: ;возвращаемся к выполнению
ни чуть не усложняет.
а на флаги я выделяю регистры
для любой RTOS, где помимо этого хватает всяких мьютексов
или если размер сохраняется в отдельной переменной
Чт окт 07, 2021 11:09:36
Чт окт 07, 2021 11:53:03
Чт окт 07, 2021 11:57:17
а как ты себе представляешь, писать на ассемблере и не следить за использованием регистров?COKPOWEHEU писал(а):Можно и так, но тогда за ними надо следить чтобы разная периферия не пыталась занять одни и те же адреса.
Чт окт 07, 2021 12:03:28
правильноDimon456 писал(а):все зависит от программиста.
Чт окт 07, 2021 13:11:18
Чт окт 07, 2021 13:22:06
а как ты себе представляешь, писать на ассемблере и не следить за использованием регистров?
скажу даже больше - когда пишешь на ассемблере, следить нужно не только за регистрами флагов, следить нужно за всеми регистрами.
Чт окт 07, 2021 14:33:16
COKPOWEHEU писал(а):Хранить размер буфера в переменной? А какой смысл? Я очень надеюсь, что он у вас хотя бы не в динамической памяти находится...
Или вы про количество данных в буфере? Так оно вычисляется из разности между головой и хвостом за два действия.
buf[tail++ & mask] = value;
Чт окт 07, 2021 14:35:01
Чт окт 07, 2021 14:52:32
Если не равняется, то вместо наложения маски будет сравнение и вычитание/сложение, вот и все.И простой разностью можно обойтись только если емкость буфера равна степени двойки
Пока что я вижу только явный недостаток с тем, что к полю размера нужен доступ и при записи, и при чтении. Но вы говорите, что такие реализации есть. Чем именно они настолько хороши, что перевешивают этот недостаток?а может быть голова и размер или голова, хвост и размер
Ну так вариант с размером эту проблему не решает. И вообще, какой смысл сейчас рассматривать заведомо ошибочный код?плюс подход только с головой и хвостом чреват подводными камнями... Классический пример когда некоторые компиляторы сначала инкрементят и сохраняют tail, а потом уже пишут в buf
Чт окт 07, 2021 14:57:09
; принята базовая модель: AVR
; область ограниченного функционала
; .def = r0 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def = r1 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def = r2 ; зеркало SREG (ограниченный функционал)
; .def = r3 ; зеркало SPL (ограниченный функционал)
; .def = r4 ; зеркало SPH (ограниченный функционал)
; .def = r5 ; оперативные флаги (ограниченный функционал)
; .def = r6 ; оперативные флаги (ограниченный функционал)
; .def = r7 ;(ограниченный функционал)
; .def = r8 ;(ограниченный функционал)
; .def = r9 ;(ограниченный функционал)
; .def = r10 ;(ограниченный функционал)
; .def = r11 ;(ограниченный функционал)
; .def = r12 ;(ограниченный функционал)
; .def = r13 ;(ограниченный функционал)
; .def = r14 ;(ограниченный функционал)
; .def = r15 ;(ограниченный функционал)
; область полного функционала
.def tmpr0 = r16 ; рабочий регистр (полный функционал)
.def tmpr1 = r17 ; рабочий регистр (полный функционал)
.def tmpr2 = r18 ; рабочий регистр (полный функционал)
.def tmpr3 = r19 ; рабочий регистр (полный функционал)
.def tmpr4 = r20 ; рабочий регистр (полный функционал)
.def tmpr5 = r21 ; рабочий регистр (полный функционал)
.def tmpr6 = r22 ; рабочий регистр (полный функционал)
.def tmpr7 = r23 ; рабочий регистр (полный функционал)
.def bpl = r24 ; "указатель базы" (полный функционал)
.def bph = r25 ; "указатель базы" (полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; регистры имеют также отображение в пространстве ОЗУ 0х0000 - 0х001F