RuiViana

texto Threads

Jul 8th, 2016
137
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Oi pessoal, boa tarde.
  2.  
  3. Em várias oportunidades tenho ajudado, amigos no LdG, que precisam que o a arduino faça mais que uma tarefa
  4. simultaneamente. Por exemplo; ler um valor em um sensor e girar um servo motor.
  5.  
  6. Isto recebe o nome de multi processamento ou multitarefa (Multitasking).
  7. Como o arduino só tem um núcleo, isto é impossível.
  8.  
  9. Mas existe um recurso que simula o multitasking no arduino. É a biblioteca " Threads ". É um multitasking virtual.
  10.  
  11. Esta biblioteca trabalha assim:
  12.  
  13. São definidos tempos para que cada tarefa seja executada:
  14.  
  15. Ex: define que a tarefa de ler o valor do sensor será de 20ms e a tarefa de girar o servo motor será de 30ms.
  16.  
  17. Após configurar os parâmetros para serem usados com a biblioteca threads, teremos a seguinte situação:
  18.  
  19. Durante 20ms o programa executa a atividade de ler o sensor, aí ele para, e salva todas informações pertinentes ao que estava fazendo,
  20. e começa a a tarefa de girar o servo motor durante 30 ms.
  21.  
  22. Durante 30ms, o programa executa a atividade de girar o servo, aí ele para, e salva todas informações pertinentes ao que estava fazendo,
  23. restaura as informações referentes à leitura do sensor e durante 20ms continua fazendo a tarefa de ler um valor no sensor.
  24.  
  25. E assim fica fazendo: 20ms lendo sensor, 30ms girando servo.
  26.  
  27. Como a velocidade de troca de tarefa é muito rápida, as paradas de cada tarefa passam despercebidas, parecendo que o arduino
  28. está fazendo as tarefas ao mesmo tempo.
  29.  
  30. Por "default" você pode selecionar até 15 tarefas "simultâneas" .
  31.  
  32. Eu montei dois codes para testar o uso da biblioteca " Threads ".
  33. Um usa delay entre acender e pagar LED,
  34.  
  35. 2 threads 1o. thread 10ms Acende LED A a e após 500milis() apaga LED A
  36. 2o. thread 10ms Acende LED B a e após 500milis() acende LED B
  37.  
  38. e o outro usa millis() para manter o LED aceso ou apagado.
  39.  
  40. 2 threads 1o. thread 10ms Acende LED A a e após 500ms de delay apaga LED A
  41. 2o. thread 10ms Acende LED B a e após 500ms de delay acende LED B
  42.  
  43.  
  44. O que eu esperava que ocorresse:
  45.  
  46. Ao iniciar o LED A deveria acender e após 10 ms o LED B acender.
  47.  
  48. Após 500ms o LED A deveria apagar e 10 ms após o LED B deveria apagar.
  49.  
  50. No code onde usei millis(), isto ocorreu como esperado.
  51.  
  52. No code onde usei o delay, isto não aconteceu, o LED B só acendeu depois que o LED A apagou. (500 ms).
  53. E o LED A só acendeu depois que o LED B apagou. (500 ms).
  54. Daí imaginei que a função delay afeta o multtasking.
RAW Paste Data