Conceito de "Multithreading"

Pessoal gostaria de falar algo sobre " Multithreading".
Vejo que muitas vezes o pessoal se perde em conceitos da arquitetura dos microcontroladores como eles funcionam e suas reais capacidades.
O processamento do microcontrolador é muito rápido determinado pelo “clock”. Este clock comanda as operações que podem chegar a milhares ou milhões por segundo.
O arduino por exemplo é single core ou seja com um núcleo e 8mhz ou seja 8 milhoes de siclos por segundo.
O ESP8266 é singue core ou seja processador com 1 núcleos
O ESP32 é dual core ou seja processador com 2 núcleos
A Raspberry é quadri core ou seja processador com 4 núcleos
Ai vem o pulo do gato! o que isso quer dizer?
Vejo perguntas do tipo: Quero fazer 2 coisas ao mesmo tempo no processamento!
Bem vamos por partes o código é lido de baixo para cima da esquerda para direita e os espaços em vazio e comentários são ignorados no processamento do código então como eu processo 2 coisas ao mesmo tempo sendo que na execução so código é feito em sequência?
Usando técnicas de multithreading é possivel vc pode fazer 2 loops reais rodando simultaneamente, vc também pode usar microcontroladores com mais núcleos e executar tarefas direrentes em cada núcleo um loop em um core e outro loop em outro core! (Isso na prática exceto em alguns casos é desnecessário depois vou explicar o porque!)
Vc pode executar processamento Barril ou intercalado que nada mais é do que em cada siclo ele vai executar uma instrução diferente (nunca usei mas sei que dá para fazer) tem noção do que é isso? Em um microcontrolador sem vergonha de 8mhz são 4 milhões de vezes por segundo em cada instrução de processamento intercalado é uma varredura fodastica por segundo!
Vc pode tbm usar interrupções que tbm vc vai atingir o que vc espera.
Na realidade em sua maioria dos casos vc resolve seus problemas sem precisar focar no harware somente pelo código bem escrito vc resolve seu problema, quando falamos de varedura de milhoes de vezes por segundo essa de processar 2 coisas ao mesmo tempo acaba sendo irrelevante na pratica ai tem os experts que vão falar o contrário bem a eles eu digo que adianta ter um ciclo de milhoes de vezes por segundo se sua a máquina física digo mecânica não acompanha isso? Alguem ai já viu um cilindro pneumático fazer um ciclo assim? ou uma válvula? Eu não hahahaa :^) . Agora quando falamos de processamento por exemplo vamos imaginar de cartão de crédito onde milhares de usuarios utilizam o processamento simultaneamente ai vc tem que ter um código enxuto e cada milisegundo conta. Uma plataforma de petroleo ou uma petroquimica em um supervisório onde facilmente se tem uns 2 ou 3 mil Inputs ou Outputs o processamento conta mas isso são apenas menos de 1% das aplicações de automação a maioria esmagadora vai ser programas simples como de maquinas de lavar por exemplo…
Um assunto também muito importante em programação de microcontroladores é o uso de interruptores imagine que vc tem seu programa rodando em um loop e vc precise interromper determinada função ou execução bem no meio seja sei lá por que evento seja tipo um sensor ou acionamento de um botão esse tipo de tática no código é muito importante e é imprecindivel seu conhecimento e domínio na programação.

1 curtida

Boa @skullcrusher777

Meus códigos, até por questão de conhecimento e experiência pessoal, são na maioria das vezes feitos em assembler, o que me dá um controle absoluto sobre a máquina.

Dado que o mundo físico e exterior é extremamente lento perto dos controladores essa necessidade se dá mesmo em ambientes com sistemas operacionais embarcados que são mais lentos do que o mundo do controlador e com funções mais complexas.

Boa explanação.

Abraços.

Faço de suas as minhas palavras.

