Esp32 freeRTOS Arduino IDE [RESOLVIDO] - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-28T17:29:51Zhttps://labdegaragem.com/forum/topics/esp32-freertos-arduino-ide?feed=yes&xn_auth=noApós realizar alguns testes,…tag:labdegaragem.com,2022-07-01:6223006:Comment:8845692022-07-01T14:36:13.648Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p>Após realizar alguns testes, como o meu objetivo era fazer controle de brilhos do led, através de um 595, vi que não era possível faze-lo.</p>
<p></p>
<p>O motivo, é que o recurso <strong>OBRIGA</strong> um delay de, no minimo "1ms estimado" (pode variar para mais, a depender do código), caso contrário dará erro na execução, e esse tempo oferece diferença nas atualizações dos estados do led. Ou seja, você faz um duty para 60%, mas ele estará em 50%. E quando estiver em 99%, estará em 80~90%,…</p>
<p>Após realizar alguns testes, como o meu objetivo era fazer controle de brilhos do led, através de um 595, vi que não era possível faze-lo.</p>
<p></p>
<p>O motivo, é que o recurso <strong>OBRIGA</strong> um delay de, no minimo "1ms estimado" (pode variar para mais, a depender do código), caso contrário dará erro na execução, e esse tempo oferece diferença nas atualizações dos estados do led. Ou seja, você faz um duty para 60%, mas ele estará em 50%. E quando estiver em 99%, estará em 80~90%, e ao atingir o 100%, ele ficará com 100%. ou seja, de 99% para 100% haverá um salto no brilho, indesejado.</p>
<p></p>
<p>Não sei como o "void loop() {}" funciona, entretanto, ele não "precisa" dessa pausa.</p>
<p></p>
<p>Para solucionar minha questão, também testei a interrupção, que apresentou um resultado melhor, mas também não foi 100% perfeito. </p>
<p></p>
<p>A solução definitiva veio ao migrar algumas funções (que faziam controle de LCD TFT e i2c) para o core0, e colocar delay de 100 e 50ms respectivamente.</p> Dado o tamanho da resposta pa…tag:labdegaragem.com,2022-06-27:6223006:Comment:8843782022-06-27T14:15:27.944Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p>Dado o tamanho da resposta para cada postagem, achei melhor responder em uma única postagem.</p>
<p></p>
<p>1-</p>
<p>lá RV, sobre o "<span>MACBOOK Air I7", de pequeno não tem nada hahahaha.</span></p>
<p>Obrigado pela orientação. Como é uma regra de "C", não tem muito o que ser questionado. Isso também é visível quando é criado uma lib para o arduino IDE (.h e .cpp), onde é necessário fazer essa declaração no cabeçalho. </p>
<p></p>
<p><span>2-</span> <span>Entendi, só acho estranho que,…</span></p>
<p>Dado o tamanho da resposta para cada postagem, achei melhor responder em uma única postagem.</p>
<p></p>
<p>1-</p>
<p>lá RV, sobre o "<span>MACBOOK Air I7", de pequeno não tem nada hahahaha.</span></p>
<p>Obrigado pela orientação. Como é uma regra de "C", não tem muito o que ser questionado. Isso também é visível quando é criado uma lib para o arduino IDE (.h e .cpp), onde é necessário fazer essa declaração no cabeçalho. </p>
<p></p>
<p><span>2-</span> <span>Entendi, só acho estranho que, sempre que utilizo ele, do modo como apresentei, costumo receber erros e o controlador reinicia. Sempre referenciando algo ao watchdog. Normalmente a função que jogo no core0 tem várias condicionais. VAAAAAAAAAARIAS (5000, por exemplo). e mexe com os pinos VAAAAAAAAAARIAS vezes (2600, por ciclo). E vi algo, superficialmente, sobre esse assunto, entretanto, não fui capaz de compreender.</span></p>
<p></p>
<p><span>3- Duvida sanada.</span></p>
<p></p>
<p><span>4- Duvida sanada.</span></p>
<p></p>
<p><span>5- Duvida sanada.</span></p>
<p></p>
<p><span>6- essa definição "configMINIMAL_STACK_SIZE" ela contabiliza? ou define o mínimo necessário para o funcionamento da tarefa considerando-a vazia? </span></p>
<p></p>
<p>7- "<span>vTaskDelay( 100 / portTICK_PERIOD_MS );" Irei pesquisar sobre.</span></p> Olá Carlos, honestamente? já…tag:labdegaragem.com,2022-06-27:6223006:Comment:8843752022-06-27T13:50:21.559Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p>Olá Carlos, honestamente? já olhei as referencias da espressif diversas vezes, mas foram poucas as vezes que realmente consegui entender e usar a informação. Dessa vez eu não olhei. Mas irei ler com cuidado. Afinal, a persistência na leitura aumenta a probabilidade de compreensão (tem que ser otimista)</p>
<p>Olá Carlos, honestamente? já olhei as referencias da espressif diversas vezes, mas foram poucas as vezes que realmente consegui entender e usar a informação. Dessa vez eu não olhei. Mas irei ler com cuidado. Afinal, a persistência na leitura aumenta a probabilidade de compreensão (tem que ser otimista)</p> 7- Vi que, após criar a taref…tag:labdegaragem.com,2022-06-26:6223006:Comment:8845362022-06-26T21:21:20.859Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p><span>7- Vi que, após criar a tarefa no void setup(), que era necessário adicionar um delay(500) (acho que foi no canal do FernandoK), isso é necessário? ou é balela?</span></p>
<p></p>
<p><span>Nao uso este delay nos meus projetos, mas...... </span></p>
<p><span>meu loop 'e assim:</span></p>
<p></p>
<p><span>void loop()<br/>{<br/> vTaskDelay( 100 / portTICK_PERIOD_MS );<br/>}</span></p>
<p></p>
<p><span>O resto e' com as funcoes....</span></p>
<p></p>
<p><span>7- Vi que, após criar a tarefa no void setup(), que era necessário adicionar um delay(500) (acho que foi no canal do FernandoK), isso é necessário? ou é balela?</span></p>
<p></p>
<p><span>Nao uso este delay nos meus projetos, mas...... </span></p>
<p><span>meu loop 'e assim:</span></p>
<p></p>
<p><span>void loop()<br/>{<br/> vTaskDelay( 100 / portTICK_PERIOD_MS );<br/>}</span></p>
<p></p>
<p><span>O resto e' com as funcoes....</span></p>
<p></p> 6- na linha 10 e 19, é defini…tag:labdegaragem.com,2022-06-26:6223006:Comment:8845352022-06-26T21:19:09.521Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p><span>6- na linha 10 e 19, é definido o tamanho da "pilha". Imagino que se eu colocar um valor muito alto, irei esperdiçar/perder espaço, mas se for baixo, não funcionará. Tem alguma ferramenta que possa me informar o tamanho que está sendo utilizado?</span></p>
<p><span>Realmente 'e dificil saber o valor do stack para sua task, mas eu uso assim:</span></p>
<p></p>
<p><span>, configMINIMAL_STACK_SIZE + 4000</span></p>
<p><span>6- na linha 10 e 19, é definido o tamanho da "pilha". Imagino que se eu colocar um valor muito alto, irei esperdiçar/perder espaço, mas se for baixo, não funcionará. Tem alguma ferramenta que possa me informar o tamanho que está sendo utilizado?</span></p>
<p><span>Realmente 'e dificil saber o valor do stack para sua task, mas eu uso assim:</span></p>
<p></p>
<p><span>, configMINIMAL_STACK_SIZE + 4000</span></p> 5- tanto na "TaskLoop0" como…tag:labdegaragem.com,2022-06-26:6223006:Comment:8846082022-06-26T21:11:48.418Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p><span>5- tanto na "</span><span>TaskLoop0" como na "TaskLoop1", é criado um loop infinito com um "for" (</span><span>for (;;) {}). Este "for", funciona EXATAMENTE como o "void loop()" padrão? isto é, eu posso fazer chamadas de funções, dentro deste for? incluindo chamadas para bibliotecas?</span></p>
<p></p>
<p><span>Sim.</span></p>
<p><span>5- tanto na "</span><span>TaskLoop0" como na "TaskLoop1", é criado um loop infinito com um "for" (</span><span>for (;;) {}). Este "for", funciona EXATAMENTE como o "void loop()" padrão? isto é, eu posso fazer chamadas de funções, dentro deste for? incluindo chamadas para bibliotecas?</span></p>
<p></p>
<p><span>Sim.</span></p> 4- Na linha 33, é declarado o…tag:labdegaragem.com,2022-06-26:6223006:Comment:8845342022-06-26T21:06:19.676Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p><span>4- Na linha 33, é declarado o pino 3, dentro do "TaskLoop0" (core 0) como entrada, isto quer dizer que, para manuseá-lo (pino3), independente dos motivos, no core1, eu teria que declara-lo novamente?</span></p>
<p></p>
<ol class="text">
<li class="li1"><div class="de1">pinMode(2, OUTPUT); ????? pino 2 ou 3?</div>
</li>
</ol>
<p></p>
<p>O Setup roda como uma funcao "global", tudo que voce declarar nela, vai servir para qq task, mas declarando </p>
<p>algo dentro de uma funcao em…</p>
<p><span>4- Na linha 33, é declarado o pino 3, dentro do "TaskLoop0" (core 0) como entrada, isto quer dizer que, para manuseá-lo (pino3), independente dos motivos, no core1, eu teria que declara-lo novamente?</span></p>
<p></p>
<ol class="text">
<li class="li1"><div class="de1">pinMode(2, OUTPUT); ????? pino 2 ou 3?</div>
</li>
</ol>
<p></p>
<p>O Setup roda como uma funcao "global", tudo que voce declarar nela, vai servir para qq task, mas declarando </p>
<p>algo dentro de uma funcao em uma task, so vale dentro dela, e' como uma variavel local.</p>
<p></p>
<p></p> 3- Da mesma forma, já que é d…tag:labdegaragem.com,2022-06-26:6223006:Comment:8843742022-06-26T20:59:35.612Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p><span>3- Da mesma forma, já que é designado o core1 na função "loop()", então pq é criado, no void setup(), uma tarefa para os dois cores e, em seguida, deixa o loop() vazio? Não bastaria apenas criar para o core0?</span></p>
<p></p>
<p><span>Idem resposta 2.</span></p>
<p><span>3- Da mesma forma, já que é designado o core1 na função "loop()", então pq é criado, no void setup(), uma tarefa para os dois cores e, em seguida, deixa o loop() vazio? Não bastaria apenas criar para o core0?</span></p>
<p></p>
<p><span>Idem resposta 2.</span></p> 2- Vi que a função "void loo…tag:labdegaragem.com,2022-06-26:6223006:Comment:8844442022-06-26T20:58:19.788Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p></p>
<p><span>2- Vi que a função "void loop()" e "void setup()", seguindo a estrutura simples do arduino IDE, utilizam o core1 (vi em 2 ou 3 sites), isto quer dizer que, naturalmente, o core0 fica sempre inativo?</span></p>
<p></p>
<p><span>O Core 0 no ESP32 e' responsavel por algumas tarefas internas do procesador, como WIFI, RTC, BT, etc.</span></p>
<p><span>Ele pode ser usado para rotina de usuario, mas sempre vai dar preferencia 'as rotinas do sistema.</span></p>
<p></p>
<p><span>RV…</span></p>
<p></p>
<p><span>2- Vi que a função "void loop()" e "void setup()", seguindo a estrutura simples do arduino IDE, utilizam o core1 (vi em 2 ou 3 sites), isto quer dizer que, naturalmente, o core0 fica sempre inativo?</span></p>
<p></p>
<p><span>O Core 0 no ESP32 e' responsavel por algumas tarefas internas do procesador, como WIFI, RTC, BT, etc.</span></p>
<p><span>Ele pode ser usado para rotina de usuario, mas sempre vai dar preferencia 'as rotinas do sistema.</span></p>
<p></p>
<p><span>RV mineirin</span></p> Boa tarde TM.
por enquanto te…tag:labdegaragem.com,2022-06-26:6223006:Comment:8846052022-06-26T20:54:48.112Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p>Boa tarde TM.</p>
<p>por enquanto tenho aqui um pequeno computador disponivel , um pequeno MACBOOK Air I7 ,</p>
<p>mas falta alguns caracteres de portugues.</p>
<p></p>
<p>Vou responder suas dificuldade como fazia o JCK, por partes:</p>
<p></p>
<p></p>
<p><span>1- Nas linhas 1 e 2, são definidas as funções TaskLoop0 e TaskLoop1, que segue o exemplo original. Entretanto, pq é declarado logo no inicio? Afinal, elas são redeclaradas na linha 29 e 44. E se eu remover as linhas 1 e 2, não é…</span></p>
<p>Boa tarde TM.</p>
<p>por enquanto tenho aqui um pequeno computador disponivel , um pequeno MACBOOK Air I7 ,</p>
<p>mas falta alguns caracteres de portugues.</p>
<p></p>
<p>Vou responder suas dificuldade como fazia o JCK, por partes:</p>
<p></p>
<p></p>
<p><span>1- Nas linhas 1 e 2, são definidas as funções TaskLoop0 e TaskLoop1, que segue o exemplo original. Entretanto, pq é declarado logo no inicio? Afinal, elas são redeclaradas na linha 29 e 44. E se eu remover as linhas 1 e 2, não é exibido erro no compilador.</span></p>
<p></p>
<p><span>Estas declaracoes sao " prototipagem de funcoes" muito usadas em C, mas que a IDE do arduino nao leva muito a serio.</span></p>
<p></p>
<p><span>Em C se uma funcao e' chamada andes dela ser escrita, da erro de compilacao, a menos que se tenha criado um prototipo, como neste caso do seu exemplo.</span></p>
<p><span>O FreeTOS respeita esta regra, mas a IDE do arduino nao. Esta e' uma pratica dos programadores experientes.</span></p>
<p><span>Se voce em C escrever um codigo assim:</span></p>
<p></p>
<p><span>void main()</span></p>
<p><span>{</span></p>
<p><span>xxxxx;</span></p>
<p><span>yyyyyy;</span></p>
<p><span>hugo());</span></p>
<p><span>}</span></p>
<p><span>void hugo()</span></p>
<p><span>{</span></p>
<p><span>zzzzz;</span></p>
<p><span>}</span></p>
<p><span>dara erro de compilacao, a mesmo que voce crie um protipo ante de chamar o hugo;</span></p>
<p></p>
<p><span>Correto em C</span></p>
<p></p>
<p><span>void hugo();</span></p>
<p><span>void main()</span></p>
<p><span>{</span></p>
<p><span>xxxxx;</span></p>
<p><span>yyyyyy;</span></p>
<p><span>hugo());</span></p>
<p><span>}</span></p>
<p><span>void hugo()</span></p>
<p><span>{</span></p>
<p><span>zzzzz;</span></p>
<p><span>}</span></p>
<p></p>
<p><span>RV mineirin</span></p>
<p></p>
<p></p>