Сообщения и пульсы в QNX Neutrino. Передача сообщений между родственными процессами. Передача сообщений с помощью MsgSend, страница 7

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