[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-rt
Subject:    [rtl] problem with realtime signals
From:       joseph canou <Joseph.Canou () bourges ! univ-orleans ! fr>
Date:       2001-03-28 13:03:29
[Download RAW message or body]

Il s'agit d'un message multivolet au format MIME.

hello
i use rtl3.0
i would like to use the real time signal in my module
i don't have problem with sigaction to install a signal, but when i try
to use sigqueue  i have this message:

intr_sick_arriere.o: unresolved symbol sigqueue
is it possible to use this function in rtmodule?
is there a function similar to getpid() to obtain the id of a module?
i have joined my code

thank you for your help


["intr_sick_arriere.c" (text/plain)]

/************************ acquisition donnees sick sur com4 par interruption *************************/

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <rtl_sync.h>
#include <rtl_core.h>
#include <rtl.h>
#include <asm/io.h>
#include <time.h>
#include <pthread.h>
#include <rtl_fifo.h>

#include "def_moxa.h"


#define adresse_base_com4 COM4

WORD dll_com4 = adresse_base_com4 + DLL;
WORD dlm_com4 = adresse_base_com4 + DLM;
WORD ier_com4 = adresse_base_com4 + IER;
WORD lcr_com4 = adresse_base_com4 + LCR;	
unsigned char test_com4[6];
unsigned char donnee_com4[732];
hrtime_t debut_com4;
int i_com4=0, j_com4=0;
int passage_com4=0;





void gestionnaire_signal_temps_reel (int numero, siginfo_t * info, void * inutile)
{
	rtl_printf("\n signal recu par le gestionnaire");
}






unsigned int handler_com4(void)
{ //WORD adresse_base_com4=COM4;
  unsigned char temp;
  unsigned int nouveau_debut=1;
  int test_rtf;
  int ro[361];
  hrtime_t temps_com4, tampon_temps_com4;
  double temps;


  outb(0x00,ier_com4);

//  do{
   temp = inb(adresse_base_com4);
  i_com4++;
//  rtl_printf("\n handler com4");
  if(i_com4==732)
  {	i_com4=0;
  	tampon_temps_com4=clock_gethrtime(CLOCK_REALTIME);
        temps_com4=tampon_temps_com4-debut_com4;
        temps=(double)(temps_com4/1000000);

  	rtl_printf("\n\n   arriere %ld passage %d",(long int)temps,passage_com4);
  	envoie_signal_temps_reel(1,3);
  	passage_com4++;
  	if(passage_com4>10000)
  		passage_com4=0;
  	for (i_com4=0; i_com4<=720; i_com4+=2)
	{	ro[i_com4/2] = (donnee_com4[8+i_com4])+(256*(donnee_com4[9+i_com4]));
//		rtl_printf(" %d ",ro[i_com4/2]);
  	}	
  	i_com4=0;
  }
  test_com4[0]=test_com4[1];
  test_com4[1]=test_com4[2];
  test_com4[2]=test_com4[3];
  test_com4[3]=test_com4[4];
  test_com4[4]=test_com4[5];
  test_com4[5]=temp;

  if(test_com4[0]==0x02 && test_com4[1]==0x80 && test_com4[2]== 0xD6 && test_com4[3]==0x02
     && test_com4[4]==0xB0 && test_com4[5]==0x69 )
  {	for(j_com4=0; j_com4<6; j_com4++)
  		donnee_com4[j_com4]=test_com4[j_com4];
  	i_com4=j_com4;
  	debut_com4=clock_gethrtime(CLOCK_REALTIME);	
  		//rtl_printf(" %x ",test_com4[j_com4]);    	
  }	
  	
  donnee_com4[i_com4]=temp;	
  	
  	
// }while( ((inb((COM4)+5))&0x01)!=1); 	

  outb(0x01,ier_com4);
  rtl_hard_enable_irq(7);


  return 0;
}


int init_module(void)
{

	int  Erreur = 0;
	BYTE i,tampon;
        rtl_irqstate_t f_com4;
        int test_irq=0;
	struct sigaction action;
	
	
	
	/* Nettoyage du port */
	for (i=0;i<=6;i++)
		inb(adresse_base_com4);
		
	outb(0x00,ier_com4);  			/* disable l'IT reception */
		/* Initialisation de la vitesse de communication */
	outb(0x80,lcr_com4);  /* LCR.7 = 1 */
	outb((B500ka & 255),dll_com4);  /* partie basse */
	outb(( B500ka>> 8),dlm_com4);   /* partie haute */
		/* Initialisation de la largeur du caractere, du bit de stop
	et de la parite */
	outb((  BIT_8 | (0 << 2) | (P_AUCUNE << 3) ),lcr_com4 );
	
	outb(0x02,adresse_base_com4 +2); 	// Raz FIFO
	outb(0x01,adresse_base_com4 +2); 	// val. FIFO mode DMA
//         outb(inb(adresse_base_com4 + MCR) | 0x08, adresse_base_com4 + MCR);
	outb(0x01,ier_com4);  			/* enable l'IT reception */
	inb(adresse_base_com4);   /* On vide RXD */
	inb(adresse_base_com4);

	


        rtl_no_interrupts(f_com4);


        rtl_request_irq(7,handler_com4);
        rtl_printf("\n test test_request_irq %d",test_irq);

        rtl_hard_enable_irq(7);
      //  rtl_printf("\n test hard_enable %d",test_irq);

        rtl_restore_interrupts(f_com4);
  //      rtl_printf("\n test restore %d",test_irq);

  	rtl_printf("\n valeur de sigrtmin %d ",SIGRTMIN);
	rtl_printf("\n valeur de sigrtmax %d ",SIGRTMAX);  	
        rtl_printf ("Installation gestionnaires de signaux\n");
	action . sa_sigaction = gestionnaire_signal_temps_reel;
	sigemptyset (& action . sa_mask);
	action . sa_flags = SA_SIGINFO;
	if ( sigaction (SIGRTMIN + 1, & action, NULL) < 0)
        	rtl_printf("\n erreur installation sigaction");
        return 0;
}


void
envoie_signal_temps_reel (int numero, int valeur)
{
union sigval valeur_sig;

rtl_printf ( "Envoi signal SIRTMIN+%d, valeur %d\n",numero, valeur);
valeur_sig . sival_int = valeur;
if (sigqueue (getpid(), numero + SIGRTMIN, valeur_sig) < 0)
{
	rtl_printf("\n erreur sigqueue");
}

}


void cleanup_module(void)
{
  rtl_free_irq(7);
}

-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail majordomo@rtlinux.org OR
echo "unsubscribe rtl <Your_email>" | mail majordomo@rtlinux.org
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic