Economia de energia com o BRTOS

14 views
Skip to first unread message

Miguel Moreto

unread,
Jan 25, 2017, 8:24:46 AM1/25/17
to BRTOS
Olá pessoal,

estou aproveitando as férias para dar um gás nos meus projetinhos e surgiu uma dúvida.

Estou usando um STM32F405 em um sistema que funciona à bateria, logo o consumo de energia é algo crítico. Na maior parte do tempo, o meu firmware fica esperando entrada do usuário (através de botões com interrupções) e atualiza um LCD (desses monocromáticos Chip-on-glass) a cada segundo (a partir de uma interrupção do RTC). Gostaria de deixar o sistema em modo power down (ou idle, não lembro bem o nome) após um certo tempo de inatividade por parte do usuário. Após esse tempo, eu desligaria o LCD e os demais periféricos e colocaria o micro em um modo de economia de energia.

Eu sei que o BRTOS tem um define no arquivo HAL.h:

#define OS_Wait __asm(" WFI ");

para poupar energia. Pelo que entendi, o micro fica em modo IDLE (ou algo semelhante) entre cada tick do escalonador, é isso?

Nesse caso, isso é suficiente para minha aplicação ou devo manualmente, no meu firmware, colocar o micro em idle (ou outro modo qualquer) para poupar mais energia? Se eu fizer isso, tenho receio de avacalhar com o funcionamento do BRTOS.

Explicando melhor, pensei em duas opções:

Opção 1) Seto o define acima e não faço nada com respeito aos modos de economia de energia do micro. Apenas verifico o tempo de inatividade e desligo os periféricos que consomem energia após esse tempo. O BRTOS ficaria rodando normalmente.

Opção 2) Verifico o tempo de inatividade, desligo os periféricos e também coloco o micro em modo de economia de energia. Nesse caso tenho dúvidas como proceder, pois após um tick do escalonador o micro não acordaria pelo BRTOS? eu teria que, de alguma forma, parar o BRTOS. Não sei como fazer isso.

O que vocês recomendam? Haverá grande diferença de economia de energia entre as duas opções?

Saudações!

Miguel Moreto

Gustavo Denardin

unread,
Jan 26, 2017, 6:21:25 AM1/26/17
to br...@googlegroups.com
Olá Miguel, tudo bem?

Esse é um assunto um pouco mais complicado que o normal, mas vamos lá.
Tudo depende do quanto de energia você precisa diminuir. O BRTOS normalmente desliga a CPU entre ticks com o OS_Wait. No caso dos ARMs, ele entra em um modo chamado WAIT, que desliga o processador, mas não os periféricos. Isso diminui o consumo de um micro de 40mA para uns 15mA.

A configuração padrão é essa, porque nos ARMs, qualquer modo mais econômico de energia irá desligar o SYSTICK, que é a interrupção de tempo padrão para esses micros.

Uma maneira mais efetiva de economizar energia é substituir o timer do BRTOS do SYSTICK para um timer específico do fabricante que funcione em modos de maior economia de energia. Por exemplo, nos Freescales existe o timer LPTimer. Quando você fizer essa substituição será preciso mudar o código da interrupção de timer (HAL.c) para utilizar essa interrupção do timer de baixo consumo. E, claro, configurar o micro para, quando executar a instrução WAIT, entrar em um modo mais econômico de energia. Você deve verificar se nesse modo mais econômico os teus periféricos vão continuar funcionando (pelo que entendi só precisa funcionar a interrupção dos botões).

Idealmente não devemos parar o tick do sistema. Eu já fiz uma implementação beta de tickless no BRTOS, mas não achei que o consumo reduz tanto. A principal redução é realmente a partir de um modo mais econômico de energia.

Se você precisar de mais ajuda com esse assunto, posso te ajudar na volta das férias ;)

Abraço,
Gustavo

 Prof. Gustavo Weber Denardin
 Universidade Tecnológica Federal do Paraná (UTFPR)
 Campus Pato Branco - Departamento de Eng. Elétrica (DAELE) - Bloco J1
 Via do Conhecimento, Km 1 - Pato Branco - PR -   CEP: 85503-390
 Fone / Fax: (46) 3220-2570
 Home Page: http://pessoal.utfpr.edu.br/gustavo/

--
Você recebeu essa mensagem porque está inscrito no grupo "BRTOS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para br...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/brtos.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos Henrique Barriquello

