jah vi bastante em controladores ethernet... mas um ring buffer com elementos diretamente enderecaveis nao seria na realidade uma FIFO?

se o numero de elementos na FIFO for 2^n, fica melhor ainda, pois vc pode usar um pointeiro que possui n+1 bits e usar o bit extra para detectar quando a FIFO esta cheia ou vazia:

isso em verilog onde manipulamos bits diretamente, mas eh facilmente adaptavel para C ou asm com operadores logicos! no caso de FIFOs para apliacoes de alta performance, eh comum ainda detectores para a FIFO 1/4 cheia, 1/2 cheia ou 3/4 cheia, de modo a mudar a estrategia de operacao e maximizar a performance (ele acelera e desacelera a logica o uso para tentar manter a FIFO sempre em uso).
e de fato, usar frames nao muda muito o funcionamento... a diferenca eh que vc vai construir uma FIFO de pointeiros para frames e os frames entao vao aparecer em uma estrutura logica que eh o ring buffer! ou seja, a task prepara um frame e entao insere o pointeiro para o frame na lista. a medida que o controlador transmite os frames, ele vai tirando os ponteiros da FIFO... bem simples e eficiente! (:

evidentemente, vc pode construir listas linkadas para esse tipo de estrutura tambem, mas ring buffers sao mais facilmente manipulados por hardware puro (vide o exemplo de FIFO acima em verilog), motivo pelo qual ainda se usa muito para IO isso.
Vonnilmam escreveu:Olá a todos,
Meus caros, estou querendo implementar um buffer circular com uma saída serial comum (0~5v) start / stop, o tamanho do frame seria 20 caracteres.
Alguém poderia me dar uma luz.
Tanto faz assembler ou c...o micro que estou querendo usar é o pic18.
O objetivo da minha questão é polemizar o uso, atualmente eu já utilizo esse tipo de buffer com chamadas aleatórias dentro do MAIN, sem o uso de interrupções...
Obrigado,