ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1013103 Топик полностью
LightElf (19.06.2020 02:13, просмотров: 969) ответил fk0 на Я не обобщаю, я подвожу к сложности реализации такой элементарной сущности как условная переменная. Без которой нормально задачу не решить. Да, её можно построить на базе пары семафоров, причём один нужен в TLS (а в ThreadX есть TLS?), или можно сделать как в SDL, по семафору на каждого ждуна (что реально плохо выглядит когда их много -- я уже как-то писал про это). В данной задаче можно схалявить и сделать недоделку (не являющуюся полноценной условной переменной, но
Ну вот опять за рыбу деньги попытка найти единое универсальное решение. Первое, что стоит сказать - на мелких процессорах системный вызов, как правило, легкий по тактам. Второе, чаще всего есть возможность просто и дешево сделать короткую критическую секцию, например запретив прерывания. Третье, там обычно нет SMP. Все это меняет развесовку описанных тобою проблем. 

Вариант 1 не идеален (не бажный, а не очень эффективный), с другой стороны ты же не хочешь, чтобы куча непрерывно сыпящихся коротких сообщений, не давали другому потоку отправить свою камасутру с иллюстрациями? Как ни изгаляйся, пока он свои 100 байт не отправит - всем остальным стоять-бояться. Суть в том, что либо в буфере есть место для пиковых объемов, либо кому-то все равно придется стоять.

Вариант 2 определяется возможностями железа. Если у данного конкретного UART-а есть FIFO 64 байта и нет DMA - то хоть усрись, будешь дробить посылку на куски и не суть важно, как это будет делаться. Может из прерывания, может пробуждением и усыплением потока. Можно перейти к варианту 1, эмулируя DMA высокоприоритетным прерыванием. Но хорошего варианта тут просто нет. Не устраивает - значит логировать по UART-у на данном процессоре не выйдет, надо брать другой интерфейс, другой процессор или делать бинарный лог, 16 байт на событие хватит всем :)

Не надо делать мне как лучше, оставьте мне как хорошо