Página 1 de 1

Printf e interrupção de TIMER

MensagemEnviado: 10 Abr 2011 10:05
por itamar
Caros amigos, me desculpem pela ignorância mas não entendo o motivo de não poder utilizar Printf ou putc dentro de uma interrupçao. Toda vez que faço isso, não compila por falta de memória .
Help.

Re: Printf e interrupção de TIMER

MensagemEnviado: 10 Abr 2011 12:28
por andre_luis
A taxa de interrupção deve estar superior ao Baud-Rate da UART.

O printf é uma API pronta de uma biblioteca standard do C que eu particularmente não gosto. Prefiro manipular o putc byte-a-byte.

Isso porque o printf segura o processamento do uC num loop infinito enquanto não terminar de enviar a string.

De qualquer modo, voce pode estar até com algum outro problema, como desde algum eventual limite do compilador dependente de licensa, ou como até falta de espaço realmente, devido ao tamanho do código e da quantidade de veriáveis empregadas.

+++

Re: Printf e interrupção de TIMER

MensagemEnviado: 10 Abr 2011 12:51
por barboza
andre_teprom escreveu:A taxa de interrupção deve estar superior ao Baud-Rate da UART.

O printf é uma API pronta de uma biblioteca standard do C que eu particularmente não gosto. Prefiro manipular o putc byte-a-byte.

Isso porque o printf segura o processamento do uC num loop infinito enquanto não terminar de enviar a string.

De qualquer modo, voce pode estar até com algum outro problema, como desde algum eventual limite do compilador dependente de licensa, ou como até falta de espaço realmente, devido ao tamanho do código e da quantidade de veriáveis empregadas.

+++


Costumo usar a sprintf imprimindo em um buffer de saída e tratando este buffer na interrupção da serial, enviando byte a byte quando livre.

Ou o printf, com a putc() inserindo os bytes no buffer circular.

MensagemEnviado: 11 Abr 2011 11:49
por Andre_Cruz
itamar,

Pelo que sei não pode chamar nem uma função dentro da rotina de interupção, não é só o printf !
Não me lembro o motivo vou ver se encontro e posto aqui !

Cosntumo usar flags dentro da interupção e trato fora dela os flags marcados.

Abraço

André Cruz

MensagemEnviado: 11 Abr 2011 13:16
por barboza
Andre_Cruz escreveu:itamar,

Pelo que sei não pode chamar nem uma função dentro da rotina de interupção, não é só o printf !
Não me lembro o motivo vou ver se encontro e posto aqui !

Cosntumo usar flags dentro da interupção e trato fora dela os flags marcados.

Abraço

André Cruz



O problema com chamadas de funções dentro de interrupções é que interrupção deve ser rápida, retornando ao código principal o quanto antes.

Se você faz chamadas de funções dentro de interrupção, o tempo de latência da interrupção fica lento, devido a própria função chamada e os push e pop na stack com os retorno da função.

Se você chamada funções de API (printf) o problema fica pior, pois o printf chama n outras funções, o que fica mais lento ainda.

Se este tempo for maior que o intervalo que você configurou para a INT (timers) o seu programa trava, pois nunca consegue sair da INT.

MensagemEnviado: 11 Abr 2011 19:25
por andre_luis
Andre_Cruz escreveu:...Cosntumo usar flags dentro da interupção e trato fora dela os flags marcados...


Poisé...essa orientação é tão recorrente por aqui que deveria até ter um tópico fixo.

:)

+++