Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Комплексная отладка и приемосдаточные испытания.




Формализация требований к системе.

Разработка структуры и архитектуры системы.

Разработка и изготовление аппаратных средств и программного обеспечения системы.

Комплексная отладка и приемосдаточные испытания.

 

Этап 1. На этом этапе составляются внешние спецификации, перечисляются функции системы, формализуется техническое задание (ТЗ) на систему, формально излагаются замыслы разработчика в официальной документации.

Этап 2. На данном этапе определяются функции отдельных устройств и программных средств, выбираются микропроцессорные наборы, на базе которых будет реализована система, определяются взаимодействие между аппаратными и программными средствами, временные характеристики отдельных устройств и программ.

Этап 3. После определения функций, реализуемых аппаратурой, и функций, реализуемых программами, схемотехники и программисты одновременно приступают к разработке и изготовлению соответственно опытного образца и программных средств. Разработка и изготовление аппаратуры состоят из разработки структурных и принципиальных схем, изготовления прототипа, автономной отладки.

Разработка программ состоит из разработки алгоритмов; написания текста исходных программ; трансляции исходных программ в объектные программы; автономной отладки.

Этап 4. см. Комплексная отладка.

При комплексной отладке наряду с детерминированным используется статистическое тестирование, при котором МПС проверяется при изменении исходных переменных в соответствии со статистическими законами работы источников информации. Полнота контроля работоспособности проектируемой системы возрастает за счет расширения диапазона возможных сочетаний переменных и соответствующих им логических маршрутов обработки информации.

Существуют пять основных приемов комплексной отладки микропроцессорной системы:

1) останов функционирования системы при возникновении определенного события;

2) чтение (изменение) содержимого памяти или регистров системы;

3) пошаговое отслеживание поведения системы;

4) отслеживание поведения системы в реальном времени;

5) временное согласование программ.

 

Комплексная отладка завершается приемосдаточными испытаниями, показывающими соответствие спроектированной системы техническому заданию. Для проведения комплексной отладки МПС используют логические анализаторы и комплексы: оценочные, отладочные, развития микропроцессоров, диагностирования, средств отладки.

 

На каждом этапе проектирования МПС людьми могут быть внесены неисправности и приняты неверные проектные решения. Кроме того, в аппаратуре могут возникнуть дефекты.

 

2. Внутрисхемные эмуляторы (основные и дополнительные функциональные блоки)

Внутрисхемный эмулятор – наиболее мощное и универсальное отладочное средство. Это программно-аппаратное средство, способное замещать процессор в реальной системе и делающее процесс функционирования отлаживаемого контроллера прозрачным, т. е. легко контролируемым, произвольно управляемым и модифицируемым по воле разработчика.

Функционально внутрисхемные эмуляторы делятся настыкуемые с внешней ЭВМ и функционирующие автономно.

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

Основные функциональные блоки эмулятора:

· - отладчик;

· - узел эмуляции микроконтроллера;

· - эмуляционная память;

· - подсистема точек останова.

· - Дополнительные блоки:

· - процессор точек останова;

· - трассировщик;

· - профилировщик (анализатор эффективности программного кода);

· - таймер реального времени;

· - программно-аппаратные средства, обеспечивающие возможность чтения и модификации эмулируемого процессора;

· - программно-аппаратные средства, обеспечивающие синхронное управление, необходимое для эмуляции в мультипроцессорных системах.

Отладчик осуществляет:

· - управление процессом эмуляции (моделирования);

· - вывод на монитор состояния и содержимого всех регистров и памяти и, при необходимости, их модификации (изменение их содержимого).

Отладчик позволяет одновременно следить за ходом выполнения программы и видеть соответствие между исходным текстом, образом программы в машинных кодах и состоянием всех ресурсов эмулируемого микроконтроллера.

Эмуляционная память может применяться вместо ПЗУ отлаживаемой системы, а также дает возможность отлаживать программу без реальной системы или ее макета. (Нет необходимости в перепрограммировании ПЗУ.) Эмулирование возможно целиком или поблочно.

