#include #include #include #define PIO_LENGHT 0x00AC #include #include "at91sam9260.h" #include #include #include #include #include #include #include #include #include #define MY_PULSE_CODE _PULSE_CODE_MINAVAIL #define PIO_OWER 0x00A0 #define PIO_ODSR 0x0038 int flag; uintptr_t piocHandle; timer_t timer_id; typedef union { struct _pulse pulse; /* your other message structures would go here too */ }my_message_t; void handler(int signum) { if(flag==0) { out32(piocHandle + PIO_ODSR,0x01); flag=1; } else { out32(piocHandle + PIO_ODSR,0x00); flag=0; } } int main(int argc, char *argv[]) { int privity_err; struct _clockperiod clkper; struct itimerspec itime; int prio=atoi(argv[1]); long clockPeriod=atol(argv[2]); long signalPeriod=atol(argv[3]); if(signalPeriod==0) { printf("E prea mica perioada semnalului"); } struct sched_param param; int ret; param.sched_priority = prio; ret = sched_setscheduler( 0, SCHED_RR, ¶m); assert ( ret != -1 ); printf("Am inceput test cu clockperiod %ldus,signalperiod %ldus,priority\n",clockPeriod,signalPeriod,prio); clkper.nsec = clockPeriod; clkper.fract = 0; ClockPeriod ( CLOCK_REALTIME, &clkper, NULL, 0 ); privity_err = ThreadCtl( _NTO_TCTL_IO, NULL ); if ( privity_err == -1 ) { printf( "Can't get root permissions\n" ); return -1; } piocHandle = mmap_device_io(PIO_LENGHT,PIOC_BASE);//mapez zona de memorie pentru PIO if(piocHandle==MAP_DEVICE_FAILED) { printf("Sa produs o eroare,la maparea PIOC\n%s:",strerror(errno)); return NULL; } out32(piocHandle + PIO_PER,0x01);//PORTC pin 1 e GPIO out32(piocHandle + PIO_OER,0x01); out32(piocHandle + PIO_OWER,0x01); flag=0; if ( timer_create( CLOCK_REALTIME,NULL, &timer_id ) == -1 ) { perror ( "can't create timer" ); exit( EXIT_FAILURE ); } itime.it_value.tv_sec = 0; /* 500 million nsecs = .5 secs */ itime.it_value.tv_nsec = signalPeriod; itime.it_interval.tv_sec = 0; /* 500 million nsecs = .5 secs */ itime.it_interval.tv_nsec = signalPeriod; timer_settime(timer_id, 0, &itime, NULL); // if(ualarm(100,0)<0) // { // printf("Sa produs o eroara la setarea alarmei:%s",strerror(errno)); // } struct sigaction newact; newact.sa_flags=0; sigemptyset( &newact.sa_mask ); newact.sa_handler=&handler; if(sigaction(SIGALRM,&newact,NULL)<0) { printf("Sa produs o eroara la setarea handlerului:%s",strerror(errno)); } ; struct sigevent event; timer_t timer_id; int chid; int rcvid; my_message_t msg; chid = ChannelCreate(0); event.sigev_notify = SIGEV_PULSE; event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0,chid,_NTO_SIDE_CHANNEL, 0); event.sigev_priority = getprio(0); event.sigev_code = MY_PULSE_CODE; timer_create(CLOCK_REALTIME, &event, &timer_id); itime.it_value.tv_sec = 20; // 500 million nsecs = .5 secs itime.it_value.tv_nsec = 500000000; itime.it_interval.tv_sec = 0; // 500 million nsecs = .5 secs itime.it_interval.tv_nsec = 0; timer_settime(timer_id, 0, &itime, NULL); for (;;) { rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL); if (rcvid == 0) {// we got a pulse if (msg.pulse.code == MY_PULSE_CODE) { printf("we got a pulse from our timer\n"); exit(1); } } } return EXIT_SUCCESS; }