Обсуждаем контроллеры компании Atmel.
Ответить

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

Чт окт 07, 2021 15:42:53

COKPOWEHEU писал(а):Для кого конвенции придумали?
те конвенции придумали для взаимодействия между Си и ассемблером.
поскольку я Си не использую вообще, от слова совсем, мне эти конвенции по фигу. и я использую регистры, как мне угодно.
но, естественно, регистры r0 и r1 я не занимаю под постоянное использование, так как они используются в умножении. но остальные регистры я могу использовать для чего угодно.

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

Чт окт 07, 2021 16:06:25

Однако Z для команд косвенных переходов (ICALL, IJMP) также желательно не особо трогать.
8)

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

Чт окт 07, 2021 16:17:43

Dimon456 писал(а):все зависит от программиста.
правильно
лично я пишу прямо в теле функции:
static u8 flg;

такая запись ограничивает область видимости переменной только телом функции (а точнее - фигурными скобками, внутри которых она описана). При этом значение такой переменной сохраняется между вызовами функции. Только вот причём здесь прерывания?

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

Чт окт 07, 2021 16:49:38

Если не равняется, то вместо наложения маски будет сравнение и вычитание/сложение, вот и все.

На 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 писал(а):Ну так вариант с размером эту проблему не решает.

Вариант с размером предполагает отключение прерываний которое решает практически все проблемы, в том числе и вышеописанную.

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

Чт окт 07, 2021 17:12:29

те конвенции придумали для взаимодействия между Си и ассемблером.

Ну разумеется, нет!
Конвенции придумали чтобы программист не держал в голове слишком много, чтобы над одним проектом могло работать несколько человек и использовать сторонние библиотеки.
На STM32 у меня так:

Ну вот, сравнение и вычитание/сложение. Пусть у вас это и записано в виде тернарного оператора.
Мы о разных вещах говорим, ты пытаешься доказать превосходство одного из подходов

Нет, я написал что вижу явный недостаток другого подхода. Но ведь его используют. Значит, либо те, кто использует, дураки, либо я чего-то не знаю. Поэтому и спрашиваю что именно я не знаю.
Вариант с размером предполагает отключение прерываний которое решает практически все проблемы, в том числе и вышеописанную.

В том смысле, что для его использования надо применить настолько мощный костыль, что он попутно блокирует некоторые другие ошибки?
Ответить