Трассировщик – это логический анализатор, работающий синхронно с процессором и фиксирующий поток выполняемых инструкций и состояния выбранных внешних сигналов.

Процессор точек останова позволяет останавливать выполнение программы или выполнять иные действия, например, запускать или останавливать трассировщик при выполнении заданных пользователем условий (любой степени сложности) без вывода из масштаба «реального времени».

Профилировщик позволяет получить по результатам прогона отлаживаемой программы следующую информацию:

· - количество обращений к различным участкам программы;

· - время, затраченное на выполнение различных участков программы.

Анализ статистической информации, поставляемой профилировщиком, позволяет легко выявлять «мертвые» или перенапряженные участки программ и в результате оптимизировать структуру отлаживаемой программы.

Интегрированная среда разработки – это совокупность программных средств, поддерживающая все этапы разработки ПО – от написания исходного текста программы до ее компиляции и отладки – и обеспечивающая простое и быстрое взаимодействие с другими инструментальными средствами (программным отладчиком-симулятором и программатором).

 

3. Программные симуляторы, мониторы отладки, эмуляторы ПЗУ

Программный симулятор – программное средство, имитирующее работу микроконтроллера и его памяти. В его состав входят отладчик, модель центрального процессора и памяти. Более сложные симуляторы содержат также модели встроенных периферийных устройств (таймеров, АЦП и систем прерываний). Загрузив программу в симулятор, пользователь может запускать ее в пошаговом или непрерывном режимах, задавать условные или безусловные точки останова, контролировать и свободно модифицировать содержимое ячеек памяти и регистров микроконтроллера. С его помощью можно быстро проверить логику выполнения программы и правильность выполнения арифметических операций.

Наличие интерфейса внешней среды позволяет избавить разработчика от необходимости устанавливать и изменять вручную содержимое входных регистров, т. е. можно создавать и гибко использовать модель внешней среды микроконтроллера, функционирующую и взаимодействующую с отлаживаемой программой по заданному алгоритму.

Особенностью программных симуляторов является то обстоятельство, что исполнение программ, загруженных в симулятор, происходит в масштабе времени, отличном от реального. Однако более низкая цена, возможность ведения отладки даже в условиях отсутствия макета отлаживаемого устройства делают программные симуляторы весьма эффективным средством отладки.

Отладочный монитор – специальная программа, загружаемая в память отлаживаемой системы и вынуждающая процессор выполнять, кроме прикладной задачи, еще и отладочные функции:

· - загрузку прикладных кодов в свободную от монитора память;

· - установку точек останова;

· - запуск и останов загруженной программы в реальном времени;

· - проход программы пользователя по шагам;

· - просмотр, редактирование содержимого памяти и управляющих регистров.

Программа монитора должна быть связана с внешним компьютером или монитором для визуализации процесса отладки.

Основное достоинство использования монитора – это малые затраты при сохранении возможности вести отладку в реальном времени на микроконтроллере, стоящем на плате. Недостатком является отвлечение ресурсов микроконтроллера на отладочные и связные процедуры (память, прерывания, последовательный канал).

Платы развития, или оценочные платы, являются своеобразными конструкторами для макетирования прикладных систем. Выпуск оценочных плат – это современный подход к продвижению микроконтроллеров на рынке. Обычно на печатной плате устанавливается вся необходимая аппаратура для демонстрации возможностей микроконтроллера, обеспечивается связь с компьютером и предоставляется поле для монтажа прикладных схем пользователя. Такие платы могут быть применены для установки в аппаратуру малой серии (5 – 20 шт.).

Эмуляторы ПЗУ – это программно-аппаратные средства, позволяющие замещать ПЗУ на отлаживаемой плате и подставляющие вместо него ОЗУ, куда загружается программа с компьютера через один из стандартных каналов связи. В данном случае стараются избежать многократных циклов перепрограммирования ПЗУ. Метод пригоден для микроконтроллеров, которые в состоянии обращаться к внешней памяти программ. По сложности и стоимости метод сравним с использованием плат развития, но более универсален, так как может применяться с любыми типами микроконтроллеров.

 

4. Методика разработки ППО микропроцессорных систем. Структура программы

См. В5

Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.

Предложения ассемблера бывают четырех типов.

Команды или инструкции, представляющие собой символические аналоги машинных команд.

В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора. Одна команда Ассемблера, как правило, соответствует одной команде микропроцессора, что, вообще говоря, является характерным для низкоуровневых языков.

Приведем пример инструкции, которая осуществляет увеличение двоичного числа, хранящегося в регисреeax, на единицу:

inceax

макрокоманды – оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.

Примером макрокоманды может служить следующий макрос конца программы:

exit macro

mov ax,4c00h

int 21h

endm

директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий.

У директив нет аналогов в машинном представлении; В качестве примера приведем директиву TITLE, которая задает заголовок файла листинга: %TITLE «Листинг 1»

строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором. Пример:

; эта строчка является комментарием

 

5. Методика разработки ППО микропроцессорных систем. Директивы, операторы и функции ассемблера

Методы и инструментальные средства проектирования (CASE- средства) составляют центральную часть формализованной дисциплины выполнения проекта любого ПО ЭИС. Метод проектирования ПО представляет собой организованную совокупность процессов создания ряда моделей, которые описывают различные аспекты разрабатываемой системы с использованием четко определенной нотации. На более формальном уровне метод определяется как совокупность следующих составляющих:

· концепций и теоретических основ. В качестве таких основ могут выступать структурный или объектно-ориентированный подход;

· нотаций, используемых для построения моделей статической структуры и динамики поведения проектируемой системы.

· процедуры, определяющей практическое применение метода (последовательность и правила построения моделей, критерии, используемые для оценки результатов).

Методы реализуются через конкретные технологии и поддерживающие их методики, стандарты и инструментальные средства, которые обеспечивают выполнение процессов ЖЦ ПО.

Проблема сложности является главной проблемой, которую приходится решать при создании больших и сложных систем любой природы, в том числе и ЭИС. Единственный эффективней подход к решению этой проблемы, заключается в построении сложной системы из небольшого количества крупных частей, каждая из которых, в свою очередь, строится из частей меньшего размера и т.д., до тех пор, пока самые небольшие части можно будет строить из имеющегося материала. По отношению к проектированию сложной программной системы это означает, что ее необходимо разделять (декомпозировать) на небольшие подсистемы, каждую из которых можно разрабатывать независимо от других. Правильная декомпозиция является главным способом преодоления сложности разработки больших систем ПО, и означает следующее:

· количество связей между отдельными подсистемами должно быть минимальным;

· связность отдельных частей внутри каждой подсистемы должна быть максимальной.

Структура системы должна быть таковой, чтобы все взаимодействия между ее подсистемами укладывались в ограниченные, стандартные рамки:

· каждая подсистема должна инкапсулировать свое содержимое (скрывать его от других подсистем);

· каждая подсистема должна иметь четко определенный и интерфейс с другими подсистемами.

Инкапсуляция позволяет рассматривать структуру каждой подсистемы независимо от других подсистем. Интерфейсы позволяют строить систему более высокого уровня, рассматривая каждую подсистему как единое целое и игнорируя ее внутреннее устройство.

На сегодняшний день в программной инженерии существуют два основных подхода к разработке ПО ЭИС, принципиальное различие между которыми обусловлено разными способами декомпозиции систем. Первый подход называют функционально-модульным или структурным. В его основу положен принцип функциональней декомпозиции, при которой структура системы описывается в терминах иерархии ее функций кпередачи информации между отдельными функциональными элементами. Второй, объектно-ориентированный подход использует объектную декомпозицию. При этом структура системы описывается в терминах объектов и связей между ними, а поведение системы описывается в терминах обмена сообщениями между объектами.

