Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP - Программирование, компьютеры и кибернетика отчет по практике

Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP - Программирование, компьютеры и кибернетика отчет по практике




































Главная

Программирование, компьютеры и кибернетика
Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP

Уровни архитектуры IP-телефонии. Особенности передачи речевой информации по IP–сетям. Влияние операционной системы. Количество передаваемых в пакете кадров. Взаимодействие модулей УШ и модуля протокола RTP. Информация конфигурации и контроля модуля УШ.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Время задержки при передаче речевого сигнала можно отнести к одному из трех уровней:
Большинство операционных систем не может контролировать распределение времени центрального процессора между разными процессами с точностью, превышающей несколько десятков миллисекунд, и не может обрабатывать за такое же время более одного прерывания от внешних устройств. Это приводит к тому, что задержка в продвижении данных между сетевым интерфейсом и внешним устройством речевого вывода составляет, независимо от используемого алгоритма кодирования речи, величину такого же порядка, или даже больше.
Отправитель речевых пакетов передает их через фиксированные промежутки времени (например, через каждые 20 мс), но при прохождении через сеть задержки пакетов оказываются неодинаковыми, так что они прибывают в пункт назначения через разные промежутки времени.
Для того чтобы компенсировать влияние джиттера, в терминалах используется джиттер-буфер. Этот буфер хранит в памяти прибывшие пакеты в течение времени, определяемого его емкостью (длиной). Интервалы между пакетами восстанавливаются на основе значений временных меток RTP-пакетов.
Кодек и количество передаваемых в пакете кадров
Большинство современных эффективных алгоритмов кодирования/декодирования речи ориентировано на передачу информации кадрами, а не последовательностью кодов отдельных отсчетов. Поэтому в течение времени, определяемого длиной кадра кодека, должна накапливаться определенной длины последовательность цифровых представлений отсчетов. Кроме того, некоторым кодекам необходим предварительный анализ большего количества речевой информации, чем должно содержаться в кадре. Это неизбежное время накопления и предварительного анализа входит в общий бюджет длительности задержки пакета.
— функцию считывания закодированных модулем УШ данных, и помещения их в циклический буфер накопления;
— функцию предоставления данных из циклического буфера накопления по запросу другого потока;
— функцию помещения другим потоком данных в циклический буфер воспроизведения для последующей записи их для декодирования в модуль УШ;
— функцию записи в модуль УШ данных из циклического буфера воспроизведения.
Рис.1. Схема взаимодействия между модулем УШ и модулем протокола RTP
Модуль УШ и модуль протокола RTP входят в состав комплекса программ шлюза доступа IP.
Модуль УШ и модуль протокола RTP - программы, работающие в разных процессорах Модуль УШ - в DSP процессоре. Модуль протокола RTP - в процессоре ARM или промышленном компьютере. Взаимодействие между модулями осуществляется через память, которая находится в DSP модулей УШ, при помощи интерфейса HPI (параллельный интерфейс). Операции чтения/записи выполняются посредством разработанных функций драйвера.
Основное назначение модуля УШ - кодирование/декодирование речевых данных. Модуль УШ обрабатывает речевые данные одного ИКМ (32 канальных интервала). Каждые 10 мс он кодирует входящий речевой поток тех каналов, которые ему задает модуль протокола RTP, и декодирует в обратном направлении. Используемые кодеки - G711, G726-16, G729.
Основное назначение модуля протокола RTP - упаковка закодированных речевых данных принятых из модуля УШ в пакеты RTP и отправка их в сеть IP, и, в обратном направлении - распаковка пакетов RTP, принятых из сети IP и предоставление данных для декодировании модулю УШ. Прием и запись речевых данных выполняется каждые 10 мс.
// основная функция потока интерфейса УШ
unsigned char n=*(unsigned char*)arg;
// ========= параметры вывода ============
// di - данные, принимаемые из DSP2 модуля УШ
// do - данные, передаваемые в DSP2 модуля УШ
//параметры вывода на консоль по умолчанию
ParamRtpPrint[DI]=0x00000001; // номеру бита установленному в 1 соответствует номер канала для вывода
ParamRtpPrint[DI+1]=0x00000001; // номеру бита установленному в 1 соответствует номер канала для вывода
// это рекомендуется при использовании потоков реального времени
// locks all pages mapped into the address space of the calling
// process. This includes the pages of the code, data and stack segment,
// as well as shared libraries, user space kernel data, shared memory, and
// memory-mapped files. All mapped pages are guaranteed to be resident in
// RAM when the call returns successfully; the pages are guaranteed to
// stay in RAM until later unlocked.
if ((mlockall(MCL_CURRENT|MCL_FUTURE))==-1)
fprintf(stderr,"mlockall() error! :\n %s errno=%i\n",strerror(ierr),ierr);
// создать объекты интерфейсов c УШ
// 32 - тип ИКМ тракта подведенного к модулю УШ (на 32 канальных интервала, м.б. на 64)
pUHInterface[n]= new t_UHInterface(n,32);
printf("t_RTPManager::Instance: Allocation memory error!\n");
pUHInterface[n]->set_running(true);
pUHInterfaceThread[n] = new t_thread(main_UHInterface,
// SCHED_FIFO - тип планировщика, обслуживание по очереди, среди имеющих один приоритет
// 49 -приоритет, приоритеты должны быть < 50, т.к. таймер имеет приоритет 50
printf("!!UH Interface thread creating error, code = \n");
// сделать поток отсоединяемым.(он будет завершаться сам)
// задержать перед созданием следующего потока, чтобы предыдущий успел запуститься
sleeptimer.tv_nsec = 500000000; // 500ms
pUHInterface[0]->StartDataAccumulation(0);
pUHInterface[0]->StopDataAccumulation(0);
Реализация класса для взаимодействия модуля протоколя RTP и модуля УШ
static const char cName[16]="/dev/drv6713b. ";
char * pcCodec []={"null","G.711","G.726-16","G729"};
const SLineCtrl t_UHInterface::m_vzeroLineCtrl[32] = { {{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
* ВХОДНЫЕ ПАРАМЕТРЫ : ucUHNum - порядковый номер УШ (0-3),
t_UHInterface::t_UHInterface(unsigned char ucUHNum, unsigned char ucCINum)
memcpy(m_cName, cName,sizeof(m_cName));
itoa(ucUHNum,(char*)(&m_cName[14]));
m_puiBaseAddress=(unsigned int*)(BASE_DATA_ADDRESS);
m_pvBaseDataCtrl=(SLineCtrl*)(m_puiBaseAddress+(CONF_SIZE>>2));
m_puiDumpNum=(unsigned int*)(m_pvBaseDataCtrl+64)+(sizeof(m_uiDumpNum)>>2);
m_puiBaseDataForRTP=m_puiDumpNum+(sizeof(m_uiDumpNum)>>2);
m_puiBaseDataForUH=m_puiBaseDataForRTP+(DUMP_SIZE*2>>2);
m_ucMaxPlayBackBufInd=JITTER_BUF_SIZE/10;
m_ucMaxPlayBackBufInd=(JITTER_BUF_SIZE<<1)/10;// в два раза больше джиттер буфера
// буфер воспроизведения для записи
m_pvPlayBackBuf=new SData[m_ucMaxPlayBackBufInd<<5]; // буфер для всех 32 каналов
// буфер для чтения данных речевого трафика из УШ
m_puiDataFromUH=new unsigned int[DUMP_SIZE>>2];
// буфер накопления данных речевого трафика, прочитанных из УШ для 32 КИ
m_pvAccumulatedData=new SData [ACCBUFF_DEPTH<<5];
if ( !m_pvPlayBackBuf || !m_pvAccumulatedData || !m_puiDataFromUH || !m_pvTmpPlayBackBuf )
printf("t_UHInterface::t_UHInterface: Allocation memory error!\n");
// проинициализировать буфер с управляющей информацией кодирования/декодирования
memset(m_vLineCtrl,0,sizeof(m_vLineCtrl));
// проинициализировать буфер с признаками изменения управляющей информации
memset(m_uiChangeLineCtrl,0,sizeof(m_uiChangeLineCtrl));
// проинициализировать буфер с данными для УШ как отсутствие пакетов для всех КИ
// обнулить буфер накопления данных речевого трафика
memset(m_pvAccumulatedData,0,ACCBUFF_DEPTH*32*sizeof(SData));
memset(m_iAccGetInd,0,sizeof(m_iAccGetInd));
memset(m_iAccPutInd,0,sizeof(m_iAccPutInd));
memset(m_iAccIndDelta,0,sizeof(m_iAccIndDelta));
// обнулить массив с признаками необходимости накопления данных речевого трафика для 32 КИ
memset(m_IsAccumulating,0,sizeof(m_IsAccumulating));
printf("!!t_UHInterface::run %i DSP2_open error, Res=%i, name=%s\n", m_ucUHNum,m_devd,m_cName);
/**НАЗНАЧЕНИЕ : установить признак выполнения потока агента УШ
* ВХОДНЫЕ ПАРАМЕТРЫ : brunnung - значение признака выполнения потока
void t_UHInterface::set_running(bool brunning)
/**НАЗНАЧЕНИЕ : остановить поток агента УШ
sleeptimer.tv_nsec = 10000000; // 10 мс
/**НАЗНАЧЕНИЕ: записать во внутреннюю память УШ данные конфигурации
* ВХОДНЫЕ ПАРАМЕТРЫ : ucCINum - количество КИ в ИКМ
void t_UHInterface::WriteConfToUH(unsigned char ucCINum)
printf("\n<>2;
if (m_ucI<255) m_ucI++; else m_ucI=0;
memcpy(m_puiDataFromUH,(unsigned int*)ucfromPCM0,DUMP_SIZE);
// прочитать данные при помощи интерфейса HPI
if((ires=(dsp6713b_read_IS(m_devd, (unsigned int)puiAddress, m_puiDataFromUH, DUMP_SIZE))))
printf("\n!!t_UHInterface::GetDataFromUH %i: DSP2_read_IS error!\n Addr=%08x Res=%i \n", m_ucUHNum,
// помещаем данные в буфер накопления
m_pvAccumulatedData[i+n]= *((SData*)(m_puiDataFromUH)+i);
m_iAccPutInd[i]++; // увеличиваем значение индекса для следующего помещения данных
if (m_iAccPutInd[i]==ACCBUFF_DEPTH) m_iAccPutInd[i]=0; // циклический переход в начало
m_iAccIndDelta[i]++; // увеличиваем расстояние по отношению к индексу для извлечения
if (m_iAccIndDelta[i] > ACCBUFF_DEPTH)
// фиксируем состояние переполнения буфера накопления
printf("Acc buf overflow for %i \n",i);
if ((p_DIN) && (ParamRtpPrint[m_ucIndDI]))
snprintf(buf1,400,">>UH %i: %08x (%i)\n",m_ucUHNum,(unsigned int)puiAddress, m_uiDumpNum);
uiSize=((SData*)(m_puiDataFromUH)+i)->m_vSDataCtrl.SpeachSize;
pucData=((SData*)(m_puiDataFromUH)+i)->m_ucData;
snprintf(buf1,400," [%i] : CN-%01x, tone-%02x, size-%i\n",i,
((SData*)(m_puiDataFromUH)+i)->m_vSDataCtrl.CN,
((SData*)(m_puiDataFromUH)+i)->m_vSDataCtrl.Tone, uiSize);
for (ii=0,j=0, n=0; (j>2;
if (m_iPlayBackIndDelta[i] > m_ucMaxPlayBackBufInd) // переполнение
while (m_iPlayBackGetInd[i] != m_iPlayBackPutInd[i])
// циклический переход в начало буфера
if (m_iPlayBackGetInd[i] == m_ucMaxPlayBackBufInd) m_iPlayBackGetInd[i]=0;
m_pvTmpPlayBackBuf[i].m_vSDataCtrl.SpeachSize=0;
m_pvTmpPlayBackBuf[i].m_vSDataCtrl.Tone=0;
m_pvTmpPlayBackBuf[i].m_vSDataCtrl.CN=1;
m_pvTmpPlayBackBuf[i]=m_pvPlayBackBuf[i+n];
// циклический переход в начало буфера
if (m_iPlayBackGetInd[i] == m_ucMaxPlayBackBufInd) m_iPlayBackGetInd[i]=0;
// записать данные при помощи интерфейса HPI
// пишем при помощи промежуточного буфера, чтобы не задерживать блокировку m_pvPlayBackBuf на время записи в DSP
if ((ires=(dsp6713b_write_IS(m_devd,(unsigned int)puiAddress, m_pvTmpPlayBackBuf, DUMP_SIZE))))
printf("\n!!t_UHInterface::PutDataToUH %i: DSP2_write_IS error!\n Addr=%08x Res=%i \n", m_ucUHNum,
if ((p_DOUT) && (ParamRtpPrint[m_ucIndDO]))
printf("<m_vSDataCtrl.SpeachSize;
pucData=(m_pvTmpPlayBackBuf+i)->m_ucData;
printf(" [%i] : CN-%01x, tone-%02x, size-%i, newCtrl-%i\n",i,
(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.CN,
(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.Tone, uiSize,(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.NewLineCtrl);
for (ii=0,j=0, n=0; (j m_ucMaxPlayBackBufInd)
// фиксируем состояние переполнения буфера воспроизведения
printf("PlayBack buf overflow for %i \n",ucCI);
/**НАЗНАЧЕНИЕ : очистить буфер воспроизведения для КИ
* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала [0-31],
* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - успешно
bool t_UHInterface::ClearDataInPlayBackBuf(unsigned char ucCI)
m_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.SpeachSize=0;
m_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.Tone=0;
m_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.CN=1;
m_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.NewLineCtrl=0;
/**НАЗНАЧЕНИЕ : получить порцию данных из буфера накопления
* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала,
* vSData - структура для помещения данных,
* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - данные извлечены из буфера накопления,
* false - в буфере накопления нет данных
bool t_UHInterface::GetAccumulatedData(unsigned char ucCI, SData &vSdata)
if (m_iAccIndDelta[ucCI] > ACCBUFF_DEPTH) // переполнение
while (m_iAccGetInd[ucCI] != m_iAccPutInd[ucCI])
// циклический переход в начало буфера
if (m_iAccGetInd[ucCI] == ACCBUFF_DEPTH) m_iAccGetInd[ucCI]=0;
vSdata=m_pvAccumulatedData[ucCI+n];
// циклический переход в начало буфера
if (m_iAccGetInd[ucCI] == ACCBUFF_DEPTH) m_iAccGetInd[ucCI]=0;
/**НАЗНАЧЕНИЕ : записать управляющую информацию кодирования/декодирования во
* внутреннюю память модуля УШ для тех КИ, у которых она изменилась
void t_UHInterface::WriteLineCtrlToUH(void)
// прочитать из внутренней памяти УШ номер области памяти для
// считывания и записи данных модулем протокола RTP
if ((ires=(dsp6713b_read(m_devd,(unsigned int)m_puiDumpNum, &m_uiDumpNum))))
printf("\n!!t_UHInterface::GetDumpNum %i: DSP2_read error!\n Addr=%08x Res=%i \n", m_ucUHNum,
printf("\n!!>>UH %i: DumpNum %08x > %08x\n",m_ucUHNum, (unsigned int)m_puiDumpNum,m_uiDumpNum);
// выполнить запись управляющей информации (не взодит в задание)
/**НАЗНАЧЕНИЕ : очистить управляющую информацию всех КИ во внутренней памяти
void t_UHInterface::ClearLineCtrlInUH(void)
unsigned int uiAddress1, uiAddress2;
uiAddress1=uiAddress2=(unsigned int)m_pvBaseDataCtrl;// адрес области памяти #1
uiAddress2+=sizeof(m_vLineCtrl); // адрес области памяти #1
memset(m_vLineCtrl,0,sizeof(m_vLineCtrl));
// m_vzeroLineCtrl используем, чтобы не задерживать блокировку m_vLineCtrl на время записи в DSP
if ((ires=(dsp6713b_write_IS(m_devd,uiAddress1, (void*)m_vzeroLineCtrl, sizeof(m_vzeroLineCtrl)))) ||
(ires=(dsp6713b_write_IS(m_devd,uiAddress2, (void*)m_vzeroLineCtrl, sizeof(m_vzeroLineCtrl)))) )
printf("\n!!t_UHInterface::ClearLineCtrlInUH %i: DSP2_write_IS error!\n Addr=%08x Res=%i \n", m_ucUHNum,uiAddress1,ires);
/**НАЗНАЧЕНИЕ : запуск модуля УШ (инициализация модуля УШ и запуск программы в DSP)
void t_UHInterface::StartWorkDSP2(void)
if((ires=(dsp6713b_reset(m_devd))))
printf("!!t_UHInterface::StartWorkDSP2 %i DSP2_reset error, Res=%i\n", m_ucUHNum,ires);
// записать в УШ данные конфигурации
ClearLineCtrlInUH(); // обнулить управляющую информацию в памяти модуля УШ по всем КИ
// проинициализировать в УШ области памяти для данных
if ((ires=(dsp6713b_start(m_devd))))
printf("!!t_UHInterface::StartWorkDSP2 %i DSP2_start error, Res=%i\n", m_ucUHNum,ires);
for (i=MAX_WAIT_READY; i>0; i--) // 10 раз = 100 ms
if((ires=(dsp6713b_read(m_devd,(unsigned int)m_puiBaseAddress, &uiConf))))
printf("!!t_UHInterface::StartWorkDSP2 %i: DSP2_read error!\n Addr=%08x Res=%i \n",
m_ucUHNum,(unsigned int)m_puiBaseAddress,ires);
printf("UH %i is READY!\n",m_ucUHNum);
printf("UH %i is NOT READY!\n", m_ucUHNum);
printf("UH %i is READY!\n",m_ucUHNum);
/**НАЗНАЧЕНИЕ : исполнительный метод потока интерфейса УШ
printf("UH_Interface %i is started\n",m_ucUHNum);
// сбросить DSP и загрузить программу модуля УШ
// работа с управляющими регистрами DSP
// сбросить HINT и установить DSPINT, чтобы DSP начал выставлять прерывания
ires=dsp6713b_setHPIC(m_devd,ii|0x00000002);
dsp6713b_sleep(m_devd); // выход из этой функции происходит каждые 10 мс по прерыванию от DSP
// обработчик прерываний находится в драйвере, драйвер инициирует этот выход
// записать управляющую информацию,во внутреннюю память модуля УШ для тех КИ, у которых она изменилась
// (упр.информация меняется по запросу другого потока)
// // здесь же определяется номер области памяти для
// считывания и записи данных модулем протокола RTP
// прочитать данные из внутренней памяти УШ и при необходимости
// здесь же определяется номер области памяти для
// считывания и записи данных модулем протокола RTP
//поместить данные из буфера воспроизведения во внутреннюю память УШ
if((ires=(dsp6713b_reset(m_devd))))
printf("!!t_UHInterface::run %i DSP2_reset error, Res=%i\n", m_ucUHNum,ires);
printf("\n RTP: DSP device is closed\n");
printf("Агент UH: UHInterface % is stopped\n",m_ucUHNum);
В ходе выполнения задания в период прохождения производственной практики было проведено ознакомление с принципами организации и работы IP-телефонии, а также передачи голосового сигнала.
Были реализованы отдельные функции для класса интерфейса между модулем кодирования/декодирования речевых данных (УШ) и модулем протокола RTP. В частности:
· функция считывания закодированных модулем УШ данных, и помещения их в циклический буфер накопления;
· функция предоставления данных из циклического буфера накопления по запросу другого потока;
· функция помещения другим потоком данных в циклический буфер воспроизведения для последующей записи их для декодирования в модуль УШ;
· функция записи в модуль УШ данных из циклического буфера воспроизведения.
Программный код был успешно протестирован и включен в интерфейс, обеспечивающий взаимодействие между модулем кодирования/декодирования речевых данных (УШ) и модулем протокола RTP.
1. Руководство по технологиям объединенных сетей, 4-е издание.: Пер. с англ. - М.: Издательский дом «Вильямс», 2005.
2. Гольдштейн B.C., Пинчук А.В., СуховицкийА.Л. IP-Телефония. -- М.: Радио и связь, 2001.
3. Цимберов А.Г. Учебник по IP-телефонии. М.: Харвест, 2002г.
Постановка задачи для модуля 1С. Бухгалтерия 3.0. Анализ существующих разработок в области интегрирования данных. Информационное обеспечение модуля "Связь 1С Предприятия 8.2. с "Казначейством". Программное и технологическое обеспечение данного модуля. курсовая работа [1,5 M], добавлен 10.06.2013
Технико-экономические характеристики предметной области по учету готовой продукции на ОАО "ММК". Постановка задачи для модуля 1С. Бухгалтерия 3.0. Информационное обеспечение модуля "Связь 1С Предприятия 8.2. с "Казначейством". Оценка трудоемкости работы. дипломная работа [1,1 M], добавлен 06.06.2013
Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей. курсовая работа [215,3 K], добавлен 01.09.2010
Функциональные возможности модуля "Зарплата", его настройка и режимы работы. Разграничение доступа между пользователями. Назначение составляющих модулей, связи между ними. Тонкости и нештатные ситуации. Ввод в эксплуатацию и внутренние перемещения. курсовая работа [1,9 M], добавлен 01.12.2015
Характеристика деятельности, структуры и функций агентства. Анализ текущей структуры сайта заказа наружной рекламы. Описание функциональной архитектуры и архитектуры данных проектируемого автоматизированного модуля. Проектирование интерфейса пользователя. дипломная работа [2,0 M], добавлен 22.07.2015
Автоматизация рутинных бизнес-процессов технической поддержки организации с помощью встраиваемого модуля технологии системы IP-телефонии. Особенности проектирования, разработки и реализации модуля. Описание информационной системы, ее тестирование. дипломная работа [2,3 M], добавлен 10.12.2016
Функция протокола и структура пакета разрабатываемого протокола. Длина полей заголовка. Расчет длины буфера на приеме в зависимости от длины пакета и допустимой задержки. Алгоритмы обработки данных на приеме и передаче. Программная реализация протокола. курсовая работа [1,0 M], добавлен 18.05.2014
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP отчет по практике. Программирование, компьютеры и кибернетика.
Автоматизированные Системы Управления Курсовая
Реферат: Управление оборотными активами предприятия 2
Сочинение: "Quo vadis": проекція на сучасність
Дипломная работа: Туристский рынок Пермского края
Реферат: Фундаменталистская идеология "исламского возрождения"
Еңбек Тәрбиесі Эссе
Как Писать Сочинение Моя Семья
Языковая ситуация во Франции
Купить Сочинения Сталина Том 18
Курсовая работа: Теория и практика вероятностно-статистических исследований. Скачать бесплатно и без регистрации
Реферат: Планк Макс
Реферат по теме Анализ финансового состояния санатория имени Лермонтова (Пятигорск)
Скачать Контрольные Работы По Математике 6 Класс
Как Написать Эссе По Обществознанию
Современные Методы Обеззараживания Питьевой Воды Реферат
Курсовая работа по теме Жизненный цикл продукта. Учет его особенностей в маркетинговой деятельности
Мини Сочинение На Тему Листья
Сочинение О Чем Рассказывают Старые Фотографии
Реферат: Этические взгляды Иммануила Канта. Скачать бесплатно и без регистрации
Состояние Здоровья Реферат
Российский федерализм, проблемы и перспективы. - Государство и право курсовая работа
Словарная работа по повести "Невский проспект" - Педагогика презентация
Книжкова справа часів гетьманату - Культура и искусство контрольная работа


Report Page