Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер, страница 9

Результаты получили точно такие же, как при использовании стандартных функций.

2.2.3. Посылка пульса по событию (срабатывание таймера).

Текст программы:

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <signal.h>

#include <unistd.h>

#include <errno.h>

#include <sys/dispatch.h>

#include <sys/siginfo.h>

#include <sys/neutrino.h>

#define BUF_LEN 256

typedef union

{

struct

_pulse      pulse_msg;

char msg_buff[ BUF_LEN ];

}Msg_T;

#define     ATTACH_POINT      "qnx_msg_server"

#define           BUF_LEN                 256

#define     CODE_TIMER        1

name_attach_t *msg_chanel;

void Setup_Timer( );

int main(int argc, char *argv[])

{

int rcv_id;

time_t tmm;

struct tm *now;

msg_chanel = name_attach( NULL, ATTACH_POINT, 0 );

Setup_Timer( );

Msg_T msg;

while(1)

{

rcv_id = MsgReceive( msg_chanel->chid, &msg, sizeof(msg), NULL );

if( rcv_id == 0 )                  // Принят пульс

{

if( msg.pulse_msg.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 );

}

}

else                               // Принято сообщение от клиента

{

printf( "Server: receive message.\n" );

printf( "Message: %s\n", msg.msg_buff );

strcpy( msg.msg_buff, "OK!" );

MsgReply( rcv_id, EOK, msg.msg_buff, sizeof(msg.msg_buff) );

}

}

return EXIT_SUCCESS;

}

/* Настройка таймера */

void Setup_Timer( )

{

timer_t timer_id;

struct sigevent timer_event;

struct itimerspec timer;

int connect_id;

connect_id = name_open( ATTACH_POINT, 0 );

if( connect_id == -1 )

{

printf( "ConnectAttach error.\n" );

}

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" );

}

timer.it_value.tv_sec = 5;

timer.it_value.tv_nsec = 0;

timer.it_interval.tv_sec = 5;

timer.it_interval.tv_nsec = 0;

timer_settime( timer_id, 0, &timer, NULL );

}

Результаты:

Recieve pulse. Time - 19:53:04.

Recieve pulse. Time - 19:53:09.

Recieve pulse. Time - 19:53:14.

Recieve pulse. Time - 19:53:19.

2.3. Использование файловой модели.

 

При такой реализации один процесс будет записывать в файл данные, а другой считывать их оттуда.

 

Текст программы:

Программа, которая записывает строку в файл:

 

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include "file_header.h"

int main (int argc, char *argv[]) {

printf("This process writes to file!\n");

char  buf[50] = "The sun is shining!";

printf ("Process wrote string: %s\n",buf);

int fd = open (FILE_ADDRES, O_WRONLY | O_CREAT);

write(fd, buf, sizeof(buf));

close(fd);

return EXIT_SUCCESS;

}

Программа, которая читает данные из файла:

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include "../msg_file_write/file_header.h"

int main(int argc, char *argv[]) {

int size_read;

char buf[50];

printf("This process reads from file!\n");

int fd = open(FILE_ADDRES, O_RDONLY);

size_read = read(fd, buf, sizeof(buf));

if (size_read == -1) {

printf("Error reading %s", argv[1]);

return EXIT_FAILURE;

}

close(fd);

printf ("Process read from file %s: \"%s\"\n",FILE_ADDRES, buf);

return EXIT_SUCCESS;

}

#ifndef FILE_HEADER_H_

#define FILE_HEADER_H_

#define ATTACH_POINT "msg_server"

#define FILE_ADDRES "/net/QNX1/home/sam/file.txt"

#endif /* FILE_HEADER_H_ */

Результаты: