Система разработки приложений. Автор: Абашин Анатолий Валентинович 05.11.07 [email protected] Буду признателен за замечания и мнения 1. Цель создания "Системы разработки приложений" Главной целью создания "Системы разработки приложений" является повышение качества разработки и ее ускорение за счет: - жесткой структуризации разрабатываемого ПО; - обеспечения переносимости ПО (на уровне исходного кода) на разные аппаратные платформы; - унификации используемых подходов при разработке ПО; - многократное использование один раз написанного и отлаженного кода без каких-либо существенных (или вообще без) изменений в нем; - возможность параллельной и достаточно независимой разработки за счет формализации интерфейсов взаимодействия между уровнями; - возможность специализации разработчиков при разработке ПО; - исключение дублирования разработки одних и тех же компонент различными разработчиками; - возможность независимой коррекции и оптимизации отдельных модулей, не затрагивая основного алгоритма функционирования; - существенного ускорения разработки за счет возможности использования для разработки платформы на базе персонального компьютера. 1 2. Структура 2.1. Типовая структура терминала в одноаппликационном варианте имеет следующий вид: Терминал h – файлы ядра Ядро приложения Уровень приложения Библиотека сервисных функций вводавывода h – файлы библиотеки и Библиотека сервисных функций h – файлы библиотеки Уровень библиотек (сервисные функции) Драйвера высокого уровня h – файлы драйверов высокого уровня Уровень прикладных драйверов h – файлы Драйвера нижнего уровня Техническая платформа (аппаратная часть) Аппаратная платформа Уровень операционной системы (системное ПО) 1. Устройства ввода-вывода ( дисплей, клавиатура, порты, картридеры и т.д.) 2. Система хранения данных Уровень аппаратуры 2 2.2. Уровни. Всего в данной модели можно выделить 5 основных уровней. Это (снизу вверх) уровень аппаратуры, ОС (системного ПО), прикладных драйверов, библиотек (сервисных функций) и то главное, что и реализует заданную функциональность терминала, а именно приложения (аппликации). 2.2.1. Уровень аппаратуры. Для разработчика ПО интересен прежде всего наличием и типом устройств ввода-вывода, а также способом хранения данных. Немаловажным фактором конечно являются и такие показатели, как объем памяти для данных и кода, а также производительность процессора. Однако на сегодня актуальность этих параметров существенно снизилась, поскольку предоставляемые в распоряжение разработчика ПО ресурсы как правило заведомо превышают требуемые для решения конкретной задачи, а производительный 32-х разрядный процессор позволяет реализовать достаточно сложные алгоритмы при обработке информации, недостижимые в старых устройствах, построенных на 8-разрядных процессорах. 2.2.2. Уровень операционной системы (системного ПО) – это то, с чем разработчик прикладного ПО работает, когда ему необходимо выполнить те или иные операции ввода-вывода. Однако в разных терминалах интерфейс этого уровня сильно различается от производителя к производителю. Но, не смотря на разный синтаксис вызовов, можно выделить основные функции, которые в том или ином виде имеются в системном ПО всех терминалов. Да, они реализованы по разному и имеют разные вызовы, но они есть. Это сканирование нажатие клавиш, отображение информации на дисплее, прием и передача через порты ввода-вывода, обмен с чип-картой, чтение магнитной карты и т.д. Однако, кроме этих необходимых функций, в системном ПО терминала имеется множество других (сервисных) функций, которые никаким образом не корелируют с подобными функциями от других производителей. Понятно, что если стоит задача создания переносимого приложения, использовать их нельзя. Уровень аппаратуры и уровень операционной системы – это как раз то, что сегодня производители терминалов предоставляют пользователю, иными словами терминал без аппликации (аппликаций). Далее (выше) следует программная прикладная часть. Как правило разработчик прикладного ПО непосредственно использует вызовы системного ПО, что делает в итоге прикладную программу трудно, а иногда вообще не переносимой на другую аппаратную платформу. Для того, чтобы обеспечить переносимость, нельзя использовать системные вызовы какоголибо конкретного терминала непосредственно из прикладной задачи. Вместо этого это необходимо делать только через промежуточные функции драйверов высокого уровня. 3 2.2.3. Уровень прикладных драйверов является тем промежуточным звеном, которое позволяет отделить прикладную задачу от аппаратной реализации. Иными словами – везде в прикладной задаче присутствуют вызовы только функций из библиотеки прикладных драйверов, которые в свою очередь вызывают функции системного ПО для данного типа терминала. Для того, чтобы перенести приложение на другую платформу, необходимо переписать только данный уровень. То есть это аппаратнозависимое ПО, опирающиеся на системное ПО терминала с одной стороны, и предоставляющее сервис более высоким уровням, с другой. На самом деле задача несколько более сложная, чем представляется вначале. Это связано с видом хранения данных (как глобальные переменные, в виде файлов и т.д.), а также тем, что размеры экрана (в пикселях) могут сильно различаться или быть вообще текстовыми. И все эти особенности необходимо предусмотреть. 2.2.4. Уровень библиотек (сервисных функций) реализует необходимый и полезный дополнительный сервис, например такой, как функции организации экранного меню, ввода информации с экрана, строчной арифметики и т.д. В идеале – это аппаратно-независимое и функциональнонезависимое (в смысле реализации основного алгоритма) ПО. Кроме того, на этом уровне необходимо реализовать промежуточные функции ввода-вывода более высокого уровня, чем на уровне прикладных драйверов, которые работают не с физическими, а с логическими абстракциями (например вывести не на первую строку, а на "верхнюю", не на четвертую, а на "нижнюю", произвести печать не "24"-м шрифтом, а "нормальным" и т.д.), что позволит отделить прикладную задачу (аппликацию) уже от технических характеристик терминала. 2.2.5. Уровень приложения реализует необходимую функциональность устройства и должно быть аппаратно-независимым (на уровне исходного кода). В ядре приложения не должно быть каких-либо сервисных и иных "универсальных" обработчиков, не связанных с выполнением основного алгоритма. Иными словами – ядро – это функционально-зависимое и аппаратно-независимое ПО. 2.3. Драйвера высокого уровня имеют следующий состав: (предварительный список, требует уточнения, дополнения и систематизации) 2.3.1. Считывание кода клавиши без ожидания нажатия. 2.3.2. Выдача строки символов на дисплей, когда номер строки определен цифровым (жестким) идентификатором (на первую строку, на вторую строку и т.д.). 2.3.3. Выдача строки символов на печать, когда фонт символов определен цифровым (жестким) идентификатором (16 символов в строке, 24 символа в строке и т.д.). 4 2.3.3. Запись в порт RS-232 одного символа. 2.3.4. Чтение из порта RS-232 одного символа. 2.3.5. Чтение системных даты и времени. 2.3.6. Запись системных даты и времени. 2.3.7. Установка сигнала cts на порте RS-232. 2.3.8. Чтение сигнала rts на порте RS-232. 2.3.9. Чтение магнитной карты без ожидания факта считывания. 2.3.10. Работа с чип-картой и SAM-модулем (проверка в наличия карты и т.д. – необходима полная спецификаця). 2.3.11. Работа с проводным модемом (инициализация, набор номера, чтениезапись – необходима полная спецификаця). 2.3.12. Работа с GPRS (необходима полная спецификаця). 2.3.13. Реализация "малого" тайм-аута (до 1000 млс). 2.3.14. Выдача звукового сигнала. 2.3.15. Инициализация порта RS-232 заданными параметрами (скорость, битность и т.д.) ........................................................................................ 2.4. Библиотека сервисных функций состоит из двух библиотек: - библиотека сервисных функций ввода-вывода; - библиотека сервисных функций (не связанных с функциями ввода-вывода). 2.4.1. Библиотека сервисных функций ввода-вывода имеет следующий состав: (предварительный список, требует уточнения, дополнения и систематизации) 2.4.1.1. Считывание кода клавиши с ожиданием нажатия. 2.4.1.2. Выдача строки символов на дисплей, когда номер строки определен логическим идентификатором (на верхнюю строку, на нижнюю строку, на среднюю строку и т.д.). 2.4.1.3. Очистка всего дисплея 2.4.1.4. Очистка заданного диапазона строк дисплея, когда диапазон номеров строк определен цифровым (жестким) идентификатором. 2.4.1.5. Очистка заданного диапазона строк дисплея, когда диапазон номеров строк определен логическим идентификатором. 2.4.1.6. Выдача строки символов на печать, когда фонт символов определен логическим идентификатором (жирный шрифт, нормальный шрифт, сжатый шрифт и т.д.). 2.4.1.7. Ожидание события чтения магнитной карты или вставки чиповой. 2.4.1.8. Запись в порт RS-232 заданного количества символов. 2.4.1.9. Чтение из порта RS-232 группы символов. 2.4.1.10. Очистка порта RS-232. 2.4.1.11. Ввод даты и времени с клавиатуры и запись введенного значения (с проверкой корректности введенных данных). 2.4.1.12. Реализация "большого" тайм-аута (свыше 1000 млс). 2.4.1.13. Ожидание истечения заданного промежутка времени. 5 2.4.1.14. Прогон бумаги в принтере на заданное количество строк. 2.4.1.15. Печать верхнего заголовка. 2.4.1.16. Печать нижнего заголовка. 2.4.1.17. Печать строки с автоматическим определением фонта печати. 2.4.1.18. Печать строки с автоматическим центрированием. 2.4.1.19. Печать строк типа "-----------------------", "*************" и т.д. 2.4.1.20. Печать суммы, кода авторизации, номера карты с/без маскирования и т.д. 2.4.1.21. Ввод строки цифровых символов в заданной строке заданной длины строго или нет. 2.4.1.22. Ввод строки цифровых символов в заданной строке с лидирующим текстовым сообщением заданной длины строго или нет. 2.4.1.23. Ввод строки алфавитных символов в заданной строке заданной длины строго или нет. 2.4.1.24. Реализация меню. Выбор из 2-х пунктов с указанием строки выдачи верхней строки. 2.4.1.25. Реализация меню. Выбор из 3-х и более пунктов с указанием строки выдачи верхней строки. 2.4.1.26. Ввод суммы запроса заданной разрядности в заданной строке. 2.4.1.27. Чтение магнитной карты c ожиданием события. .............................................................................. 2.4.2. Библиотека сервисных функций (не связанных с функциями вводавывода) имеет следующий состав: (предварительный список, требует уточнения, дополнения и систематизации) 2.4.2.1. Преобразование строки символов из DOS-кодировки в WINкодировку. 2.4.2.2. Преобразование строки символов из WIN-кодировки в DOSкодировку. 2.4.2.3. Функции строчной арифметики. 2.4.2.4. Функции вычисления контрольных сумм. ..................................................................................... 2.4.3. Модуль сервисно-тестовых операций может быть использован для оперативного тестирования работоспособности принтера, экрана, клавиатуры, портов и т.д. (на схеме отсутствует). 3. Компьютерный имитатор терминала Предлагаемый подход, кроме всего вышеперечисленного, обладает еще одним неоспоримым преимуществом - возможностью вести разработку основой части ПО на компьютере с использованием достаточно удобных систем программирования таких как, например, Bilder от Borland. 6 Для этого прежде всего необходимо иметь некоторую оболочку-экранную форму, на которой будет имитироваться вывод на экран и принтер. В качестве источника времени можно использовать текущее время компьютера. Ввод с клавиатуры можно имитировать вводом с компьютерной клавиатуры, логически назначив клавишам терминала клавиши на компьютерной клавиатуре. Компьютерный имитатор терминала Эмулятор h – файлы ядра Ядро приложения Уровень приложения Библиотека сервисных функций вводавывода h – файлы библиотеки и Библиотека сервисных функций h – файлы библиотеки Уровень библиотек (сервисные функции) Драйвера высокого уровня h – файлы драйверов высокого уровня Уровень прикладных драйверов Эмулятор терминала Эмулятор устройств ввода-вывода Эмулятор хранения данных Клавиатура Порты ввода-вывода ……………………………. ……………………………. Уровень всевдо-аппаратуры Сложнее дело обстоит с ридерами карт, хотя подключение магнитного считывателя по RS-232 или "в разрыв клавиатуры" особых проблем не представляет. Сложнее с чип-ридером, но об этом в разделе 4. 7 С портами RS-232 также все понятно – достаточно, как и в случае с клавиатурой, обеспечить логическое соответствие между портами терминала и портами компьютера. Но, поскольку в настоящее время порты RS-232 на компьютерах не пользуются популярностью, может оказаться, что их количества недостаточно. Однако это легко решается установкой платырасширения с несколькими дополнительными портами. Хранение данных также не представляет особых трудностей. Если в терминале используется файловая система – то ее можно имитировать путем использования компьютерны" файлов. Их же можно использовать для имитации хранения данных в EEPROM. Аналогично можно организовать сохранение глобальных переменных (в случае использования в терминале ОЗУ с батарейным питанием). В этом случае при "выключении" терминала (на имитаторе) происходит запись всех глобальных переменных в файл, а при "включении" – их считывание. Вместе с тем, при всей привлекательности такого решения, когда разработку прикладного ПО можно вести еще до того, как появится реальное "железо", в ряде случаев он не может полностью заменить реальный терминал. Это прежде всего обусловлено тем, что временные соотношения в имитаторе на компьютере и реальном терминале могут сильно отличаться. Но основное – это конечно использование чип-ридера (и SAM-модулей). 4. Компьютерно-терминанальный имитатор Предлагаемое решение в наибольшей степени соответствует реальному функционированию, но при этом сохраняются все достоинства компьютерного имитатора. Смысл предлагаемого решения заключается в том, что в качестве всех устройств ввода-вывода используется реальный терминал, а в качестве процессорного модуля – компьютерный имитатор, которые соединины между собой по RS-323. Подобная система очень похожа на существующие, однако тут надо подчеркнуть, что прикладная программа выполняется именно в компьютере, а не в терминале, а последний выступает только в роли набора устройств ввода-вывода – то есть фактически в роли толстого клиента. В данном решении может возникнуть естественный вопрос – а возможно ли это и будет ли это решение функционировать? Реальная система на данном принципе показала, что даже при скорости порта RS-232 в 9600, задержка между нажатием клавиши и отображением результата на дисплее не превышала комфортного значения (на вскидку не более 70-100млс). Повысив скорость порта можно существенно снизить ее еще больше. В принципе возможен и вариант, являющийся комбинацией чисто компьютерного имитатора и данного решения, когда часть устройств вводавывода имитируются на компьютере, а частично используются устройства реального терминала, и в первую очередь чип-ридер. Мне представляется оптимальным именно такой комбинированный вариант. 8 Структура компьютерно-терминанального имитатора Эмулятор h – файлы ядра Ядро приложения Уровень приложения Библиотека сервисных функций вводавывода h – файлы библиотеки и Библиотека сервисных функций h – файлы библиотеки Уровень библиотек (сервисные функции) ь Драйвера высокого уровня h – файлы драйверов высокого уровня Уровень прикладных драйверов Преобразователь в/из протокол обмена по RS-232 RS-232 Терминал Преобразователь в/из протокол обмена по RS-232 h – файлы Драйвера нижнего уровня Аппаратная платформа Уровень операционной системы (системное ПО) Техническая платформа (аппаратная часть) 1. Устройства ввода-вывода ( дисплей, клавиатура, порты, картридеры и т.д.) 2. Система хранения данных Уровень аппаратуры 9