Pages: [1]   Go Down
Author Topic: Processamento de execução paralela com ATmega  (Read 1439 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
Keep Drink!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Consideremos dessa forma, mas se tratando de microcontrolador, um só nesse caso, é só um processador, ou seja: irá executar instrução por instrução, por vez. Se temos algum projeto que precisamos executar (processar) uma ou mais coisas de uma só vez, existe alguns meios de se fazer isto, já andei estudando sobre. Descobri que é possivel, mas desde que não seja processamentos que necessitem de muita precisão, como controles PID. Alguns dos amigos tem conhecimento sobre algo?
Logged

"Um verdadeiro vencedor deve ver o mundo não da forma como ele é, mas sim como o mundo deveria ser."

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim... divides o programa e colocas outro processador ligado ao principal encarregue dessa tarefa.

Que precisas de fazer ao certo?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 14
Keep Drink!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim... divides o programa e colocas outro processador ligado ao principal encarregue dessa tarefa.

Que precisas de fazer ao certo?

Não, quero executar mais de uma tarefa simultaneamente com um só processador.
Logged

"Um verdadeiro vencedor deve ver o mundo não da forma como ele é, mas sim como o mundo deveria ser."

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Impossível!!!  smiley-cool

Digo isso porque o processador só pode executar uma instrução por vez, o que significa que nunca terás duas coisas acontecendo ao mesmo tempo, a não ser que utilizes um duo, onde poderá ter uma instrução para cada core.

O que procura é algo como as libs abaixo:
http://www.kwartzlab.ca/tag/multi-threading/
https://code.google.com/p/threadkit/

Não fui a fundo ainda, até porque o que eu precisava resolvi com as interrupções.

Vamos ver se alguém se aventurou por esta área...
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mortis, queres dizer Due ou duo?

O Due só tem um core... logo também só executa uma coisa de cada vez.

E que tarefas são essas? O processador pode não fazer as duas ao mesmo tempo, mas aos teus olhos pode parecer assim.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá, bubulindo!

Desculpe-me, eu me referia a dois processadores em um único chip (core to duo, por exemplo).

Sei como funcionam as threads, mas preferi trabalhar (brincar, na verdade) com condições no loop para alternar entre métodos e funções. Creio que seja a solução mais simples, sem interromper o loop do arduino ou fazer concorrência com ele =)

Eu uso as interrupts para monitorar comandos externos (sensores/switchs) e amlimento variáveis globais, trando os resultados no loop, se quero 10 amostragens, por exemplo, no lugar de um "while ou for" + delay(), eu trato dentro do loop do arduino.

Mas essas são preferências pessoais, por isso indiquei os links para as libs smiley-wink
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Na grande maioria das vezes a percepção que se tem é que as coisas têm de ser feitas ao mesmo tempo quando na realidade isso não é bem assim.

Existem exemplos de controlo PID que são temporizados com o millis e funcionam perfeitamente bem. Aliás, é possível compensar o tempo de ciclo irregular no controlo PID (acredito que uma das bibliotecas para o Arduino faz isso). Existe também a possibilidade de criar uma interrupção com o timer e dentro da interrupção correr o código PID. Embora nesta situação é bom que o PID use inteiros e não floating points.

Daí que cada caso é um caso e só analizando se pode perceber qual o efeito que um atraso no PID ou algo do género terá no controlo.

Mortis, usar delay() é pecado. smiley-razz
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Na grande maioria das vezes a percepção que se tem é que as coisas têm de ser feitas ao mesmo tempo quando na realidade isso não é bem assim.
É bubulindo, foi a essa conclusão que cheguei!

É que pensamos, por exemplo, que uma thread para monitorar cada botão é a solução para o caso de dois botões (ou sensor wall) serem pressionados ao mesmo tempo smiley

Quando pegamos um microcontrolador para "brincar pela primeira vez" temos o pensamento de que ele funcionará como um computador pessoal, mas aos poucos vamos percebendo que a coisa é bem diferente e são necessários muito mais cuidados (como o uso tipos de 8 ou 16 bits no lugar dos de 16, esquecer o tipo string, ter cuidado com loops dentro do loop, etc), tudo para evitar que algo seja perdido.

