7. Использование пульсов с ISR
Программа key выводит время при нажатии на клавишу ‘T’ и дату при нажатии на клавишу ‘D’. При нажатии на ‘Esc’ происходит выход. Для того, чтобы отправить пульс нужно последовательно нажать на кнопки ‘A’ и ‘G’. Тогда программа пошлёт пульт серверу.
Key.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/neutrino.h>
#include <errno.h>
#include <hw/inout.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#define PATH "channel_lab1"
#define MY_PULSE1 _PULSE_CODE_MINAVAIL+1
#define MY_PULSE2 _PULSE_CODE_MINAVAIL+2
volatile unsigned char buf;
int len_seq=0, spulse=0, fd;
struct sigevent event;
const struct sigevent* key_irq( void* area, int id ){
buf = in8( 0x60 );
if( len_seq == 0 && buf == 30 ) len_seq++;
if( len_seq == 1 && buf == 34 ){
len_seq = 0;
spulse = 1;
//MsgSendPulse( fd, 10, MY_PULSE1, 18 );
}
if( buf & 0x80 ){ return NULL; }
else return &event;
};
int main(){
int res;
time_t var_time;
struct tm* curtime;
int rcvid, chid, coid;
struct _pulse pulse;
name_attach_t *attach;
chid = ChannelCreate( 0 );
coid = ConnectAttach( 0, 0, chid, 0, 0 );
fd = name_open( PATH, 0 );
if( fd == -1 ){
printf("Client name open error ???\n" );
exit( EXIT_FAILURE );
}
MsgSendPulse( fd, 10, MY_PULSE1, 18 );
ThreadCtl( _NTO_TCTL_IO, 0 );
SIGEV_INTR_INIT( &event );
res = InterruptAttach( 1, key_irq, NULL, 0, 0 );
res = InterruptUnmask( 1, res );
while(1){
InterruptWait( NULL, NULL );
var_time = time( NULL );
curtime = gmtime( &var_time );
if( buf == 1 ){ InterruptDetach(1); exit(0); }
else if( buf ){
if( spulse ){ MsgSendPulse( fd, 10, MY_PULSE1, 18 ); spulse = 0 ; }
if( buf == 20 ){ printf( "Time: %2.2d:%2.2d:%2.2d\n", curtime->tm_hour, curtime->tm_min, curtime->tm_sec ); }
else if( buf == 32 ){ printf( "Date: %2.2d:%2.2d:%2.2d\n", curtime->tm_mday, curtime->tm_mon, curtime->tm_year+1900 ); }
buf = 0;
}
}
return 0;
}
Serv_pulse.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/neutrino.h>
#include <sys/iomsg.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#define ATTACH_POINT "channel_lab1"
#define MY_PULSE1 _PULSE_CODE_MINAVAIL+1
#define MY_PULSE2 _PULSE_CODE_MINAVAIL+2
int main(){
name_attach_t *attach;
int rcvid, val, coid;
struct _pulse pulse;
struct sigevent event;
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
printf("name Attach fail ???\n");
return EXIT_FAILURE;
}
coid = ConnectAttach( 0, 0, attach->chid, 0, 0 );
while(1){
rcvid = MsgReceivePulse( attach->chid, &pulse, sizeof( pulse ), NULL );
if( pulse.code > 0 ){
//User Pulse
switch( pulse.code ){
case MY_PULSE1:
printf("Get User Pulse 1 : value = %d\n", pulse.value.sival_int );
break;
case MY_PULSE2:
printf("Get User Pulse 2 : value = %d\n", pulse.value.sival_int );
break;
}//end switch
} else{
printf("Get system pulse\n");
if( pulse.code == _PULSE_CODE_DISCONNECT )
printf("Client disconnect\n");
}
}//end while(1)
name_detach(attach, 0);
return 0;
}
Результат выполнения программы:
Терминал 1
# ./key
//при нажатии на 'T'
Time: 12:08:43
//при нажатии на ‘D’
Date: 08:05:2011
Time: 12:08:44
//после нажатия на ‘A’ ‘G’
//на втором терминале появляется сообщение
//...
Date: 08:05:2011
Time: 12:08:45
Date: 08:05:2011
Time: 12:08:45
Date: 08:05:2011
Time: 12:08:53
Date: 08:05:2011
Time: 12:08:54
Date: 08:05:2011
Time: 12:08:55
Time: 12:08:57
Date: 08:05:2011
Time: 12:08:58
Time: 12:09:01
Time: 12:09:02
Time: 12:09:02
Терминал 2
./serv_pulse
//при нажатии на ‘A’ ‘G’
Get User Pulse 1 : value = 18
//...
Get User Pulse 1 : value = 18
Get User Pulse 1 : value = 18
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.