-
- Реализация на 2-х раздельных счётчиках (один - запись, второй - чтение) вроде как норм, но получение статуса свободен-полон-сколько_есть вторую переменную всё равно читает. - Dingo(28.12.2021 04:56)
- Сделайте счетчик длиной, равной машинному слову. И вуаля. - LightElf(27.12.2021 15:37)
- На Cortex-M не прокатит (ну или надо LDREX, STREX для счётчика).
Схема голова-хвост (два счётчика) прокатит. - Chum_A(27.12.2021 16:19)
- Гм, а что, кто-то еще пользуется кольцевым буфером с одним
счетчиком? Тады ой, доктор уже выехал - LightElf(27.12.2021 19:44)
- Тогда и "длина машинного слова" ни при чём :). - Chum_A(28.12.2021 09:12)
- при определении количества данных в буфере/свободного места нужно
читать оба счетчика, потому требуется, чтобы чтение/запись были
атомарны. При этом атомарность операций над счетчиками не нужна. - LightElf(28.12.2021 15:06)
- Чего-то мысль не сходится, или нет? Chum_A(133 знак., 28.12.2021 16:20)
- Нужны только атомарное чтение и атомарная запись. Что достигается
просто использованием переменной правильного размера. Атомарная
арифметика (для которой нужны критические секции или всякие там
LDREX/STREX) - не нужна. - LightElf(28.12.2021 17:32)
- Дык, я же начал с Кортекса-М, ну не получается там атомарных
операций без всяких там.. - Chum_A(28.12.2021 17:37)
- чтение или запись uint8_t, uint16_t и uint32_t на кортексе
атомарны. Ну не может он записать сначала один байт от uint32_t, а
потом - остальные три байта. - LightElf(28.12.2021 17:52)
- UPD таки без конкретного примера дискуссия бессмыслена (возможно,
что мы рассматриваем атомарность в разных контекстах). Текст далее
оставлен "для справки". В инструкциях LDR/STR в качестве второго
аргумента всегда в том или ином виде регистр (или нет?),
соответственно его надо предварительно загрузить, что требует ещё
инструкцию. Ну и какая с двумя (минимум) инструкциями атомарность? - Chum_A(29.12.2021 10:18)
- Вот здесь пример. Прекрасно работает на кортексах (при условии, что
читатель один и писатель тоже один) с индексами uint8_t, uint16_t и
uint32_t. С индексами uint8_t работает на AVR и HCS12. На 8051
думаю тоже работать будет, если модификаторы памяти правильные
поставить. LightElf(1 знак., 29.12.2021 14:57, ссылка)
- Посмотрел, монстровый макрос. Любители ++ смотрят на Вас с ненавистью :))). - Chum_A(30.12.2021 09:08)
- Достаточно такой атомарности, чтобы читающий поток получал
стабильное состояние указателя - то есть либо текущее, либо
предыдущее. А не так, что младший байт уже инкрементировался и
переполнился, а старший ещё не обновился. - Samx(29.12.2021 10:48)
- Например, вот: SciFi(218 знак., 29.12.2021 10:59)
- Это работает, если проверять из треда указатель, изменяемый в прерывании. Samx(177 знак., 30.12.2021 15:10)
- Например, вот: SciFi(218 знак., 29.12.2021 10:59)
- Вот здесь пример. Прекрасно работает на кортексах (при условии, что
читатель один и писатель тоже один) с индексами uint8_t, uint16_t и
uint32_t. С индексами uint8_t работает на AVR и HCS12. На 8051
думаю тоже работать будет, если модификаторы памяти правильные
поставить. LightElf(1 знак., 29.12.2021 14:57, ссылка)
- UPD таки без конкретного примера дискуссия бессмыслена (возможно,
что мы рассматриваем атомарность в разных контекстах). Текст далее
оставлен "для справки". В инструкциях LDR/STR в качестве второго
аргумента всегда в том или ином виде регистр (или нет?),
соответственно его надо предварительно загрузить, что требует ещё
инструкцию. Ну и какая с двумя (минимум) инструкциями атомарность? - Chum_A(29.12.2021 10:18)
- чтение или запись uint8_t, uint16_t и uint32_t на кортексе
атомарны. Ну не может он записать сначала один байт от uint32_t, а
потом - остальные три байта. - LightElf(28.12.2021 17:52)
- Дык, я же начал с Кортекса-М, ну не получается там атомарных
операций без всяких там.. - Chum_A(28.12.2021 17:37)
- Нужны только атомарное чтение и атомарная запись. Что достигается
просто использованием переменной правильного размера. Атомарная
арифметика (для которой нужны критические секции или всякие там
LDREX/STREX) - не нужна. - LightElf(28.12.2021 17:32)
- Можно давать консервативную оценку свободного места. Если что, юзверь подождёт до следующей попытки, чай не из графьёв. - SciFi(28.12.2021 15:09)
- Чего-то мысль не сходится, или нет? Chum_A(133 знак., 28.12.2021 16:20)
- при определении количества данных в буфере/свободного места нужно
читать оба счетчика, потому требуется, чтобы чтение/запись были
атомарны. При этом атомарность операций над счетчиками не нужна. - LightElf(28.12.2021 15:06)
- Дык вот было. => На меня SciFi ругался даже. Однако показательно, что "не все буферы одинаково полезны", потому и спросил. И мультипотоки - для меня не самая знакомая мне область. Может и перестраховываюсь, но... Dingo(1 знак., 28.12.2021 05:16, ссылка)
- Тогда и "длина машинного слова" ни при чём :). - Chum_A(28.12.2021 09:12)
- Гм, а что, кто-то еще пользуется кольцевым буфером с одним
счетчиком? Тады ой, доктор уже выехал - LightElf(27.12.2021 19:44)
- На Cortex-M не прокатит (ну или надо LDREX, STREX для счётчика).
Схема голова-хвост (два счётчика) прокатит. - Chum_A(27.12.2021 16:19)