В настоящее время ведется разработка программно-аппаратного комплекса на базе микроконтроллера, что позволит выполнять регистрацию основных параметров в автономном режиме с последующей передачей информации в персональный компьютер для обработки.
Б.А. Державец
МНОГОПОТОКОВЫЕ RPC-СЕРВЕРЫ В СРЕДЕ RED HAT ENTERPRISE LINUX AS/ES З
Насколько известно автору, SUN RPC не был полностью портирован в среду Linux, включая Red Hat Enterprise Linux AS/ES 3. Ключ - А утилиты RPCGEN, позволяющий в среде SunOS скомпилировать многопотоковый RPC-сервер, не поддерживается в среде Red Hat Linux 9,а также и в среде RHEL AS/ES 3.
Невозможность распараллеливать вызов удаленных процедур является весьма серьезной проблемой для промышленной ОС, сравните, например, с Sun RPC для SunOS или DCE RPC для HP-UX.
Производительность Oracle Advanced Replication, использующих отложенные либо немедленные RPC-вызовы, в среде, не поддерживающей многопотоковые RPC-серверы , будет заведомо худшей чем , например, под SunOS.
В статье приводится технология изменения кода заглушки сервера, позволяющая продемонстрировать на конкретном примере из [2] , как распараллелить код square_svc.c в среде White Box Linux 3 (RHEL 3) и собрать многопотоковый RPC-сервер.
Подход никаким образом не связан с конкретным примером (шаблон square.x) - это универсальные изменения, вносимые в файл заглушки сервера sample_svc.c, для произвольного шаблона sample.x, базированные на Posix Threads API и делающие код заглушки многопотоковым.
Заметим, что откомпилировать square_svc.c из [1] в среде White Box Linux 3 не удается. Сравнение версии gcc и glibc показывает:
gcc:
3.2.2-5 (RHL9)
3.2.3-34 (RHEL AS 3)
glibc:
2.3.2-11.9 (RHL 9)
2.3.2-95.20 (RHEL AS 3)
Ниже приведен алгоритм модификации заглушки сервера из примера, рассмотренного в [2] , позволяющий откомпилировать многопотоковый RPC-сервер в среде White Box Linux 3 (RHEL 3), следуя [1]. Идея состоит в том, чтобы код стандартной процедуры square_prog_2, создаваемой утилитой rpcgen поместить в процедуру serv_request( ), выполняемую потоком, запускаемым при запросе на выполнение удаленной процедуры. Новый же код square_prog_2( ) формирует структуру с данными, указатель на которую data_ptr передается вызову :
pthread_create (&thread_id,&attr, serv_request, (void *)data_ptr)
static void
square_prog_2(struct svc_req *rqstp, register SVCXPRT *transp)
{
Компьютерные и информационные технологии в науке, инженерии и управлении
/ *
Структура, предназначенная для упаковки данных, передаваемых процедуре, выполняемой потоком
*/
struct data_str {
struct svc_req *rqstp;
SVCXPRT *transp;
} *data_ptr=(struct data_str*)malloc(sizeof(struct data_str));
{
/*
Инициализация поля структуры
*/
data_ptr->rqstp = rqstp; data_ptr->transp = transp;
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
/*
Запуск потока, выполняющего запрос на выполнение удаленной процедуры.
*/
pthread_create(&p_thread,&attr,serv_request,(void *)data_ptr);
pthread_attr_destroy(&attr);
free (data_ptr);
}
}
Процедура serv_request (), выполняемая потоком есть модифицированный код square_prog_2, содержащий дополнительные операторы определения структуры для распаковки данных, передаваемых указателем (struct thr_dat *)data_ptr :-
#include "square.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
/ *
Структура, предназначенная для распаковки данных, передаваемых процедуре, выполняемой потоком
*/
struct thr_data
{
struct svc_req *rqstp;
SVCXPRT *transp;
} ;
pthread_t p_thread; pthread_attr_t attr;
/* Процедура, выполняемая потоком */ void *
serv_request(void *data) і
struct thr_data *ptr_data = (struct thr_data *)data; union і
square_in squareproc_2_arg;
} argument; union і
square_out squareproc_2_res;
} result; bool_t retval;
xdrproc_t _xdr_argument, _xdr_result; bool_t (*local)(char *, void *, struct svc_req *);
/*
Получение данных для выполнения удаленной процедуры процедурой serv_request ( )
*/
struct svc_req *rqstp = ptr_data->rqstp; register SVCXPRT *transp = ptr_data->transp;
Дальнейший код процедуры serv_request () смотри, например, в [3] или [4]. Блок main(), сгенерированный утилитой rpcgen, оставляем без измене-ний.Полностью код файла square_svc.c для среды RHEL AS 3 опубликован в [3], [4]. Детально сборка многопотокового RPC-сервера в среде RHL9/RHEL AS 3 описана в [1].
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. http://www.linuxgazette.com/node/9005.
2. Стивенс У. UNIX: Взаимодействие процессов. -Спб.: Из-во “Питер”, 2002.
3. http://www.linuxgazette.com/node/10201.
4. http://lxer.com/module/newswire/view/36422.
А.О.Пьявченко, А.А.Литовкин, В.А.Дьяченко
ОСОБЕННОСТИ ПОСТРОЕНИЮ ВСТРОЕННЫХ ЛОГИЧЕСКИХ
АНАЛИЗАТОРОВ БОРТОВЫХ МИКРОПРОЦЕССОРНЫХ СИСТЕМ
В статье рассматриваются актуальность и необходимость создания встроенных логических анализаторов (ЛА) для диагностики цифровых блоков бортовых микропроцессорных систем (БМПС), их цифровых каналов связи в процессе проведения их отладки и комплексной регулировки системы; рассматриваются принципы построения таких устройств с применением и в составе ПЛИС, а также результаты апробации принципов на примере макета логического анализатора шины PCI персонального компьютера.