Потокобезопасный FIFO для одного потребителя и одного производителя на встроенной системе - PullRequest
3 голосов
/ 07 января 2010

У меня есть TI DSP (TMS320F28235, если кому-то все равно), который мне нужен для реализации FIFO для организации очереди информации между кодом основного цикла и прерыванием. Высокоскоростное выполнение для этой очереди очень важно, но это правильная операция, и я не уверен, смогу ли я справиться с реализацией FIFO без какой-либо явной синхронизации, или, если нет, где я должен отключить прерывания.

Я нашел эту страницу и хотел знать, может ли кто-нибудь здесь прокомментировать ее применимость.

Ответы [ 2 ]

3 голосов
/ 07 января 2010

Найденная вами страница точно соответствует вашей ситуации. Он опирается только на чтение и запись слов, являющихся атомарными. Он уязвим к аппаратным средствам, которые переупорядочивают нагрузки и хранилища. С другой стороны, почти любой другой алгоритм синхронизации, известный Man, также уязвим для этого конкретного крэка.

Если вы хотите заниматься серьезной компьютерной археологией, найдите описания циклического буфера для операционных систем CDC 6600. CDC первоначально разработал технику для связи между несколькими физическими процессорами в 6600.

1 голос
/ 08 января 2010

НОВАЯ и правильная информация

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

Для эмуляции блокировки в документации предлагается отключить прерывания.

Example ; Make the operation ”VarC = VarA + VarB” atomic:
    DINT ; Disable interrupts (INTM = 1)
    MOVL ACC,@VarA ; ACC = VarA
    ADDL ACC,@VarB ; ACC = ACC + VarB
    MOVL @VarC,ACC ; Store result into VarC
    EINT ; Enable interrupts (INTM = 0)

- Указатели алгоритма -

Прерывания опережают основной цикл, и, очевидно, атомарные операции не существуют. Ваш основной цикл должен отключать прерывания, пока он срабатывает. Так как отключение прерываний похоже на владение блокировкой в ​​этом контексте, вы можете реализовать очередь как непрерывную память или поверх слайда. Первый означает копирование памяти в стек основного цикла на pop, что может быть медленнее - однако, если у вашего FIFO достаточно памяти, вам не нужно выделять узлы slist из кучи - что означает отсутствие головной боли при управлении памятью. , Конечно, головной боли при управлении памятью не будет, если узлы slist имеют одинаковый размер.

Так, для всплывающего окна вы должны отключить прерывания и удалить элемент - после того, как это сделано, повторно включите прерывание. Для векторов прерываний это обычный бизнес (вам может потребоваться отключить прерывания во время обработки вектора прерываний - это зависит от контроллера).

...