Pelo que observo em meus projetos mais complexos com microcontroladores, temos uma ideia inicial onde há a necessidade do uso de multithreading, mas em duas ou três iterações de otimização do código, já percebo que utilizar o multithreading não mudaria em absolutamente nada a execução do programa.
Basta usar a cabeça e perseguir uma solução mais elegante com o uso das interrupções dos microcontroladores, contornamos isso, o que inclusive torna o processo de atualização e reutilização do código mais simples.

Porém para a programação de sistemas de uso geral que não são em tempo real, como o Raspberry ou semelhantes, uma vez que o software tende a ser mais complexo e por vezes utiliza requisições de bancos de dados, APIs, comunicação com sistemas em tempo real, análises de imagem, utilizam bibliotecas extensas, e o próprio sistema operacional é assíncrono. Para estes sim, o ganho de confiabilidade e velocidade com o uso de técnicas de Multithreading se mostrou considerável pelo menos para mim.

1 curtida

Oi Adsiro td bem?
Me lembrei de uma conversa interresante que tive uma vez com um representante da SolidWorks e perguntei para ele pq um pentium100 com clock elevado tem um desempelho melhor no solidworks que um computador I7 COM menor clock e ele me respondeu que o solid vai rodar em um núcleo só ele não divide tarefas ou seja vc ter um i7 não vai ajudar muita coisa… Cada caso é um caso msm. mas hj em dia quando no caso de computação temos varios programas ligados ao mesmo templo ter varios núcleos ajuda e muito.

Oi WagnerB bom dia!
Eu tenho um amigo que é top nos microcontroladores e ele tbm utiliza muito o assembler em seus trabalhos mas eu particularmente não conheço quase nada quando eu vejo um código em assembler dá vontade de chorar kkkkkk estes dias tava vendo umas vagas de programador na área de embarcados e robotica nos EUA e um dos quesitos era domínio em assembler e C.

1 curtida

@skullcrusher777 no início eu chorava muito kkkkkkk.

Quando me formei fiquei desempregado na transição técnico-engenheiro e numa pindaíba. Ninguém queria me empregar como técnico sendo eu formado. Meu CREA tinha as duas profissões registradas.

Até que apareceu uma empresa que queria um engenheiro eletrônico que tivesse noções de programação e eu só tinha a experiência do trabalho de fim de curso. Na entrevista eu falei que dava pra resolver o problema do cara que topou me contratar, mas que eu tinha a missão de resolver um problema de um hardware/firmware de controle de acesso em 1 mês para obter a vaga de engenheiro de desenvolvimento.

Achei moleza até abrir os códigos do equipamento. Todos em assembler do 8031 e o melhor, sem comentários salvadores kkkkkk. No meu caso era ou faz ou faz…

Foi um mês de 14 horas diárias de assembler na veia até chegar lá, só não lia código aos domingos. Foi essa “imersão” que me ajudou a aprender a “língua” do 8031 (queria fazer isso com o inglês e o espanhol kkkkk).

Mas depois que se aprende o conceito, vai por mim, é muito fácil. Não é papo não. E o melhor independente de controlador ou processador.

Agora depois que passei a usar o C minha vida mudou muito, ao menos quando preciso fazer algo bem simples que independe das temporizações críticas.

Se ainda tiver vontade (muita) e quiser se enveredar por essa seara pode contar comigo, no que eu puder eu ajudo.

Abraços.

WgnerB hj em dia acho que meu maior problema é tempo tem muita coisa bacana na fila para aprender e tem que ir priorizando infelizmente,

1 curtida

Justamente @Ludicon o negócio é cair de paraquedas no assunto, :slight_smile: .

Naquele passado que narrei eu precisava de uma experiência profissional para poder deixar de ser o técnico e o desafio foi realmente complicado, mas tudo deu certo.

Hoje em função desse meu aprendizado “forçado” as coisas ficaram mais simples e fáceis.

Um grande tutor que tive sempre me disse que tendo uma meta, determinação e foco a coisa funfa, como no caso do salto kkkkk.

Abraços.

@skullcrusher777 precisando estamos por ai é só gritar.

Abraços.