Цитата(Forger @ Jun 10 2017, 08:27)

Мля, да при чем тут некий write?
А что при чём?
Я Вас уже 100500-й раз тут прошу:
Приведите пример (кодом) ситуации, при которой по Вашему будет косяк.Уже даже и не знаю как сказать...
Вот так вот прямо - возьмите мой код, скопипастите сюда, и вставьте в него код (с комментом) в какой-то точке, который вызовет сбой.
Вы вообще к программированию отношение имеете? Если имеете - должны уметь читать и понимать код. Как и все тут вроде-бы. Не надо этих пространных полотенец рассуждений - по ним совершенно не понятно, что именно Вас смущает. Я специально написал конкретный простейший код кольцевого буфера, чтобы, как мне казалось, любой человек знающий си и умеющий читать, мог понять его работу.
Проблему в кольцевых буферах здесь видите один только Вы.
Ещё раз подчеркну:
Корректно реализованный кольцевой буфер, отвечающим условиям изложенным мной в том сообщении, где я привёл его код, не требует дополнительных блокировок, запретов прерываний и т.п.
НИГДЕ!!!Даже в том случае (а это самый сложный случай) если пишущий процесс выполняется на одном процессоре, а читающий - на другом. Единственное дополнительное условие при этом - объект Ring должен находиться в некешеруемом регионе ОЗУ (некешеруемом в обоих процессорах). В этом случае никакие блокировки одного процессора другим как правило и невозможны.
Цитата(Forger @ Jun 10 2017, 08:27)

Еще раз - проблема в тех кусках кода, где производится обращение к обоим указателям, а не только к одному,
Ещё раз -
какие "те"?
Я в классе Ring реализовал все методы необходимые для работы с кольцевым буфером - про какой из них Вы говорите??? Мы здесь не телепаты, не можем понять что такое "те" куски кода, а что такое "не те".
Цитата(Forger @ Jun 10 2017, 08:27)

Обращение к обоим указателям должно быть атомарным. К одному - нет.
Я подозреваю Вы не понимаете понятие "атомарность"....
Цитата(Forger @ Jun 10 2017, 08:27)

Если же делать общее кольцо про все случаи жизни, то защищать приходится все места, где производится сравнение и тем более модификация сразу обоих указателей.
Не надо ничего защищать. Всё уже защищено алгоритмом моего Ring. Да хоть на разных процах вызывайте write() и read() - всё будет ок, хоть эти процессоры выполняют свои команды совершенно асинхронно.
Цитата(Forger @ Jun 10 2017, 08:27)

Например, ваш flush. Прямо посреди операции чтения-модификации-запись произойдет прерывание, которое в данный момент работает с этой же очередью.
Ещё 100500-й раз:
Какой операции чтения-модификации-запись?
Вы понимаете смысл ключевого слова "class" языка си? А понятие прав "public", "private" класса Вам знакомо?
Ещё и ещё раз прочитайте мой код: я не зря их там поставил. Т.е. - для работы с объектом класса можно пользоваться только его методами. Среди методов есть модифицирующие, а есть readonly-методы.
Какой именно из них Вас не устраивает?
flush() туда тоже можно добавить и к нему будут относиться все ограничения указанные для других:
из пишущего процесса можно вызывать только функции, меняющие указатель wpos;
из читающего процесса можно вызывать только функции, меняющие указатель rpos.
flush() какой указатель меняет?
readonly-методы можно вызывать из любого процесса, читающего или пишущего, без ограничений.
Цитата(Forger @ Jun 10 2017, 08:27)

см. USART_FlushTxBuf
Ну и в комментариях некто указал про то, что у тут пытаюсь донести до остальных.
Ищите по поиску на той же странице "Код содержит не меньше одной ошибки. Нет гарантии атомарности изменения переменых."
И при чём тут чей-то говнокод? Очевидно, что человек написавший его, совершенно не понимает принципов многозадачной работы. Это видно уже сразу в самом начале.
Я же привёл Вам свой пример кода, абсолютно корректный и не требующий блокировок.
Моя реализация не имеет с тем говнокодом абсолютно ничего общего. Если Вы конечно умеете читать и понимать си-код...
Если видите в моём коде проблему -
укажите где? Кодом пожалуйста.