O mesmo eu diria sobre threads, pode se tornar um problema no lugar de uma solução, mas como você disse, cada caso é um caso.

Perdoe-me padre, pois eu pequei!!! lol
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
Keep Drink!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Impossível controle PID sem floating points. É como vocês disseram, a nosso olhos o microcontrolador executa diversas tarefas, mas não é bem o que acontece. Estou criando uma biblioteca para me auxiliar nessa "ilusão"  smiley-cool
Logged

"Um verdadeiro vencedor deve ver o mundo não da forma como ele é, mas sim como o mundo deveria ser."

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estou criando uma biblioteca para me auxiliar nessa "ilusão"  smiley-cool

Olá, Flip-Flop,

Bacana! Ms por curiosidade, o que te motiva à implementar threads no arduino?
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Impossível controle PID sem floating points. É como vocês disseram, a nosso olhos o microcontrolador executa diversas tarefas, mas não é bem o que acontece. Estou criando uma biblioteca para me auxiliar nessa "ilusão"  smiley-cool

é mais limitado, admito... e os inteiros podem dar sarilhos de estabilidade, mas não diria impossível. No entanto, nunca testei isso para ver o resultado, logo fica para outra altura como curiosidade. O interesse em usar inteiros é precisamente para evitar fazer multiplicações e divisões e usar bit shifts (desde que os parâmetros sejam divisíveis por dois). Mas isso realmente ia ser uma chatice para ajustar.

Então o que é que a biblioteca vai fazer mesmo?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 14
Keep Drink!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estou criando uma biblioteca para me auxiliar nessa "ilusão"  smiley-cool

Olá, Flip-Flop,

Bacana! Ms por curiosidade, o que te motiva à implementar threads no arduino?


Não quero usar exatamente no Arduino, sim nos AVR em geral, uso eles no meu trabalho e entre uma automação e outra, me deparo com várias tarefas que precisam ser executadas pelo mesmo MCU e minha motivação é só para me ajudar a facilitar a escrita do código, pois já me deparei com alguns problemas. Estou a projetar melhor isso, pois tenho outros projetos e pesquisas.

Quanto a o PID, o Proporcional Derivativo, meio que anulas as chances desse controle ser tão preciso sem floating points, mas depende de cada aplicação.
« Last Edit: June 04, 2013, 09:52:39 pm by Flip-Flop » Logged

"Um verdadeiro vencedor deve ver o mundo não da forma como ele é, mas sim como o mundo deveria ser."

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quanto a o PID, o Proporcional Derivativo, meio que anulas as chances desse controle ser tão preciso sem floating points, mas depende de cada aplicação.

Sim, é isso... é tudo um compromisso, creio.

Mas que tarefas precisas de executar precisamente ao mesmo tempo?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

É isso ai, Flip-Flop.

Estou arqui por hobby, não trabalho com microcontroladores, mas, se você tiver interesse, compartilha conosco quais foram os resultados, é sempre bom saber smiley-wink

Bons projetos por ai!
Logged

são paulo
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Acredito que você esteja se referindo a multitask, processo no qual um sistema operacional aloca um tempo de processamento para cada task (programa) iniciado. Isto dá a impressão de processamento paralelo, mas na verdade o tempo do processador foi dividido. Isto é feito através de uma interrupção interna. Por exemplo, um programa com 4 funções independentes (tasks) e interrupção de timer a cada 40 mseg. Veja que estas tasks não rodam no main(), elas são controladas apenas pela interrupção.
Sequencia: interrupçaõ, salva no stack ambiente da task n+3, recupera do stack ambiente da task n,    roda task n
               interrupção, salva no stack ambiente da task n,    recupera do stack ambiente da task n+1, roda task n+1
               interrupção, salva no stack ambiente da task n+1, recupera do stack ambiente da task n+2, roda task n+2
               interrupção, salva no stack ambiente da task n+2, recupera do stack ambiente da task n+3, roda task n+3
               interrupção, salva no stack ambiente da task n+3, e assim indefinidamente.
Isto é usado no caso de processos que não necessitam dedicação integral, como esperar pelo teclado, atualização de tela, sensor de presença e outros.
Logged

Pages: [1]   Go Up
Jump to: