Multitarefa com o PIC16f877a ( thread )

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Multitarefa com o PIC16f877a ( thread )

Mensagempor rodrigoadachi » 19 Mar 2009 08:46

Ola pessoal,

Tenho pouco tempo que comecei a estudar o PIC, de lá pra cá foi uma luta des de fazer a cender e piscar um LED :D kkk

Conseguir escrever no LCD, escrever na serial e ler com o Hyperterminal do Ruwindows, ah detalhe ainda naum conseguir ler na serial do PIC, mas vamos chegar lah.

O meu grande problema hoje é entender como funciona o "thread" que pelo que li e é o que tô precisando é de ser possivel ter um programa multi tarefa, onde posso ler e tratar um bit ao mesmo tempo de outro ..

Gostaria que se possivel me ajudassem nessa...

Des de já agradeço...
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor fabio_pic » 19 Mar 2009 08:54

rodrigoadachi,

Até onde sei, o PIC faz ou uma coisa ou outra. Você está escrevendo em assemble ou C?

Abraços,
Fábio.
fabio_pic
Nibble
 
Mensagens: 81
Registrado em: 03 Set 2007 09:04
Localização: Rio de Janeiro

Mensagempor rodrigoadachi » 19 Mar 2009 09:25

Estou escrevendo em C.

Cara sei q ele faz uma coisa ou outra mas andei lendo algo sobre token ou algo do tipo que ele faz um ciclo de leitura dai da a impressão que é multitarefa.

Por exemplo eu quero soar um beep em uma saida utiliza varios delays dai meu programa todo pararia por causa de um beep?

Talvez eu naum esteja sabendo expresar o q eu tô querendo mas eh tipow isso kk

Valew...
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor fabim » 19 Mar 2009 09:29

xará.
Tem um detalhe bem antigo, que era chamado de kernel for pic.
É tipo um mult tarefa, com função em interrupção, até mesmo um processador de grande porte faz apenas uma coisa pr vez, o que ajuda ele é o DMA e as IDE´s..
Tipo imagina você gerar interrupção a cada 1mS, igual no pc.
Nestes 1mS, você vai para uma sub, que sai perguntando pra todo mundo se alguem esta precisando de algum processamento, se sim seta um um flag e return;
lá no main ele sai testando os flag´s e executando e sai novamente vai para o condicional de baixo e assim por diante.

Eu sinceramente, com 20mhz em um 877 acho isso totalmente inviável..

Se fosse um 4550 em 48mhz "12mips" ja ia melhorar um tanto bom..

ou seja rodrigoadachi, esquece.. ou você parte para um microcontrolador macho com dma e tudo mais, ou esquece..

fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor rodrigoadachi » 19 Mar 2009 10:13

Deu pra entender..

:cry:

Me fala! Qual PIC vc me recomenda...
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor xultz » 19 Mar 2009 11:07

Rodrigo, o PIC não é multitarefa. Porém, todos os processadores x86 antes dos dual core também não são multitarefa. O esquema do multitarefa é todo feito em software.

Um esquema muito usado é usar e abusar de interrupções de timer.
Por exemplo, no teu caso, você pode ligar o beep, configurar o timer para gerar uma interrupção depois do tempo de beep que você quer. Daí teu firmware continua, e quando gerar a interrupção, a ISR (interrupt service routine) desliga o beep.

Um kernel como o linux faz mais ou menos isso, com a diferença que o timer gera a int, e o kernel muda de tarefa, e quando estoura de novo, pula prá outra tarefa e assim por diante. Pro usuário, parece que tá fazendo milhares de coisas simultaneamente.

Nota: você consegue fazer isso com qualquer PIC, rodando em qualquer clock.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor msamsoniuk » 19 Mar 2009 11:08

que eh isso fabim, nao desanima o guri nao... a sun2 com um 68010 de 1MIPS rodava unix, fazia multitarefa preemptiva, suportava memoria virtual e ainda controlava display grafico e interface ethernet. ainda hoje existem produtos novos com 68000 rodando nessa faixa de performance, com bem pouca memoria, mas rodando algum RTOS preemptivo numa boa.

o problema nem eh performance, o grande problema eh limitacao de memoria! isso pq vc precisa trocar contextos entre uma task e outra, entao nao dah para ter muitas tasks pq nao tem onde armazenar os contextos.

eu acho que existem alternativas quanto ao consumo de memoria... eu fiz uma implementacao totalmente experimental de um pequeno RTOS nao-preemptivo (para ficar portavel), com escalonamento cooperativo feito por passagem de mensagens:

http://framework.sourceforge.net/pics/hc908rtos/trunk/

testei em um mcu com 4KB de FLASH e 384 bytes de SRAM e comecei a ficar meio que sem memoria FLASH nesta altura, rodando uma task para a UART, uma para o RTC, um pequeno shell de console e uma aplicacao simples ativada dinamicamente pelo shell.

em essencia, a unica diferenca para uma multitafera preemptiva eh que um bug em uma task *pode* crashear o sistema operacional inteiro... mas para isso existe watchdog. e claro, desenvolver para mcu requer gente mais gabaritada e com mais conhecimento, nao aqueles pacotes de bolacha que desenvolvem software bugado para windows! :)

fabim escreveu:xará.
Tem um detalhe bem antigo, que era chamado de kernel for pic.
É tipo um mult tarefa, com função em interrupção, até mesmo um processador de grande porte faz apenas uma coisa pr vez, o que ajuda ele é o DMA e as IDE´s..
Tipo imagina você gerar interrupção a cada 1mS, igual no pc.
Nestes 1mS, você vai para uma sub, que sai perguntando pra todo mundo se alguem esta precisando de algum processamento, se sim seta um um flag e return;
lá no main ele sai testando os flag´s e executando e sai novamente vai para o condicional de baixo e assim por diante.

Eu sinceramente, com 20mhz em um 877 acho isso totalmente inviável..

Se fosse um 4550 em 48mhz "12mips" ja ia melhorar um tanto bom..

ou seja rodrigoadachi, esquece.. ou você parte para um microcontrolador macho com dma e tudo mais, ou esquece..

fabim
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Djalma Toledo Rodrigues » 19 Mar 2009 12:48

Oi Fabim
Até uma tartaruga é multitarefa.
Come alface e vai andando, devagarinho mas vai. Quando se vê ja esta bem longe.
:lol: :lol: :lol:
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor andre_luis » 19 Mar 2009 13:44

Então...

Como o xultz mencionou, não podemos confundir multitarefa, com multicore.

Multitarefa, nada mais é do que um SO, em cima do qual os módulos do programa serão executados com alocações de tempo e gerenciamento de memoria distintas.

POREM, certamente um 16F877 terá muito trabalho para fazer isso, haja visto à pouca memoria RAM disponível, além da pilha insignificante de 8bytes.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor rodrigoadachi » 19 Mar 2009 13:53

Entaum cm o 16F877A dá neh? Mas depende da aplicação neh?

Poderia me dar um exemplo de como posso fazer isso?

Em C por favor kk ( Num sou muito fã de ASM naum kk)

Eu uso o PCW
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor tcpipchip » 19 Mar 2009 14:45

Ola,

Eu aconselho voce usar JAVA para PIC para implementar threads!

Funciona bem.

T+

TCPIPCHIP

PS: para familia 18, ok ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor HC908 » 19 Mar 2009 16:37

Ja fiz varios projetos utlizando o 16F877A rodando em mult-tarefa. Fiz um kernel q utilizo em todos os processadores q eu trabalho. Cara em todas as aplicações simples e complexas o PIC conseguio rodar sem problemas , entaum vamos acabar com este MITO q o PIC16F877 no suporta ou coisa deste tipo. Depende muito da sua aplicação.Agora se sua aplicação vai existir varios processos ai SIM o pic16F877 não vai dá conta, por conta de memoria e até mesmo tempo de processamento.. Tudo depende da sua aplicação.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor msamsoniuk » 19 Mar 2009 17:52

o dureza eh fazer caber a maquina virtual do java nele neh.

tcpipchip escreveu:Ola,

Eu aconselho voce usar JAVA para PIC para implementar threads!

Funciona bem.

T+

TCPIPCHIP

PS: para familia 18, ok ?
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor RobL » 19 Mar 2009 18:07

O tcpipchip colocou corretamente.
Veja, não quer apenas um kernel ele quer threads.

Agora fica mais difícil sim fazer isto em um pic mesmo 18F. A não ser que você esteja confundindo e querendo apenas uma distribuição de tarefas em nível de kernel e não de software (threads).
Se for um kernel preemptivo restrito dá tranquilo num 18F, agora isto e mais um "taskeamento" no software num pic é dose sim.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor tcpipchip » 19 Mar 2009 19:04

Voce nao necessita por uma maquina virtual dentro do PIC, mas pode programar em JAVA para ele sem problema algum. É claro que nesta historia entra um tradutor de bytecode para a linguagem nativa do PIC.
Traduz certinho, classes, objects, heranca, polimorfismo, threads e principalmente exceções.
T+
TCPIPCHIP

PS: rodo num PIC18F6627
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Próximo

Voltar para PIC

Quem está online

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

cron

x