Ponteiros e Buffers circulares (migrado)

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ponteiros e Buffers circulares (migrado)

Mensagempor Fábio Pereira » 17 Out 2006 12:36

Jundiaí
Professor


Brazil
443 Posts Posted - 31/05/2003 : 14:18:37
--------------------------------------------------------------------------------
Estou querendo fazer um ponteiro ciclico para me dar a posição de uma tabela que eu tenho que ler, porém não sei se isso é possível. Gostaria de fazer isso pois tenho vários ponteiros percorrendo esta tabela e tenho que ficar testando todos para saber se a posição atual é igual a ultima posição para então zera-los, o que me consome muito tempo. Gostaria de saber se não tem como quando o ponteiro chegar na ultima posição voltar diretamente para a primeira sem ter que ficar fazendo teste?

Muito obrigado


KrafT
Conselheiro


Brazil
3476 Posts Posted - 31/05/2003 : 14:53:56
--------------------------------------------------------------------------------
Seria isso?


valor=Tabela[Ponteiro];if (Ponteiro++ == LimiteTabela)Ponteiro=0;



Jundiaí
Professor


Brazil
443 Posts Posted - 31/05/2003 : 18:36:12
--------------------------------------------------------------------------------
Isso é o que eu estou fazendo, porém gostaria de saber se existe alguma maneira de retornar a zero sem fazer esta comparação, criando assim um ciclo, como se ele soubesse que após a ultima posição ele deve retornar ao zero. Talvez eu esteja querendo demais hehehe

Obrigado Kraft e a todos.


KrafT
Conselheiro


Brazil
3476 Posts Posted - 31/05/2003 : 18:42:19
--------------------------------------------------------------------------------
Vamos viajar um pouco:

Se tua tabela tiver 256 registros e o ponteiro for de 8 bits sem problema.

Mas se o tamanho da tabela for potencias de 2 (até 2 na 7), vc pode repetilo para encher os 256 registros e ter o mesmo efeito citado acima...

Nossa!!!

Viajei legal...


guest2003
Conselheiro


Brazil
1488 Posts Posted - 02/06/2003 : 00:35:03
--------------------------------------------------------------------------------

Ola Jundiai,

Se sua tabela não variar de tamanho e tiver um tamanho com potencia de 2... (2,4,8,16...256)

Vc pode definir sua variavel utilizando structure... e com o numero de bits necessarios somente... ou seja... se sua tabela tiver 32 pos defina seu ponterio com uma struct de 5 bits... ai quando vc incrementar esta variavel ela automaticamente mudara de 31 para 0 novamente...

[]´s

PS.: Não sei se fui muito claro mas é por ai...
PS2: Vc é de Jundiai ? eu moro em Campinas...

-----
"Nunca ande pelo caminho traçado, pois ele conduz somente até onde os outros já foram." -Alexander Graham Bell

Jundiaí
Professor


Brazil
443 Posts Posted - 02/06/2003 : 07:39:04
--------------------------------------------------------------------------------
Obrigado Guess e Kraft pela valiosa ajuda. Eu moro em Jundiaí sim Guess.

Até+


KrafT
Conselheiro


Brazil
3476 Posts Posted - 02/06/2003 : 21:54:23
--------------------------------------------------------------------------------

quote:
--------------------------------------------------------------------------------

Vc pode definir sua variavel utilizando structure... e com o numero de bits necessarios somente... ou seja... se sua tabela tiver 32 pos defina seu ponterio com uma struct de 5 bits... ai quando vc incrementar esta variavel ela automaticamente mudara de 31 para 0 novamente...

--------------------------------------------------------------------------------


Isso em assembler, iria gerar o mesmo teste que o colega quer evitar...

Ou não?


Jundiaí
Professor


Brazil
443 Posts Posted - 03/06/2003 : 10:30:51
--------------------------------------------------------------------------------
É Kraft também estive pensando nisso e provavelmente á única forma de de ele fazer isto em assembly é com um bit test o que acaba fazendo a comparação também.

Obrigado


Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 03/06/2003 : 11:29:16
--------------------------------------------------------------------------------
Olá a todos,

Eu venho acompanhando este tópico há tempo e até agora não entendi:

Jundiaí: qual o problema de se realizar a comparação ???

Uma alternativa para criar este buffer circular que você deseja (desde que com um número de elementos múltiplo de uma potência de 2) poderia ser:

Suponha um buffer circular de 32 elementos, o primeiro começando pelo elemento 0 e como último elemento o 31:


Elemento endereço 0 0x20 1 0x21 2 0x22 ... ... 30 0x3E 31 0x3F

Neste caso, uma forma simples de criar um buffer circular é fazer um AND lógico do número do elemento com a constante 31 (0x3F). Assim, quando o endereço do buffer for maior que 31, por exemplo, 32, teremos: 32 AND 31 = 0, se o índice for 35: 35 AND 31 = 3 e assim por diante.

Uma vez que você tenha realizado esta operação, qualquer que seja o valor utilizado como índice, o resultado será sempre um apontador válido. Em seguida, adicione este resultado ao endereço inicial do buffer (no exemplo acima 0x20) e pronto.

Até +

Fábio Pereira


zemarlon
Conselheiro


Brazil
660 Posts Posted - 06/06/2003 : 17:35:45
--------------------------------------------------------------------------------
Bom, deixa só acrescentar uma informação.

Quando trabalhava com rádio-modem, eu tive esse tipo de problema - a comparacao quando o ponteiro alcancava o final produzia uma forma de onda diferente da desejada.

A maneira que encontrei foi ter DUAS tabelas, uma com os valores que queria e a outra com os indices, dispostos em forma circular. Um exemplo:

tbValores: 22 32 55 22 10
tbIndices: 1 2 3 4 0

Se nao fui muito claro, é só avisar que assim que voltar a acessar o fórum (vai demorar um pouco mas eu volto) eu publico um exemplo em asm ou C.

;)

Abração do Zé.
"É melhor ter um passarinho na mão, do que não ter mão."


\|||/ ( O O )-000---000-
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x