Принципы построения многоуровневых сетей
1. Техническое задание
Техническое задание (ТЗ) на проектирование должно содержать
исчерпывающую и однозначную информацию о требованиях, предъявляемых к проекту.
Техническое задание является результатом внешнего проектирования и являет собой
объемный документ, в котором на естественном языке описана словесная модель
проектируемой системы и требования к ней. Несмотря на строгость и точность
формулировок ТЗ не дает однозначного описания объекта проектирования и не
позволяет непосредственно переходить от описания функционирования системы к ее
техническому воплощению.
1.1 Назначение устройства
Требуется написать программу для построения многоуровневой
модели сети на платформе лабораторного макета с микроконтроллером (МК) Аtmega128. Обязательными
объектами такой сети являются: компьютер, сеть, сервер, коммутатор и здание.
Основные функции - построение модели многоуровневых связных сетей и подсетей с
помощью Atmega128.
Входные/выходные параметры
Входные и выходные параметры определяются из задания.
Входными сигналами можно считать воздействие пользователя на кнопочную матрицу,
все воздействия делятся на три режима: режим меню, режим навигации и режим
линии. В режиме меню идет выбор активного элемента, в режиме навигации -
перемещение этого элемента по холсту или переход по уровням вложенности, в
режиме линии - соединение элементов между собой.
2. Техническое предложение
.1 Общий алгоритм решения задачи
Общий алгоритм решения задачи, описанной в техническом
задании, приведен на рисунке 2.1:
Рисунок 2.1 - Общий алгоритм решения задачи
.2 Выбор элементной базы
Требуемое устройство должно содержать следующие блоки:
¾ Микроконтроллер ATmega128;
¾ ЖК-дисплей с разрешением
не меньше 128х64 пикселя;
¾ Кнопки - 12 штук,
организованные в матрицу 3x4;
¾ Память - EEPROM 8192 x 8 бит.
3.
Эскизный проект
.1
Описание архитектуры проекта и выбранных блоков
Целью данного проекта является написание программы для
построения многоуровневой модели сети на платформе лабораторного макета с МК Atmega128. Необходимыми блоками
для реализации этой задачи являются: ЖК-дисплей, память, МК и блок кнопок.
Блок-схема лабораторного макета представлена на рисунке 3.1:
Рисунок 3.1 - Блок схема лабораторного макета
Сплошным контуром выделена часть устройства, которая
используется программой, а именно:
¾ Блок кнопок (БК) -
состоит из 12 кнопок организованных в матрицу 3х4 для подключения которой
требуется 3+4 (7) ЛВВ;
¾ Блок ЖК дисплея (БЖКД) -
содержит дисплей управляемый через шину I2C и подключаемый через две
ЛВВ;
¾ Блок памяти (БПам) -
содержит микросхему EEPROM памяти подключенную с помощью шины I2C. Особенностью шины
является возможность одновременного подключения нескольких устройств к одной и
той же шине;
¾ Блок программатора
(БПрог) - содержит в себе JTAG-совместимый программатор и подключается к МК
через JTAG интерфейс предусмотренный в МК;
¾ USB-RS232 преобразователь это
специальная микросхема которая служит мостом между шинами USB и RS232.
4. Технический проект
4.1 Характеристики основных частей лабораторного
макета
Микроконтроллер (ATmega128) - 8-разрядный AVR-микроконтроллер
с внутрисистемной программируемой флэш-памятью емкостью 128 кбайт построенный
на RISC-архитектуре (133 мощных инструкций, 32 8-разрядных регистров общего
назначения, регистры управления встроенной периферией, производительность до 16
млн. операций в секунду при тактовой частоте 16 МГц). Интерфейс JTAG
предоставляет возможности программирования флэш-памяти, ЭСППЗУ, предоставляет
множество функций встроенной отладки. Рабочее напряжение от 4.5 до 5.5В.
Память (EEPROM) - используется микросхема AT24C64 фирмы Atmel имеющая 8192х8 бит
памяти и работающая на шине I2C.
ЖК-дисплей (COG ЖК индикатор TIC149 фирмы Ampire) - имеет разрешение
133х64 и содержит кроме ЖК матрицы драйвер PCF8535 (управляемый по I2C шине)
фирмы Philips Semiconductors.
В качестве кнопок используются тактовые кнопки с размером
6х6х8мм.
JTAG-совместимый программатор - использует МК фирмы Atmel ATmega16, в который заранее записана
прошивка, позволяющая программировать основной микроконтроллер.
диаграмма микросхема интерфейс
5. Реализация
5.1 Интегрированная среда разработки
После длительного анализа различных сред и анализа требования
проекта была выбрана интегрированная среда разработки IAR Embedded Workbench
(рисунок 5.1), которая представляет собой очень мощный и удобный инструмент
программирования микроконтроллеров фирмы Atmel семейства AVR, включая Mega. Это
отладочная среда, которая работает под управлением Windows 95, 98, NT. В нее
входят компилятор с языка Си, ассемблер, компоновщик, и отладчик, при этом
возможно взаимодействие с внешними программами типа AVR Studio. Встроенный
редактор специально настроен на синтаксис языка Си, а дополнительные утилиты и
хорошая встроенная система помощи дополнительно облегчают написание программ.
Рисунок 5.1 - Внешний вид IAR Embedded Workbench
Одним из главных достоинств среды разрыбоки IAR Embedded
Workbench является один из лучших компиляторов Си по эффективности кода и
множество алгоритмов оптимизации предназначенных специально для
AVR-микроконтроллеров (что является очень важным параметром при работе с малым
объемом ресурсов памяти). Также к плюсам данной интегрированной среды
разработки можно отнести широкие возможности для симуляции и отладки проекта:
¾ Отладка в кодах Си и ассемблера;
¾ Различные точки останова;
¾ Язык описания периферии и
операций ввода/вывода;
¾ Просмотр областей CODE,
DATA, EEPROM и регистров ввода/вывода;
¾ Обработка прерываний с
предсказанием;
¾ Контроль любых переменных
и стека;
¾ Комплексные типы данных.
5.2 Настройки проекта
Для соединения программной части с технической и реализации
максимальной производительности необходимо правильно настроить проект.
Выбираем тип микроконтроллера (рисунок 5.2).
Рисунок 5.2 - Выбор микроконтроллера
Выделяем необходимый объем памяти стека - для хранения до
десяти холстов (таблиц размещения элементов). Необходимы нестойки наведены на
рисунке 5.3:
Рисунок 5.3 - Определения объема стека
В связи с малым количеством памяти - в настройках компилятора
выбираем максимальный уровень оптимизации, что наглядно показано на рисунке
5.4:
Рисунок 5.4 - Выбор максимальной оптимизации компилятора
Выбираем программатор JTAGICE для возможности программирования флэш-памяти
(рисунок 5.5).
Рисунок 5.5 - Выбор программатора
В настройках программатора JTAGICE выбираем порт, через
который будет осуществляться соединение с компьютером (рисунок 5.6).
Рисунок 5.6 - Выбор порта компьютера для соединения с
программатором
5.3 Меню и блок кнопок
Меню - представляет собой объект класса Menu, который отвечает за
предоставления выбора активного элемента. Вызов меню осуществляется в любой
момент нажатием на кнопку 10, при этом выводится приглашение выбрать активный
элемент. Доступными элементами меню являются: компьютер(computer), сеть(net), здание(building), сервер(server), линия (line), коммутатор(switch), курсор (pointer).
Все операции в программе делятся на три типа: opt_menu,
opt_navigation и opt_line; которые хранятся в файле operationType.h. Первый из них
переключает раскладку клавиш в режим «Меню» - каждая клавиша выступает номером
элемента меню. По нажатию на определенную клавишу создается выбранный элемент и
раскладка клавиш переход в режим «Навигация» (второй тип операций). В этом
режиме клавиши служат курсором, который помогает перемещать объект в заданное
место. Третий тип операций предназначен для рисования соединительной линии.
Для обработки нажатий клавиш создан метод Timer3_overflow
являющийся обработчиком по прерыванию. При каждом входе в функцию идет проверка
каждой стоки и каждого символа на нажатие. В соответствии от выбранного режима
клавиатуры осуществляется его обработка.
5.4 Система классов
Программа написана на языке Си с использованием таких
известных технологий как объектно-ориентированное программирование (ООП) и
паттерны проектирования. Часть программы написана с помощью классов, а часть с
помощью процедур. Все классы можно условно поделить на три категории: классы
для отображения сетевых объектов, классы для управления системой и классы для
взаимодействия с выбранным устройством.
Рассмотрим классы взаимодействия с выбранным устройством на
примере класса TIC_149 (рисунок 5.7), который предоставляет основные функции
для работы с ЖК-дисплеем:
¾ Инициализация (Init);
¾ Очистка ЖК-дисплея
(Clear);
¾ Вывод символов на
ЖК-дисплей (Print) - параметром передаем указатель на выводимою строку;
¾ Установка активного
курсора (SetStartPoint) - устанавливает начальную точку для прорисовки,
параметром является шестнадцатеричный символ отвечающий за ось абсцисс или за
ось ординат;
¾ Установка активного
холста (SetHolst) - установка таблицы отвечающей за расположение элементов на
определенном уровне. Параметром передается объект класса Holst. Концепция
холста и управления уровнями вложенности будет рассмотрена ниже;
¾ Получение активного
холста (GetHolst) - данная функция возвращает указатель на текущий активный холст;
¾ Изменение расположения
активного курсора на одну клетку вверх (goUp);
¾ Изменение расположения
активного курсора на одну клетку вправо (goRight);
¾ Изменение расположения
активного курсора на одну клетку вниз (goDown);
¾ Изменение расположения
активного курсора на одну клетку влево (goLeft).
Рисунок 5.7 - UML диаграмма класса TIC_149
Данный класс построен с использованием паттерна одиночка «Singleton» - который обеспечивает
единственность объекта класса в которым он используется. Для реализации данного
паттерна в защищенной части класса был создан статический объект с типом этого
же класса и определен конструктор, а в открытую часть был добавлен статический
метод GetDisplay, который по запросу всегда возвращает указатель на
единственный объект этого класса.
Пример получения объекта дисплея:
_149* display = TIC_149::GetDisplay();
Рассмотрим более подробно некоторые из методов класса
TIC_149:
Инициализация (Init) - с помощью функций TWI (функции работы с шиной I2C) осуществляется задание
основных настроек ЖК-дисплея - установка режима отображения,
включение/выключение зеркал, установка умножителя частоты, яркости,
температуры, начальных точек по оси абсцисс и оси ординат.
Очистка экрана (Clear) - с помощью функций TWI сначала задается первая
точка заполнения и в цикле 1064 раза подается сигнал 0x00.
Вывод символов на ЖК-дисплей (Print) - данный метод после
задания первой точки заполнения в цикле выводит каждый символ. Для этого в
массиве font (массив с шестнадцатеричным указанием каждого из байтов
определенного символа) указывается смещение относительно первого символа.
for(i=0; i< n; i++)(j=0; j<6;
j++)_write(font[(*(string+i))*6 + j]);
Функция прорисовки (Draw) - вызывает два метода класса Holst - для установки координат
активного элемента или курсора и для подачи сигнала на прорисовку холста.
Функции управления движением активного курсора (goUp, goRight, goDown, goLeft). Весь экран разделен на
клетки - 8 по высоте и 10 по ширине.
Разделение экрана на клетки с шестнадцатеричным обозначением
каждого из адресов изображено на рисунке 5.8:
Рисунок 5.8 - Адресация в ЖК-дисплее
.4.2 Классы управления системой
К классу управления системой нужно отнести класс Holst - предназначенный для хранения и
управления всеми элементами сети и подсети. Общая структура класса изображена
на рисунке 5.9:
Рисунок 5.9 - UML диаграмма
классов управления содержимым ЖК-дисплея
Рассмотрение структуры классов управления содержимым ЖК-дисплея
начнем с рассмотрения класса HolstTable -
предназначенного для хранения и обработки таблицы типов элементов расположенных
на определенном уровне. Он хранит матрицу 10х8 каждый элемент который определен
типом char и занимает ровно 1 байт в памяти - это
было сделано для экономии памяти устройства. Также он поддерживает следующие
методы:
¾ GetElement - получение
типа сетевого объекта по его координатам заданных в десятеричной системе;
¾ SetElement - размещение
элемента на таблице. Параметрами метода выступают координаты размещаемого
объекта и его тип;
¾ GetCurrentID - получение
текущего идентификатора таблицы (необходимо для реализации вложенности);
¾ SetCurrentID - задание
текущего идентификатора таблицы (вызывается холстом при создании новой подсети)
Класс Holst содержит множество методов для управления
содержимым ЖК-дисплея большинство из которых взаимодействуют с объектами класса
HolstTable. Рассмотрим каждый из
методов класса Holst подробно:
¾ SetActiveElement -
установка активного элемента, т.е. элемента который в текущий момент можно
перемещать или размещать на матрице. Параметром передается указатель на Element, что означает, что мы
можем передавать в данный метод любой из сетевых объектов;
¾ SetActiveElementCoord -
установка текущих координат активного элемента;
¾ GetActiveElementX - метод
возвращает значение координаты текущего элемента по оси абсцисс;
¾ GetActiveElementY - метод
возвращает значение координаты текущего элемента по оси ординат;
¾ GetHolstElement - метод
возвращает тип элемента расположенного по заданным координатам. При этом
используется вызов метода поиска сетевого элемента по координатам у объекта
класса HolstTable;
¾ GetTypeOfActiveElement -
получения типа активного элемента;
¾ AddActiveElementOnHolst -
метод добавляет активный элемент по текущим координатам на холст, использую
вызов метода записи в объекта класса HolstTable;
¾ SetCurrentID - установка
идентификатора текущей таблицы;
¾ GetCurrentID - получение
идентификатора текущей таблицы;
¾ SetBuilding - установка
бинарного параметра указывающего на уровень сети (верхний уровень или
подуровень);
¾ FindBuilding -
определение номера здания по его текущим координатам, параметром кроме
координат объекта, также передается номер уровня;
¾ FindParent - определение
идентификатора родительского уровня. Параметром передается идентификатор
текущего уровня;
¾ GetHolst - получение
таблицы сетевых элементов. Метод возвращает обьект типа HolstTable.
Используется для сохранения текущего холста при переходе на новый уровень;
¾ SetHolst - установка
таблицы сетевых элементов. Используется для перехода по уровням сети;
¾ Draw - перерисовка
холста. При проходе в цикле таблицы холста проверяется наличие элемента в
ячейке, если объект обнаружен - вызывается виртуальный метод GetType - который
возвращает тип найденного объекта. Далее создаем объект заданного типа и
вызываем у него метод Draw, после чего удаляем созданный объект. Данная
технология позволила сэкономить огромное количество памяти, что является
жизненно необходимым требованием для бесперебойной и правильной работы
программы. Также эта технология дала возможность сделать вложенность сетей до
девятого уровня.
.4.3 Классы отображения сетевых объектов
Родительским классом для всех сетевых объектов является класс
Element, который содержит в себе
две виртуальные функции - функцию прорисовки элемента и функцию получения типа
производного класса. Все классы сетевых объектов переопределяют эти два метода,
что наглядно продемонстрировано на рисунке 5.10:
Рисунок 5.10 - UML диаграмма связей сетевых объектов
Функция для получения типа (GetType) - возвращает один
шестнадцатеричный символ, который соответствует текущему типу обьекта. Все типы
хранятся в файле elementType.h в форме препроцессорных директив define. Типы сетевых элементов
с их описанием наведены в таблице 5.1:
Таблица 5.1 - Типы сетевых элементов
Обозначение
|
Символ
|
Описание
|
|
t_computer
|
1
|
Компьютер
|
|
t_net
|
2
|
Сеть
|
|
Обозначение
|
Символ
|
Описание
|
t_building
|
Здание
|
t_server
|
4
|
Сервер
|
t_switch
|
5
|
Коммутатор
|
t_out
|
9
|
Объект «Выход»
из подсети (здания)
|
t_pointer
|
6
|
Указатель
|
lt_fpoint
|
11
|
Указатель для
определения начальной точки соединительной линии
|
lt_lpoint
|
12
|
Указатель на
определение последней точки соединительной линии
|
lt_horizontal
|
13
|
Горизонтальная
линия
|
lt_vertical
|
14
|
Вертикальная
линия
|
lt_left_bottom
|
15
|
Угол - с лева
вниз
|
lt_right_bottom
|
16
|
Угол - с права
вниз
|
lt_right_top
|
17
|
Угол - с права
вверх
|
lt_left_top
|
18
|
Угол - с лева
вверх
|
lt_crosswise
|
19
|
Пересечение
линий «перекресток»
|
lt_vertical_left
|
20
|
Соединительный
элемент для трех линий - сверху, снизу и слева
|
lt_horizontal_bottom
|
21
|
Соединительный
элемент для трех линий - снизу, слева и справа
|
lt_vertical_right
|
22
|
Соединительный
элемент для трех линий - сверху, снизу и справа
|
lt_horizontal_top
|
23
|
Соединительный
элемент для трех линий - сверху, слева и справа
|
Класс Line кроме всего прочего имеет метод SetLineType который задает линии
определенное значение - символы с одиннадцатого по двадцать третий из таблицы
5.1. Все типы линии с их шестнадцатеричной матрицей наведены в таблице 5.2:
Таблица 5.2 - Типы соединительной линии
Обозначение
|
Изображение
|
Шестнадцатеричная
матрица
|
|
lt_fpoint
|
0x00, 0x00, 0x18, 0x66, 0x42, 0x81, 0x81, 0x42, 0x66, 0x18, 0x00, 0x00
|
|
|
lt_lpoint
|
0x00, 0x00, 0x00, 0x00, 0x24, 0x18,
0x18, 0x24, 0x00, 0x00, 0x00, 0x00
|
|
|
lt_horizontal
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08
|
|
|
lt_vertical
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
|
|
|
lt_left_bottom
|
0x08, 0x08, 0x08, 0x08, 0x08, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
|
lt_right_bottom
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08
|
|
|
lt_right_top
|
|
|
Обозначение
|
Изображение
|
Шестнадцатеричная
матрица
|
lt_left_top
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x0F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
lt_crosswise
|
0x08, 0x08, 0x08, 0x08, 0x08, 0xFF,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08
|
|
lt_vertical_left
|
0x08, 0x08, 0x08, 0x08, 0x08, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
lt_horizontal_bottom
|
0x08, 0x08, 0x08, 0x08, 0x08, 0xF8,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08
|
|
lt_vertical_right
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08
|
|
lt_horizontal_top
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x0F,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08
|
|
|
|
|
|
|
|
5.5 Уровни вложенности
Для организации системы вложенности в файле взаимодействия с
клавиатурой keyboard.c
производится выделение памяти необходимое для десяти уровней вложенности. При
размещении на холсте объекта «здание» осуществляется присвоение ему уникального
номера подсети. Количество объектов «здание» ограничено десятью элементами,
т.к. каждый такой уровень требует большое количество памяти для хранения
объектов подсети. Для перехода на подуровень необходимо в режиме «курсор»
навести указатель на объект «здание» и нажать на кнопку 5.
Если мы находимся на подуровне - то в левом верхнем углу
автоматично создается объект класса out. Он соединяет подуровни и предназначен для
перехода на один уровень вверх - по щелчку на нем.
Алгоритм перехода по подуровням изображен на рисунке 5.11:
Рисунок 5.11 - Алгоритм перехода по подуровням
5.6 Инструкция пользователя
1. Подключить устройство к компьютеру с помощью USB кабеля
2. Выбрать номер нужного объекта с меню и нажать его на
клавиатуре.