Правильная обработка переменных в контексте прерываний

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

Сообщение Starichok51 »

COKPOWEHEU писал(а):Для кого конвенции придумали?
те конвенции придумали для взаимодействия между Си и ассемблером.
поскольку я Си не использую вообще, от слова совсем, мне эти конвенции по фигу. и я использую регистры, как мне угодно.
но, естественно, регистры r0 и r1 я не занимаю под постоянное использование, так как они используются в умножении. но остальные регистры я могу использовать для чего угодно.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Однако Z для команд косвенных переходов (ICALL, IJMP) также желательно не особо трогать.
8)
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

[uquote="slav0n",url="/forum/viewtopic.php?p=4102182#p4102182"]
Dimon456 писал(а):все зависит от программиста.
правильно
лично я пишу прямо в теле функции:
static u8 flg;[/uquote]
такая запись ограничивает область видимости переменной только телом функции (а точнее - фигурными скобками, внутри которых она описана). При этом значение такой переменной сохраняется между вызовами функции. Только вот причём здесь прерывания?
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4102288#p4102288"]Если не равняется, то вместо наложения маски будет сравнение и вычитание/сложение, вот и все.[/uquote]
На STM32 у меня так:
Спойлер

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

uint32_t size() const
{
	if constexpr (pot)
	{
		return (TI&)tail - (TI&)head;
	}
	else
	{
		int32_t sz = (TI&)tail - (TI&)head;
		return (sz < 0) ? sz + Capacity + 1 : sz;
	}
}

private:
static constexpr bool pot = std::has_single_bit(Capacity);             
using TI = std::conditional_t<ThreadSafe, volatile uint32_t, uint32_t>;
T buf[Capacity + !pot];
uint32_t head, tail;
COKPOWEHEU писал(а):Пока что я вижу только явный недостаток с тем, что к полю размера нужен доступ и при записи, и при чтении. Но вы говорите, что такие реализации есть. Чем именно они настолько хороши, что перевешивают этот недостаток?
Мы о разных вещах говорим, ты пытаешься доказать превосходство одного из подходов, с чем я и не спорю, т.к., еще раз повторю, у меня самого размер отдельно не хранится, но есть и другие подходы где в переменную пишется из основного кода и прерывания, может они менее эффективные, зато накосячить тоже сложнее, пиши как хочешь, просто прерывания запрещай. Взять хоть либы для ардуино, там есть парочка RingBuf/RingBuffer, в обоих хранится размер, в одной используется ATOMIC_BLOCK, в другой - noInterrupts().
COKPOWEHEU писал(а):Ну так вариант с размером эту проблему не решает.
Вариант с размером предполагает отключение прерываний которое решает практически все проблемы, в том числе и вышеописанную.
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

те конвенции придумали для взаимодействия между Си и ассемблером.
Ну разумеется, нет!
Конвенции придумали чтобы программист не держал в голове слишком много, чтобы над одним проектом могло работать несколько человек и использовать сторонние библиотеки.
На STM32 у меня так:
Ну вот, сравнение и вычитание/сложение. Пусть у вас это и записано в виде тернарного оператора.
Мы о разных вещах говорим, ты пытаешься доказать превосходство одного из подходов
Нет, я написал что вижу явный недостаток другого подхода. Но ведь его используют. Значит, либо те, кто использует, дураки, либо я чего-то не знаю. Поэтому и спрашиваю что именно я не знаю.
Вариант с размером предполагает отключение прерываний которое решает практически все проблемы, в том числе и вышеописанную.
В том смысле, что для его использования надо применить настолько мощный костыль, что он попутно блокирует некоторые другие ошибки?
Реклама
Ответить

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