de forma simplificada, eu uso o wait da seguinte forma:
- Código: Selecionar todos
#define isr_wait() _asm wait _endasm
#define wdt_clean() COPCTL = 1
...
main()
{
wdt_clean();
rtc_enable();
isr_enable();
..
for(;;)
{
wdt_clean();
app_run()
isr_wait();
}
}
no caso, limpo o watchdog no inicio de main, configuro um periferico que gere interrupcao periodica, habilito as interrupcoes e entro num loop, que por sua vez limpa o watchdog, roda uma interacao da aplicacao e entao fica em wait. qdo a proxima interrupcao ocorrer, o mcu acorda e o loop corre novamente. na configuracao de mcu e clock que eu tenho, uso geralmente o modulo TBM com 305Hz e o watchdog estora a contagem em uma cadencia de 76Hz.
nao sei se existe vantagem real no consumo usando wait, pq todo o resto continua ativado e funcionando... entao eu costumo ignorar o wait e fazer um pouco diferente:
- Código: Selecionar todos
#define isr_wait() _asm wait _endasm
#define wdt_clean() COPCTL = 1
...
unsigned idle;
main()
{
wdt_clean();
rtc_enable();
isr_enable();
..
for(idle=0;;idle++)
{
wdt_clean();
app_run()
}
}
que eh basicamente contar quantas vezes o for roda para mensurar a performance. a cada, digamos, 1/10 segundo eu copio o valor de idle para last_idle e zero a variavel idle (na interrupcao do TBM) e ela entao comeca a incrementar. quando o sistema esta realmente em idle, essa contagem vai atingir um valor maximo, quando o sistema esta em carga, essa contagem vai comecar a diminuir, de modo que quando se usa 100% do tempo do sistema, a variavel simplesmente nao sai do zero, assim na aplicacao eu posso imprimir algo como:
printf("cpu idle: %d%%\n", 100-100*last_idle/max_idle);