Итак, сущность структурного подхода к разработке ПО ЭИС заключается в его декомпозиции (разбиении) на автоматизируемые функции: система разбивается на функциональные подсистемы, которые, в свою очередь, делятся на подфункции, т.е. – на задачи и так далее до конкретных процедур. При этом автоматизируемая система, сохраняет целостное представление, в котором все составляющие компоненты взаимоувязаны. При разработке системы «снизу вверх», от отдельных задач ко всей системе, целостность теряется, возникают проблемы при описании информационного взаимодействия отдельных компонентов.

Все наиболее распространенные методы структурного подхода базируются на ряде общих принципов. Базовыми принципами являются:

· принцип «разделяй и властвуй»;

· принцип иерархического упорядочения – принцип организации составных частей системы в иерархические древовидные структуры с добавлением новых деталей на каждом уровне.

Выделение двух базовых принципов не означает, что остальные принципы являются второстепенными, поскольку игнорирование любого из них может привести к непредсказуемым последствиям (в том числе и к провалу всего проекта). Основными из этих принципов являются:

· принцип абстрагирования выделение существенных аспектов системы и отвлечение от несущественных;

· принцип непротиворечивости – обоснованности согласованность элементов системы;

· принцип структурирования данных – данные должны быть структурированы и иерархически организованы.

В структурном подходе используются в основном две группы средств, описывающих функциональную структуру системы и отношения между данными. Каждой группе средств соответствуют определенные виды моделей (диаграмм), наиболее распространенными среди которых являются:

· DFD(DataFlowDiagrams) – диаграммы потоков данных;

· SADT(StructuredAnalysisandDesigntechnique – метод структурного анализа и проектирования), – модели и соответствующие функциональные диаграммы;

· ERD (Entity-Relationship Diagrams) диаграммы «сущность–связь». Диаграммы потоков данных и диаграммы «сущность–связь» – наиболее часто используемые в САSE-средствах виды моделей.

 

Ассемблер (от англ. assemble — собирать) — компилятор с языка ассемблера в команды машинного языка. На сегодняшний день ассемблер как язык программирования, предназначенный для создания программ, используется крайне редко. Это связано с тем, что этот процесс является чрезвычайно трудоемким и получающиеся программы являются системно зависимыми, их нельзя свободно переносить между компьютерами, имеющими различные аппаратные архитектуры и операционные системы. Поэтому на сегодняшний день ассемблер изучают в учебных целях, так как только он дает полное представление о реальном устройстве и функционировании аппаратуры и операционной системы. Сейчас разработка программ на ассемблере применяется в основном в программировании небольших микропроцессорных систем (микроконтроллеров), как правило, встраиваемых в какое-либо оборудование. Очень редко возникает потребность использования ассемблера в разрабатываемых программах в тех случаях, когда необходимо, например, получить наивысшую скорость выполнения определенного участка программы, выполнить операцию, которую невозможно реализовать средствами языков высокого уровня, либо уместить программу в память ограниченного объема (типичное требо-вание для загрузчиков операционной системы).

Директивы ассемблера.

Директивы ассемблера можно классифицировать следующим образом (рис. 1).

Рис. 1. Классификация директив ассемблера

Директивы режимов трансляции. Директивы определения общего режима трансляции определяют глобальные особенности трансляции, которые должны учитываться при обработке текста программы (рис. 2).

Рис. 2. Директивы определения общего режима трансляции

Директивы управления листингом определяют, что следует включать в содержимое файла листинга.

Директивы указания типа процессора определяют, какие регистры процессора, режимы адресации, команды разрешено использовать в программе.

Основание системы счисления определяет, как будут интерпретироваться числа по умолчанию.

Директивы assume фактически определяют точки программы, от которых транслятор отсчитывает смещения до меток, используемых в программе в качестве символических адресов.

Директива model чаще всего используется совместно с директивами упрощенной сегментации, рассматриваемыми далее. Она определяет, как будут расположены сегменты по отношению друг к другу, каким образом будут адресоваться данные, как будут вызываться подпрограммы