unread,
Jan 26, 2017, 6:29:52 AM1/26/17
to br...@googlegroups.com
Olá Miguel,

também acho que a melhor solução é esta do Gustavo. Para complementar, você também pode aumentar o intervalo do tick. Por exemplo, passar de 1ms para 10ms. Assim, o consumo esperado vai reduzir em 10x. Porém, você vai perder em resolução de tempo, então tem que ver se isso não vai impactar na tua aplicação.

Abraço,
Carlos 

Carlos Henrique Barriquello
Professor Adjunto II
Universidade Federal de Santa Maria - UFSM/RS
Departamento de Eletrônica e Computação
Sala 430, GEDRE/NUPEDEE, Centro de Tecnologia
(55) 3220-9492

Gustavo Denardin

unread,
Jan 26, 2017, 8:40:19 AM1/26/17
to br...@googlegroups.com
Miguel,

Aqui tem uma boa idéia de como fazer o que você precisa:


Use o modo Stop (exemplo 2). Verifique se é possível usar o RTC para gerar interrupções a cada 1 ou 10ms.

Abraço,

 Prof. Gustavo Weber Denardin
 Universidade Tecnológica Federal do Paraná (UTFPR)
 Campus Pato Branco - Departamento de Eng. Elétrica (DAELE) - Bloco J1
 Via do Conhecimento, Km 1 - Pato Branco - PR -   CEP: 85503-390
 Fone / Fax: (46) 3220-2570
 Home Page: http://pessoal.utfpr.edu.br/gustavo/

Em 25 de janeiro de 2017 11:24, Miguel Moreto <miguel...@gmail.com> escreveu:

--

Gustavo Denardin

unread,
Jan 26, 2017, 10:38:04 AM1/26/17
to br...@googlegroups.com
Se vc não precisar de precisão de relógio, use o modo stop de low power com o RTC sendo o timer do sistema tendo como fonte de clock o LSI (32KHz). Daí é só colocar o valor de contagem em 32 que irá gerar um tick de 1ms, acordando o processador. Talvez seja interessante utilizar o tick de 10ms como o Barriquello falou, pois pelo que vi leva alguns microsegundos para voltar do stop mode e ainda tem que configurar o clock para o PLL a cada volta.

Os códigos daquele site ajudam muito. Ele tem um repositório no git com tudo.

Abraço,

 Prof. Gustavo Weber Denardin
 Universidade Tecnológica Federal do Paraná (UTFPR)
 Campus Pato Branco - Departamento de Eng. Elétrica (DAELE) - Bloco J1
 Via do Conhecimento, Km 1 - Pato Branco - PR -   CEP: 85503-390
 Fone / Fax: (46) 3220-2570
 Home Page: http://pessoal.utfpr.edu.br/gustavo/

Em 25 de janeiro de 2017 11:24, Miguel Moreto <miguel...@gmail.com> escreveu:

--

Miguel Moreto

unread,
Jan 26, 2017, 2:10:56 PM1/26/17
to br...@googlegroups.com

Prezados,

Muito obrigado pelos esclarecimentos. Mas surgiram algumas novas dúvidas.

Gustavo, não achei referencia a esse modo wait no caso dos stm32 creio ser o modo sleep q desliga apenas o clock da cpu. Confirma se eu entendi corretamente tua sugestão: o papel do systick seria substituído pelo timer do rtc que fica rodando no modo Stop (que desliga todos os clocks mas mantém a memória).  Dessa forma, a cada tick do brtos ao invés de ir para o modo Sleep eu mandaria o micro para o modo Stop isso sempre ocorreria então eu basicamente teria q desligar meu lcd e algum led.... a economia de energia viria naturalmente pela mudança do define OS_Wait para usar a instrução do modo stop. Mas e durante a execução normal do sistema não ficaria lento demais esperar o clock estabilizar sempre? Se for isso achei complicado demais. Ou é possível fazer essa mudança só quando eu decidir entrar em economia de energia?

Estou achando q a melhor opção para mim é deixar como está e desligar eu mesmo os periféricos que mais consomem durante o período que a aplicação ficará em modo de economia. Se der para somente nesse período mudar o tick para 10ms acho que seria interessante.

Eu conheço aquele site do Tilen Majerle, gosto de ler os comentários e as respostas "sutis" dele. Já uso algumas de suas libs, muito boas por sinal.

Grande abraço!

Moreto

Gustavo Denardin

unread,
Jan 27, 2017, 12:03:48 PM1/27/17
to br...@googlegroups.com
É exatamente isso que você entendeu Miguel. Não acho que será uma perda tão grande de tempo para voltar do modo de baixo consumo. Provavelmente levará 200us. Como você pretende usar o tick de 10ms, não seria um problema.

No entanto, se o micro consumir uns 15mA não for problema pra você, acho que a opção mais simples é deixar como está e só desligar os periféricos mesmo.

Abraço,

 Prof. Gustavo Weber Denardin
 Universidade Tecnológica Federal do Paraná (UTFPR)
 Campus Pato Branco - Departamento de Eng. Elétrica (DAELE) - Bloco J1
 Via do Conhecimento, Km 1 - Pato Branco - PR -   CEP: 85503-390
 Fone / Fax: (46) 3220-2570
 Home Page: http://pessoal.utfpr.edu.br/gustavo/

Miguel Moreto

unread,
Jan 27, 2017, 4:10:53 PM1/27/17
to br...@googlegroups.com

Beleza Gustavo,

acho que vou deixar assim mesmo. A minha bateria é de 2500mAh! Vai durar um bom tempo em standby.

Ok, perguntas finais :

1) tem como mudar o periodo do tick do brtos em tempo de execução? Por exemplo passar para 10ms só quando eu entrar no modo baixo consumo?
2) por que não dá para parar totalmente o brtos e botar o micro em modo stop ( ex desligar a interrupção do systick)?

Até

Moreto

Carlos Henrique Barriquello

unread,
Jan 28, 2017, 11:56:04 AM1/28/17
to br...@googlegroups.com
Miguel,

seguem as respostas com relação às perguntas:

1- Atualmente não é possível. Seria uma funcionalidade muito interessante, mas é difícil de implementar, pois os delays são contados em ticks e se mudar o valor de tempo do tick, tem que corrigir todas os delays e timeouts em andamento no sistema.

2- Até pode ser feito, mas se houver tarefas em espera por delay, elas não serão ativadas no instante de tempo correto (isto inclui delays e timeouts). Note que se parar o tick do BRTOS, não tem como saber (atualmente) quanto tempo se passou desde o último tick, então as funções de temporização não funcionarão corretamente. Entretanto, se não forem utilizadas, isto não é problema.  

Atenciosamente,
Carlos

Carlos Henrique Barriquello
Professor Adjunto II
Universidade Federal de Santa Maria - UFSM/RS
Departamento de Eletrônica e Computação
Sala 430, GEDRE/NUPEDEE, Centro de Tecnologia
(55) 3220-9492

Miguel Moreto

unread,
Feb 3, 2017, 9:14:58 AM2/3/17
to BRTOS
Obrigado Carlos e Gustavo,

vou tentar a opção 2, pois não tenho nada em espera via delay. Basicamente toda execução do firmware é baseada em reação a interrupções (teclas ou RTC), então não tem nada que fica rodando em plano de fundo que seria afetado. A rigor, se funcionar e eu desligar tudo que precisa, com uma bateria de 2500mAh acho que nunca mais precisaria desligar o aparelho.

Comunico vocês por aqui se funcionar.

Saudações,

Moreto
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para br...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/brtos.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "BRTOS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para br...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/brtos.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "BRTOS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para br...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/brtos.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "BRTOS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para br...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/brtos.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "BRTOS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+un...@googlegroups.com.

Gustavo Denardin

unread,
Feb 3, 2017, 6:20:36 PM2/3/17
to br...@googlegroups.com
Beleza Miguel, precisando de ajuda estamos aí.

Você está usando que versão do BRTOS? Eu tenho uma implementação de tickless no BRTOS que ainda não foi para o repositório. Se você quiser testar, eu posso te mandar. Basicamente mudou algumas coisas no arquivo HAL.c e BRTOS.c para suportar o tickless.

Quanto a parar completamente o BRTOS para economizar energia, acho bem tranquilo. Como disse o Barriquello, os delays só vão voltar a contar a partir do ponto em que pararam, o que parece não ser um problema tão grave.

Abraço,

 Prof. Gustavo Weber Denardin
 Universidade Tecnológica Federal do Paraná (UTFPR)
 Campus Pato Branco - Departamento de Eng. Elétrica (DAELE) - Bloco J1
 Via do Conhecimento, Km 1 - Pato Branco - PR -   CEP: 85503-390
 Fone / Fax: (46) 3220-2570
 Home Page: http://pessoal.utfpr.edu.br/gustavo/

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages