Página 1 de 1

Linux Embarcado vs Timers

MensagemEnviado: 08 Jun 2007 11:18
por backitow
Olá pessoal, sou novato na área de SO embarcados e estou com uma dúvida e espero que vocês possam me ajudar. Vou trabalhar com um Linux embarcado em um OMAP (ARM9 + DSP) e eu preciso que o ARM faça o debounce de alguns sinais de entrada digitais e para isso vou precisar configurar os timers. A minha dúvida é se eu consigo configurar os timers "por cima" do Linux para fazers os debounces. Eu consigo configurar prioridades para usar os timers para eu utiliza-los ao invés do Linux? Ou a outra maneira de fazer isso através do Linux mesmo?
Agradeço desde já.


[]'s
Thiago Back

MensagemEnviado: 13 Jul 2007 11:28
por Doglao
em sistemas embarcados o kernel toma conta de tudo o sugerido eh voce ler mais sobre a versao do linux e aplicar no seu caso, como ele eh multitarefa voce pode colocar as tarefas e impor as prioridades e tambem configurar interrupcoes com timers configurados e tudo vai ser gerenciado pelo kernel do linux

MensagemEnviado: 13 Jul 2007 12:20
por helton
Um teste que voce pode fazer ( em usermode) é utilizar o código abaixo...não sei bem se é a maneira certa de utilizar...
Código: Selecionar todos
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
//---------------------------------------------------------------------------
void init_timer( void *handler );
static void timer_handler( int signo );
//---------------------------------------------------------------------------
int main( void )
{
   
    //timer handler ==========================
    init_timer( &timer_handler );
      
    while(1)
    {   
    }

    return 0;
}
//---------------------------------------------------------------------------
void init_timer( void *handler )
{
    struct itimerval value;
    struct sigaction sa_timer;
   
    //timer handler ==========================
    sa_timer.sa_handler = handler;   
    sa_timer.sa_flags = SA_RESTART;
    sigemptyset(&sa_timer.sa_mask);
    sigaction( SIGPROF, &sa_timer, NULL );
   
    value.it_interval.tv_sec = 0;
    value.it_interval.tv_usec = 10000;
    value.it_value = value.it_interval;
    setitimer( ITIMER_PROF, &value, NULL );   
}
//---------------------------------------------------------------------------
static void timer_handler( int signo )
{
    static unsigned int counter = 0x00;
    static unsigned int tmp_1s = 0;
   
    //insert your code here - time 10 ms   
           
   
    //1 second timer
    if ( tmp_1s > 0 ) tmp_1s--;
    else{
   tmp_1s = 99;
   fprintf(stderr,"counter: %d\n",counter++);
    }
}
//---------------------------------------------------------------------------


mas o ideal talvez é criar um /dev/timer0 ...através de um device driver...
o que não é muito difícil não...
[/code]

MensagemEnviado: 13 Jul 2007 16:40
por helton
um ótimo link sobre device drivers está aqui:

http://www.captain.at/programming/rtai/parportint.php

att