Директивы секционирования программы. Директивы секционирования программы предназначены для оформления логически законченных участков программы (рис. 3).

Рис. 3. Директивы секционирования программы

Сегменты программы могут описываться традиционными директивами segment и ends, как показано в приведенном примере, и директивами упрощенной сегментации.

Для описания процедур в ассемблере предусмотрены директивы proc и endp. Схематичное оформление процедуры с именем P:

P              proc

………

………; текст процедуры

……….

P              endp

Директивы макросредств. Директивы макросредств позволяют при написании программы оперировать заранее заготовленными фрагментами текстов. Их классификация (рис. 4).

Рис. 4. Классификация директив макросредств

Директивы резервирования данных. Директивы резервирования данных размещают и в случае необходимости, инициализируют области памяти под данные программы.

Операнды

Могут быть использованы следующие операнды:

· Метки, определённые пользователем (дают значение своего положения).

· Переменные, определённые директивой SET.

· Константы, определённые директивой EQU.

· Числа, заданные в формате:

o десятичном (принят по умолчанию): 10, 255;

o шестнадцатеричном (два варианта записи): 0x0a, $0a, 0xff, $ff; 16

o двоичном: 0b00001010, 0b11111111;

o восьмеричном (начинаются с нуля): 010, 077.

· Константы с плавающей точкой.

· PC – текущее значение программного счётчика (PC – ProgrammCounter).

Операторы

Ассемблер поддерживает ряд операторов, которые перечислены в табл. 1 (чем выше положение в таблице, тем выше приоритет оператора). Выражения могут заключаться в круглые скобки, такие выражения вычисляются перед выражениями за скобками.

Таблица 1

Прио-ритет Сим- вол Описание Пример
1 2 3 4
14 ! Логическое отрицание возвращает 1, если выражение равно 0, и наоборот ldi r16, !0xf0;В r16 загрузить 0x00
14 ~ Побитное отрицание возвращает выражение, в котором все биты проинвертированы ldi r16, ~0xf0 ; В r16 загрузить 0x0f
14 - Минус возвращает арифметическое отрицание выражения (унитарный минус) ldi r16,-2; Загрузить -2 (0xfe) в r16
13 * Умножение возвращает результат умножениядвух выражений ldi r30, label*2
13 / Деление возвращает целую часть результатаделения левого выражения на правое ldi r30, label/2
13 % Деление по модулю ldi r30,label%2; label делится по модулю 2
12 + Суммирование возвращает сумму двух выражений ldi r30, c1+c2
12 - Вычитание возвращает результат вычи-тания правого выражения из левого ldi r17, c1-c2
11 << Сдвиг влево возвращает левое выраже-ние,сдвинутое влево на число бит, указанное справа ldi r17, 1<<bit; В r17 загрузить 1, сдвину-тую влево bit раз
11 >> Сдвиг вправо возвращает левое выражение, сдвинутое вправо на число бит, указанное справа ldi r17, c1>>c2;В r17 загрузить c1, сдвину-тое вправо c2 раз
10 < Меньше чем возвращает 1, если левое выражение меньше, чем правое (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1<c2)+1
10 <= Меньше или равно: возвращает 1, если левое выражение равно или меньше, чем правое, (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1<=c2)+1
10 > Больше чем возвращает 1, если левое выражение больше, чем правое (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1>c2)+1
10 >= Больше или равно возвращает 1, если левое выражение равно или больше, чем правое (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1>=c2)+1
9 == Равно возвращает 1, если левое выражение равно правому (учитывается знак), и 0 в противном случае andi r19, bitmask*(c1==c2)+1
9 != Не равно возвращает 1, если левое выражение не равно правому (учитывается знак), и 0 в противном случае SET flag = (c1!=c2);Установить flag равным 1 или 0
8 & Побитное И возвращает результат побитового И выражений ldi r18, High(c1&c2)
7 ^ Побитное исключающее ИЛИ возвращает резуль-тат побитового исключающего ИЛИ выражений ldi r18, Low(c1^c2)
6 | Побитное ИЛИ возвращает результат побитового ИЛИ выражений ldi r18, Low(c1|c2)
5 && Логическое И возвращает 1, если оба выражения не равны нулю, и 0 в противном случае ldi r18, Low(c1&&c2)
4 || Логическое ИЛИ возвращает 1, если хотя бы одно выражение не равно нулю, и 0 в противном случае ldi r18, Low(c1||c2)
3 ? Условный оператор Синтаксис: Условие ? выражение1 : выражение 2 ldi r18, > b? a : b ; Загрузка в r18 большегочисла из двух чисел a и b

