ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
22 декабря
1013113 Топик полностью
fk0, легенда (19.06.2020 02:49, просмотров: 985) ответил LightElf на Ну вот опять за рыбу деньги попытка найти единое универсальное решение. Первое, что стоит сказать - на мелких процессорах системный вызов, как правило, легкий по тактам. Второе, чаще всего есть возможность просто и дешево сделать короткую критическую секцию, например запретив прерывания. Третье, там обычно нет SMP. Все это меняет развесовку описанных тобою проблем.
А какое должно быть решение? Можно подумать, что какие-то фундаментальные принципы в "computer science" чем-то отличны в зависимости от фирмы выпустившей микропроцессор. Может и не UART вовсе, а TCP/IP, и не микроконтроллер, а Core I9. Суть от этого не меняется. А ты хочешь сказать, мол в зависимости от того какой глубины UART в МК всё кардинально меняется... На верхнем уровне абстракции ничего о реализации нижнего знать не положено. Принято, что есть некий метод write, 

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


Запрет прерываний -- выход только для CPU и ОС где нет разделения на супервизор и юзерспейс режимы, вроде мелких пиков. Но даже если, между "можно сделать" и "уже сделано" -- две большие разницы. Так сейчас где-то сделано, что прерывания запрещаются? Есть такие реализации атомиков в libgcc, например?


Вариант 1 именно что бажный: не выполнено условие задачи -- максимально использовать буфер, а не блокироваться при полупустом буфере (ключевое слово -- блокироваться, хоть блокировки запросто можно было избежать, ведь в буфере есть место). У тебя каждая запись начнёт, после первого затыка, требовать сигнализации семафора. Потому, что толпа потоков встанет в ожидание и на каждый отправленный пакет, условно, ты будешь будить ровно один поток, который условно тоже один пакет положит в буфер. Даже если всегда в буфере есть место, ты всегда постишь семафор после отправки очередного пакета, тебе теперь чтоб избавиться от очереди висящих на семафоре нужно отправить столько пакетов сколько потоков в очереди. И они будут долго там висеть, а другие будут без очереди херачить в буфер (потому, что место есть). Это бы работало, если бы сообщения в буфере имели одинаковый размер. Но размер по условиям задачи может варьироваться. И запросто вместо одного отправленного килобайтного сообщения влезет 50 шт. 20-байтных.

[ZX]