3. Передача пульсов по таймеру.
3.1. Посылка пульса по таймеру текущему процессу, которым был создан таймер.
Основная программа запускает таймер, который посылает уведомление о срабатывании пульсом, пульсы принимаются основной программой. После приема пульса выводится системное время.
Схема программы:
Листинг 3.1.1. 2_4_pulse_timer.c.
/*
* Посылка пульса по срабатыванию таймера самому себе
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/siginfo.h>
#include <sys/neutrino.h>
#define BUF_LEN 256
#define ATTACH_POINT "qnx_msg_server"
#define BUF_LEN 256
#define CODE_TIMER 1
int channelId;
int Setup_Timer( );
int main(int argc, char *argv[])
{
int rcv_id;
time_t tmm;
struct tm *now;
channelId = ChannelCreate(0);
if ( channelId == -1 ) {
printf( "ChannelCreate error!\n" );
exit(1);
}
if (Setup_Timer( )==-1) {
printf( "Setup_Timer error!\n" );
exit(2);
}
struct _pulse PulseMsg;
while(1)
{
rcv_id = MsgReceivePulse(channelId, &PulseMsg, sizeof(PulseMsg), NULL );
if (rcv_id == -1) {
printf( "MsgReceivePulse error!\n" );
exit(3);
} else if (PulseMsg.code == CODE_TIMER) {
tmm = time( NULL );
now = localtime( &tmm );
printf("Recieve pulse. Time - %2.2d:%2.2d:%2.2d.\n", now->tm_hour, now->tm_min, now->tm_sec );
}
}
return EXIT_SUCCESS;
}
// Настройка таймера //
int Setup_Timer( )
{
timer_t timer_id;
struct sigevent timer_event;
struct itimerspec timer;
int connect_id;
connect_id = ConnectAttach(0,0,channelId,0,0);
if (connect_id == -1) {
printf( "ConnectAttach error.\n" );
return -1;
}
SIGEV_PULSE_INIT( &timer_event, connect_id, SIGEV_PULSE_PRIO_INHERIT, CODE_TIMER, 0 );
if (timer_create( CLOCK_REALTIME, &timer_event, &timer_id) == -1 ) {
printf( "timer_create error.\n" );
return -1;
}
timer.it_value.tv_sec = 1;
timer.it_value.tv_nsec = 0;
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_nsec = 0;
timer_settime( timer_id, 0, &timer, NULL );
return 0;
}
Результаты работы программы. Программы запускались прямо из IDE(Run As C/C++ QNX Application). Результаты работы выводятся на консоль в IDE.
Recieve pulse. Time - 23:40:12.
Recieve pulse. Time - 23:40:13.
Recieve pulse. Time - 23:40:14.
Recieve pulse. Time - 23:40:15.
Recieve pulse. Time - 23:40:16.
Recieve pulse. Time - 23:40:17.
Timeline и Tracelog работы программы.
На диаграмме отражены события — инициализация программы и обработка двух пульсов по таймеру с интервалом 1 секунда.
3.2. Посылка пульса по таймеру заданному процессу.
Схема программы:
Программа Client_timer имеет
возможность отправлять сообщения серверу, которые вводятся с терминала и так же
отправляет серверу пульсы по таймеру.
Программа сервер здесь используется из пункта 2.3.
Листинг 3.2.1. 2_4_pulse_timer_client.c.
/*
* Поcылка сообщений серверу и
* посылка пульса по срабатыванию таймера
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/dispatch.h>
#include <sys/siginfo.h>
#include <sys/neutrino.h>
#define ATTACH_POINT "qnx_msg_server"
#define BUF_LEN 256
#define CODE_TIMER 1
typedef union {
struct _pulse pulse_msg;
char msg_buff[ BUF_LEN ];
} Msg_T;
int connect_id;
void Sigint_Handler( int );
void Setup_Timer( );
int main( int argc, char *argv[] )
{
Msg_T send_buff;
Msg_T reply_buff;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.