Функции

В Ассемблере определены следующие функции:

LOW(выражение) – возвращает младший байт выражения;

HIGH(выражение)       – возвращает второй байт выражения;

BYTE2(выражение)     – то же, что и функция HIGH;

BYTE3(выражение)     – возвращает третий байт выражения;

BYTE4(выражение)     – возвращает четвёртый байт выражения;

LWRD(выражение)      – возвращает биты 0-15 выражения;

HWRD(выражение)     – возвращает биты 16-31 выражения;

PAGE(выражение)       – возвращает биты 16-21 выражения;

EXP2(выражение)        – возвращает 2 в степени (выражение);

LOG2(выражение)       – возвращает целую часть log2(выражение).

Следующие функции определены только в AVRASM2:

INT (выражение)          – преобразовывает выражение с плавающей точкой в целое (т.е. отбрасывает дробную часть);

FRAC(выражение)       – выделяет дробную часть выражения с плавающей точкой (т.е. отбрасывает целую часть);

Q7(выражение)                         – преобразовывает выражение с плавающей точкой в форму пригодную для инструкций FMUL/FMULS/FMULSU (знак + 7-битовая дробная часть);

Q15(выражение)           – преобразовывает выражение с плавающей точкой в форму пригодную для инструкций FMUL/ FMULS/FMULSU (знак + 15-битовая дробная часть);

ABS( )                                        – возвращает абсолютную величину постоян-ного выражения;

DEFINED(символ)       – возвращает «истина», если символ прежде определен директивами .equ, .set или .def. Обычно используется вместе с директивами if (.ifdefined(foo)), но может быть использовано в любом контексте. В отличие от других функций DEFINED(символ) требует наличия круглых скобок вокруг своего аргумента.

Ассемблер AVRASM2 различает регистр символов (AVRASM не

различает).

 

6. Классификация ошибок в ППО МС

Логическая ошибка

Это, пожалуй, наиболее серьезная из всех ошибок. Когда написанная программа на любом языке компилирует и работает правильно, но выдает неправильный вывод, недостаток заключается в логике основного программирования. Это ошибка, которая была унаследована от недостатка в базовом алгоритме. Сама логика, на которой базируется вся программа, является ущербной. Чтобы найти решение такой ошибки нужно фундаментальное изменение алгоритма. Вам нужно начать копать в алгоритмическом уровне, чтобы сузить область поиска такой ошибки.

 Синтаксическая ошибка

 Каждый компьютерный язык, такой как C, Java, Perl и Python имеет специфический синтаксис, в котором будет написан код. Когда программист не придерживаться "грамматики" спецификациями компьютерного языка, возникнет ошибка синтаксиса. Такого рода ошибки легко устраняются на этапе компиляции.

Ошибка компиляции

 Компиляция это процесс, в котором программа, написанная на языке высокого уровня, преобразуется в машиночитаемую форму. Многие виды ошибок могут происходить на этом этапе, в том числе и синтаксические ошибки. Иногда, синтаксис исходного кода может быть безупречным, но ошибка компиляции все же может произойти. Это может быть связано с проблемами в самом компиляторе. Эти ошибки исправляются на стадии разработки.










Последнее изменение этой страницы: 2018-05-29; просмотров: 205.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...