77206

Разработка программного обеспечения системы программно-аппаратной защиты ПО

Курсовая

Коммуникация, связь, радиоэлектроника и цифровые приборы

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

Русский

2015-02-02

381.5 KB

5 чел.

Руководитель: Татищев Виктор Владимирович, ведущий инженер, ЗАО “Ланит-Терком”

Выполнил: Теплых Дарья Анатольевна, группа 444, 2009 год

Курсовая работа, Кафедра системного программирования СПбГУ

Тема: Разработка программного обеспечения системы программно-аппаратной защиты ПО

Система программно-аппаратной защиты ПО

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

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

Шифрование исполняемого кода

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

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

Существующие методы защиты шифрованием исполняемого кода основаны на следующих тезисах:

  1.  В исполняемом файле секции данных и кода находятся в одном адресном пространстве, поэтому мы можем работать с секцией кода как с данными.
  2.  Мы можем ввести в исполняемый код программы (в момент разработки) некоторое количество однозначно воспринимаемых меток, позволяющих ограничить некоторые блоки исполняемого кода на момент его разработки. Практическим путем установлено, что метка имеющая длину не менее 15 байт воспринимается однозначно и вероятность совпадения этой метки с некоторой последовательностью байт в двоичном коде исполняемого файла практически равна 0.
  3.  Мы можем, зная структуру исполняемого файла (например, PE или PE64 ОС Windows) можем внедрять в него функции шифрации и дешифрации с последующим изменением данных в структуре исполняемого файла в соответствии с изменениями.

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

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

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


Алгоритм работы комплекса:

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

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

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

  1.  Аппаратная часть комплекса – это устройство, подключаемое через USB порт компьютера и реализующее алгоритмы шифрования/дешифрования.

Основные возможности реализации защиты можно разделить на:

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

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

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

Будет разработано два варианта аппаратной части защиты.

Первый вариант более прост в разработке и более дешевый. Он основан на микроконтроллере с DSP инструкциями в ядре (так называемом цифровом сигнальном контроллере). Для данного варианта был выбран DSC dsPIC30F6010. Данный контроллер имеет быстродействие до 40 MIPS, 40-разрядные АЛУ, все DSP инструкции за 1 такт, сдвиг на 16 бит – за один такт. Для реализации USB интерфейсов обоих направлений используется USB приемо-передатчик STUSB03E. Этот приемо-передатчик имеет встроенный регулятор напряжения 5В/3.3В и детектор сигнального уровня на линиях.

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

Реализация аппаратной части защиты.

Основные показатели устройства:

  1.  Ядром повышенного быстродействия, способного производить операции шифрования/дешифрования за время (100 – (tпрд + tпрм)) миллисекунд, где 100 ms – это наибольшая задержка, которую можно внести в программу, tпрд – это время передачи блока устройству, tпрм – это время передачи дешифрованного блока от устройства в программу.
  2.  Интерфейсом USB 2.0.
  3.  Габаритами не более 100х30х20 мм.
  4.  Стоимость изготовления изделия не должна превышать $250 – $300.

 

В связи с этим в качестве реализации ядра криптопроцессора выбрана CPLD MAX-II EPM570GM100C5N фирмы Altera. Данная CPLD имеет 570 логических элементов, 1.8В напряжения питания ядра, 4 наносекундную задержку (pin-to-pin). Есть возможность реализации на ее базе нескольких алгоритмов шифрования и/или хранения с управлением по USB интерфейсу.

Обзор современных микроконтроллеров с интерфейсом USB

микроконтроллер

габарит

Разрядность АЛУ (bit)

Ток (mA)

Диапазон напряжения (V)

Мощность (mW)

цена

ST7SCR1R4

TQFP 64 16x16x1.6 mm

8

15

4.0 - 5.5

40 – 82.5

$12.7

AT90USB82

QFN32 5x5x0.8 - 5x5x1 mm

TQFP32 9x9x1.2 mm

32

25 - 30

2.7 - 5.5

67.5 - 165

$1.95, $ 2.04

PIC18F2450

QFN 28 6x6х0.8 - 6x6х1 mm

8

250 - 300

2.0 - 5.5

500 - 1650

$3.32, $3.35

PIC18F4550

TQFP44 12x12x1.2mm

QFN44 8x8x0.8 - 8x8x1 mm

8

250 - 300

2.0- 5.5

500 - 1650

$4.38-4.64

ATmega16U4/ATmega32U4

QFN44 7x7x1 mm   TQFP44 12x12x1.20mm

32

18

2.7 - 5.5

48.6 - 99

$2.48, $3.57

ATmega32U6/AT90USB128

TQFP64 16x16x1.20 mm QFN64 9x9x0.8 – 9x9x1.0 mm

32

30

2.7 - 5.5

81 - 165

$3.43, $3.37/ $2.7, $3.5

Из данного набора микроконтроллеров для стартапа проекта по разработке системы программно-аппаратной защиты ПО был выбран микроконтроллер AT90USB1287.

Описание микроконтроллера AT90USB1287

AT90USB128 — экономичный 8-разрядный КМОП-микроконтроллер, выполненный на основе высокоэффективной архитектуры AVR RISC. За счет выполнения большинства инструкций за один период синхронизации микроконтроллер AT90USB128 достигает производительности 1 миллион операций в секунду на 1 МГц тактовой частоты, что позволяет разработчикам оптимизировать соотношение потребляемой мощности и быстродействия.

Ядро AVR сочетает обширный набор инструкций с 32 регистрами общего назначения. Все 32 регистра непосредственно подключены к арифметико-логическому устройству (АЛУ), что позволяет указывать в одной инструкции одновременно два регистра и выполнять такую инструкцию за один период синхронизации. Результирующая архитектура является более эффективной и позволяет на порядок повысить производительность относительно традиционных CISC-микроконтроллеров.

Микроконтроллер AT90USB128 содержит следующие компоненты: 64/128 кбайт внутрисистемно-программируемой флэш-памяти с возможностями чтения во время записи, 2/4 кбайт EEPROM(electrically erasable programmable read-only memory), 4/8 кбайт SRAM(статического ОЗУ), 48 линий ввода-вывода общего назначения, 32 рабочих регистра общего назначения, счетчик реального времени, четыре конфигурируемых таймера-счетчика с режимами сравнения и ШИМ (широтно-импульсная модуляция), один USARP(универсальный синхронно-асинхронный приемопередатчик), байт-ориентированный 2-проводной последовательный интерфейс, 8-канальный 10-разрядный АЦП с опциональным дифференциальным входным каскадом (поддерживает программирование усиления), программируемый сторожевой таймер с отдельным внутренним генератором, последовательный порт SPI, интерфейс JTAG (совместим со стандартом IEEE 1149.1 и используется для программирования, граничного сканирования и доступа к встроенной отладочной системе). Кроме того, микроконтроллеры могут быть переведены в один из шести экономичных режимов работы.

Микроконтроллеры выпускаются по технологии высокоплотной энергонезависимой памяти компании Atmel. Механизм программирования встроенной флэш-памяти позволяет перепрограммировать ее внутрисистемно через последовательный интерфейс SPI с помощью обычного программатора энергонезависимой памяти или с помощью встроенной загрузочной программы, выполняемой ядром AVR. Загрузочная программа может использовать любой интерфейс для загрузки программного кода во флэш-память. За счет разделения флэш-памяти на загрузочный сектор и сектор прикладной программы поддерживается действительная возможность чтения во время записи, когда загрузочный код продолжает исполняться и выполняется обновление сектора прикладной программы. Сочетание 8-разрядного RISC ЦПУ с внутрисистемно самопрограммируемой флэш-памятью в одном кристалле делает микроконтроллеры Atmel AT90USB128 мощным инструментом для эффективного и выгодного в стоимостном плане решения задач встраиваемого управления.

Микроконтроллеры AT90USB128 поддерживаются полным набором программ и средствами для проектирования, в том числе: Си-компиляторы, макроассемблеры, программные отладчики/симуляторы, внутрисхемные эмуляторы и оценочные наборы.

Разработка базового ПО

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

В данной задаче необходимо инициализировать следующие аппаратные интерфейсы:

1. Последовательный порт

2. USB интерфейс

3. Интерфейс взаимодействия с Flash-memory.

Последовательный порт

Универсальный синхронно-асинхронный последовательный приемопередатчик (USART) является очень гибким последовательным устройством связи. Основные свойства:

  •  Дуплексный режим (независимые последовательные регистры приема и передачи)
  •  Асинхронный или синхронный режим
  •  Главный и подчиненный режим синхронизации тактового импульса
  •  Высокое разрешение контроллера скорости передачи  
  •  Поддерживает серийные фреймы с 5, 6, 7, 8 и 9 битами данных и 1 или 2 стоповыми битами
  •  Четное или нечетное формирование сигнала четности и аппаратная поддержка проверки четности
  •  Обнаружение переполнения данных
  •  Обнаружение ошибки кадрирования
  •  Фильтрация шума, включающая обнаружение неправильного стартового бита и цифровой фильтр нижних частот
  •  Три отдельных прерывания на ТХ завершении, ТХ занятости регистра данных и RX завершении
  •  Мультипроцессорный режим связи
  •  Двухскоростной асинхронный режим связи

Краткое описание

Явная блочная диаграмма USART передатчика показана на схеме 1. Доступные центральному процессору регистры ввода/вывода и ножки ввода/выхода выделены жирным.

Схема 1 Блочная диаграмма USART

Пунктирные прямоугольники на блочной диаграмме разделяют три основных части USART(перечислим сверху вниз): тактовый генератор, передатчик (отправитель) и приёмник (получатель). Управляющие регистры разделены между всеми модулями. Логика тактовой генерации состоит из логики синхронизации для внешнего входа синхронизации используемого синхронным подчиненным режимом и контроллера скорости передачи. Вывод XCKn (синхронизация передачи) используется только режимом синхронной передачи. Передатчик состоит из отдельного буфера записи, последовательного регистра сдвига, генератора четности и логической схемы управления для управления различными форматами последовательных фреймов. Буфер записи позволяет непрерывную передачу данных без какой-либо задержки между фреймами. Получатель - наиболее сложная часть модуля USART из-за модуля восстановления данных и модуля установления синхронизации после сбоя. Элементы восстановления используются для асинхронного приема данных. Кроме того приёмник включает в себя устройство контроля по четности, управляющую логику, регистр сдвига и двухуровневый приемный буфер (UDRn). Приёмник поддерживает тот же самый фреймовый формат, что и передатчик и может обнаруживать ошибки кадрирования, переполнение данных и ошибки четности.

Генерация синхронизации

Логика генерации тактовых импульсов формирует основную синхронизацию для отправителя и получателя. USARTn поддерживает четыре режима синхронизации: нормальный асинхронный, двухскоростной асинхронный, главный синхронный и подчиненный синхронный режимы. Бит UMSELn в USART регистре С управления и статуса (UCSRnC) выбирают между асинхронным и синхронным режимом. Двухскоростной (только асинхронный режим) контролируется U2Xn, находящимся в UCSRnА регистре. Когда используем синхронный режим (UMSELn = 1), регистр направления передачи данных для XCKn ножки контролирует, является ли источник тактовых импульсов внутренним (главный режим) или внешним (подчиненный режим). Вывод XCKn активен, только если используется синхронный режим.

На схеме 2 показана логика формирования тактовых импульсов.

Схема 2 Логика формирования тактовых импульсов, блочная схема (потом вставлю)

Описание сигналов:

txclk  тактовый сигнал передатчика (внутренний сигнал)

rxclk  основной тактовый сигнал получателя (внутренний сигнал)

xcki  вход с ножки XCK(внутренний сигнал). Используется для синхронного    подчиненного режима

xcko  выход синхронизации XCK(внутренний сигнал). Используется для     синхронного главного режима

fOSC  частота на контакте XTAL(системный тактовый генератор)

Таблица 2 Формулы для вычисления установки регистра скорости двоичной передачи

BAUD   скорость двоичной передачи(bps)

fOSC   системная частота тактового генератора колебаний

UBRRn  содержимое регистров UBRRHn и UBRRLn, (0-4095)

У нас fOSC равна 8 МГц.

Инициализация USART

Инициализация USART должна быть выполнена перед  сеансом связи. Процесс инициализации обычно состоит из установки скорости двоичной передачи, установки формата фрейма и запуска в работу передатчика или приёмника в зависимости от использования. Для режима прерывания управляемого USART- ом должен быть сброшен общий флаг прерывания (прерывания глобально запрещаются) во время инициализации.

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

void USART_Init( unsigned int baud )

{

/* Установка скорости двоичной передачи */

UBRRHn = (unsigned char) (baud>>8);

UBRRLn = (unsigned char) baud;

/* Запуск получателя и отправителя */

UCSRnB = (1<<RXENn) | (1<<TXENn);

/* Установка формата фрейма: 8 бит данных, 2 стоповых бита */

UCSRnC = (1<<USBSn) | (3<<UCSZn0);

}

Передача данных

USART передатчик включается с помощью установки бита включения передачи (TXEN) в регистр UCSRnB. Когда закончена настройка управляющего регистра USART, то вывод TxD начинает работать как передатчик последовательного порта, а не как обычный порт ввода/вывода. Скорость двоичной передачи, режим работы и формат фрейма должны быть установлены один раз до какой-либо передачи.

Посылка фреймов с от 5 до 8 битами данных

Передача данных инициализируется с помощью загрузки буфера передачи с данными для передачи. Центральный процессор загружает буфер передачи, записывая в UDRn адрес ввода-вывода. Буферизованные данные в буфере передачи будут перемещены в регистр сдвига, когда регистр сдвига будет готов послать новый фрейм. Регистр сдвига загружается новыми данными, если нет действующей передачи, или сразу же после того как передан последний стоповый бит предыдущего фрейма. Как только новые данные загружены в регистр сдвига, будет передан целый законченный фрейм на скорости заданной регистром UBRRn, битом U2Xn или XCKn в зависимости от режима работы.

Следующий фрагмент кода определяет функцию по передаче данных, основанную на опросе флага занятости регистра данных(Data Register Empty (UDREn) Flag). Когда используются фреймы с менее чем восемью битами, то самые значащие биты, записанные в UDRn, игнорируются.

void USART_Transmit( unsigned char data )

{

/* Ожидание пустого буфера передачи */

while ( !( UCSRnA & (1<<UDREn)) )

;

/* Кладем данные в буфер и шлем данные */

UDRn = data;

}

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

Посылка фреймов с 9 битами данных

Если используется девятиразрядный знак (UCSZn = 7), девятый бит должен быть записан в бит TXB8 в UCSRnB до того, как младший бит знака будет записан в UDRn. Код, представленный ниже, показывает функцию передачи, которая обрабатывает девятиразрядный флаг.

void USART_Transmit( unsigned int data )

{

/* Ожидание пустого буфера передачи */

while ( !( UCSRnA & (1<<UDREn))) )

;

/* Копирование девятого бита в  TXB8 */

UCSRnB &= ~(1<<TXB8);

if ( data & 0x0100 )

UCSRnB |= (1<<TXB8);

/* Кладем данные в буфер и шлем данные */

UDRn = data;

}

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

Флаги отправителя и прерывания

USART передатчик имеет два флага, которые показывают его состояние: флаг занятости регистра данных и завершение передачи (TXCn). Оба флага могут быть использованы для формирования прерываний.

Флаг занятости регистра данных (UDREn) определяет готов ли буфер передачи для получения новых данных. Этот бит устанавливается, когда буфер передачи пуст, и очищается, когда буфер передачи содержит данные для передачи, которые ещё не были перемещены в регистр сдвига.

Когда бит разрешения прерывания, генерируемого при освобождении регистра данных (Data Register Empty Interrupt Enable (UDRIEn)) в UCSRnB установлен в единицу, флаг этого прерывания не будет сброшен пока UDREn не перейдет в единичное состояние (при условии что разрешено общее прерывание). UDREn очищается с помощью записи UDRn. Когда используется передача данных управляемая прерываниями, программа обработки Data Register Empty прерывания должна либо записать новые данные в UDRn,чтобы очистить UDREn, либо блокировать Data Register Empty прерывание, иначе произойдет новое прерывание, как только завершится программа обработки прерываний.

Бит флага окончания передачи (TXCn) устанавливается один раз, когда целый фрейм в регистре сдвига передачи был сдвинут без сохранения выдвигаемых разрядов и нет новых данных, представленных в настоящий момент в буфере передачи. Флаговый бит TXCn автоматически очищается, когда выполнено полное прерывание передачи или он может быть очищен с помощью записи единицы в месторасположение его разряда. Флаг TXCn полезен в полудуплексных интерфейсах связи (communication interfaces)(как стандарт RS-485), где передающее приложение должно входить в режим получения и освобождать коммуникационную шину сразу же после завершения передачи.

Когда установлен бит разрешения прерывания по завершении передачи (TXCIEn) в UCSRnB, то будет выполнено USART прерывание по завершении передачи, как только будет установлен флаг TXCn (при условии что разрешены глобальные прерывания). Когда используется прерывание по завершении передачи, программа обработки прерываний не очищает флаг TXCn, это происходит автоматически, как только прерывание выполнено.

Генератор четности

Генератор четности высчитывает контрольный разряд четности для последовательных данных фрейма. Когда установлен контрольный разряд четности (UPMn1 = 1), управляющая логика передатчика вставляет контрольный разряд четности между последним битом данных и первым стоповым битом посылаемого фрейма.

Блокировка (отключение) передатчика

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

Получение данных

USART приемник становится активным с помощью установления бита разрешения (RXENn) в регистре UCSRnB в единицу. Когда приёмник активен, стандартная функция порта RxDn подменяется USART и работает в режиме приемника. Скорость двоичной передачи, режим работы и формат фрейма должны быть установлены один раз до какого-либо последовательного получения. Если используется синхронный режим, то тактовый импульс на контакте XCKn будет использован как импульс передачи.

Получение фрейма длиной от 5 до 8 битами данных

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

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

unsigned char USART_Receive( void )

{

/* Ожидание получаемых данных */

while ( !(UCSRnA & (1<<RXCn)) )

;

/* Получение и возврат полученных данных из буфера */

return UDRn;

}

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

Получение фрейма с 9 битами данных

Если используется девятиразрядный знак (UCSZn = 7), девятый бит должен быть прочитан из бита TXB8n в UCSRnB до того, как младшие биты будут прочитаны из UDRn. Это правило применяется также к FEn, DORn и UPEn флагам статуса. Читаем статус из UCSRnA, затем данные из UDRn. Чтение UDRn I/O адреса изменит состояние буфера получения FIFO и, следовательно, TXB8n, FEn, DORn and UPEn биты, которые хранятся в FIFO, будут изменены.

Код, представленный ниже, показывает функцию получения USART, которая обрабатывает оба девятиразрядных знака и биты статуса.

unsigned int USART_Receive( void )

{

unsigned char status, resh, resl;

/* Ожидание получаемых данных */

while ( !(UCSRnA & (1<<RXCn)) )

;

/* Получение статуса и девятого бита, затем данных из буфера */

status = UCSRnA;

resh = UCSRnB;

resl = UDRn;

/* Если ошибка, то возвращается -1 */

if ( status & (1<<FEn) | (1<<DORn) | (1<<UPEn) )

return -1;

/* Отфильтровываем девятый бит, затем возвращаем */

resh = (resh >> 1) & 0x01;

return ((resh << 8) | resl);

}

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

Флаг завершения получения и прерывание

USART приёмник имеет один флаг, указывающий на состояние приёмника.

Флаг завершения получения RXCn указывает, есть ли непрочитанные данные в буфере получения. Этот флаг – единица, если в буфере получения есть непрочитанные данные и ноль, когда буфер получения пуст. Если приёмник не активен (RXENn = 0), то буфер получения будет очищен и соответственно бит RXCn станет нулем.

Когда установлено разрешение прерывания по завершении получения RXCIEn в UCSRnB, прерывание по завершении получения USART выполняется, пока установлен флаг RXCn (при условии что разрешены глобальные прерывания). Когда используется получение данных управляемое прерываниями, функция завершения прерывания должна прочитать полученные данные из UDRn для того, чтобы очистить флаг RXCn, в противном случае возникнет новое прерывание, как только программа обработки прерываний закончит работу.

Приёмник флагов ошибки

USART приёмник имеет три флага ошибки: ошибка фрейма (FEn), переполнение данных (DORn) и ошибка четности (UPEn). Получить доступ ко всем можно прочтя UCSRnA. Общее для флагов ошибки то, что они расположены в буфере получения вместе с фреймом, для которого показывают статус ошибки. Благодаря буферизации флагов ошибки, UCSRnA должен быть прочтен до чтения буфера получения (UDRn), поскольку чтение адреса UDRn I/O изменяет сбрасывает все флаги. 

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

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

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

Флаг ошибки четности (UPEn) указывает на то, что следующий фрейм в буфере получения имеет  ошибку четности при получении. Если не разрешен контроль по четности, то бит UPEn будет всегда прочитан нулем.

 

Устройство контроля по четности

Устройство контроля по четности активно, когда установлен высокий режим четности USART (UPMn1). Тип контроля по четности (четный или нечетный), который будет выставлен, выбирается с помощью бита UPMn0. Если разрешен, то устройство контроля по четности считает четность битов данных в приходящем фрейме и сравнивает результат с битом четности из последовательного фрейма. Результат проверки хранится в буфере получения вместе с полученными данными и стоповыми битами. Флаг ошибки четности (UPEn) затем может быть прочитан программой с помощью проверки наличия у фрейма ошибки четности.

Бит UPEn установлен, если следующий символ, который может быть прочитан из буфера получения, имеет ошибку четности при получении и проверка четности разрешена (UPMn1 = 1). Этот бит доступен, пока происходит чтение буфера получения (UDRn).

Отключение (блокировка) приёмника

В противоположность передатчику отключение приёмника будет немедленной. Поэтому данные из продолжающихся приемов будут потеряны. При отключении (то есть RXENn установлен в ноль) приёмник больше не будет выполнять функцию RxDn, а будет выполнять стандартную функцию как порт ввода/вывода Буфер приёмника. FIFO будет очищен при отключении приёмника. Оставшиеся данные в буфере будут потеряны.

 

Очистка буфера получения

Буфер приёмника стека FIFO будет очищен, когда приёмник будет отключен. Непрочитанные данные будут потеряны. Если буфер был вынуждено отключен в течение стандартной режима, из-за например состояния ошибки, то читаем адрес UDRn I/O до тех пор, пока не очищен флаг RXCn. Код ниже описывает подавление буфера получения.

void USART_Flush( void )

{

unsigned char dummy;

while ( UCSRnA & (1<<RXCn) ) dummy = UDRn;

}

USB

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

  •  Если ножка ID не присоединена к земле, то USB ID бит устанавливается внутрисхемной притяжкой к питанию и выбирается контроллер устройства USB.
  •  Бит ID очищается аппаратно, когда на ID ножке обнаружен низкий уровень. Затем контроллер устройства блокируется и запускается контроллер хоста.

В любом случае программа вынуждена выбрать режим (хост, устройство) для того, чтобы был доступ к регистрам контроллера устройства или  регистрам контроллера хоста, которые являются регистрами с мультиплексированием. Например, даже если USB контроллер обнаруживает режим устройства(pin ID high), программа должна выбрать режим устройства (бит HOST очищен), иначе будет реализован режим  USBхоста. Также это верно для режима хоста.

Наш режим только устройство.

Контроль скорости

Когда USB интерфейс сконфигурирован в режиме устройства, выбор скорости (максимальная скорость или низкая скорость) зависит от UDP/UDM подтяжки внутри микросхемы вывода к питанию. (Т.е. если на него не подано внешнее питание или этот вывод не замкнут на землю, то он притягивается к напряжению питания внутри микросхемы.) Бит LSM в регистре UDCON позволяет выбирать внутреннюю подтяжку на UDM (низкоскоростной режим) или UDP(высокоскоростной режим) информационные линии.

Схема 3 Выбор скорости в режиме устройства.

Общие регистры USB

Бит

7

6

5

4

3

2

1

0

UIMOD

UIDE

UVCONE

UVREGE

UHWCON

Чтение/Запись

R/W

R/W

R

R/W

R

R

R

R/W

Начальное значение

1

0

0

0

0

0

0

0

  •  7 – UIMOD: бит режима USB

Этот бит не действует, когда установлен бит UIDE (внешняя UID ножка активирована). Устанавливается для включения режима устройства USB. Очищается для включения режима хоста USB

  •  6 – UIDE: активизация ножки UID

Устанавливается для включения выбор режима USB (периферийный/базовый) через ножку UID. Очищается для включения выбора режима USB (периферийный/базовый) с битовым регистром UIMOD.

UIDE может быть изменен только, когда интерфейс  USB отключен (бит USBE очищен)

  •  5 – зарезервирован

Считываемое значение из этого бита всегда равно нулю.

  •  4 – UVCONE: ножка UVCON активна

Устанавливается для включения управления ножкой UVCON. Очищается для выключения управления ножкой UVCON. Этот бит следует устанавливать только, когда USB интерфейс активен.

  •  3-1 – Зарезервированы

Считываемое значение из этих битов всегда ноль.

  •  0 – UVREGE: стабилизатор клавиатуры USB(pad regulator) активен

Устанавливается для включенияклавиатурный регулятор для USB клав (USB pad regulator). Очищается для выключенияклавиатурный регулятор для USB клав .

Бит

7

6

5

4

3

2

1

0

USBE

HOST

FRZCLK

OTGPADE

-

-

IDTE

VBUSTE

USBCON

Чтение/Запись

R/W

R/W

R/W

R/W

R

R

R/W

R/W

Начальное значение

0

0

1

0

0

0

0

0

  •  7 – USBE: USB macro Enable Bit

Устанавливается для включения USB контроллера. Очищается для выключения и сброса USB контроллера, выключения USB трансивера и выключения входов синхронизации USB контроллера.

  •  6 – HOST: бит хоста

Устанавливается для включения режима хоста. Очищается для включения режима устройства.

  •  5 – FRZCLK: Фиксирование USB бита синхронизации

Устанавливается для включения входов синхронизации (”Возобновленное обнаружение” все еще активно). Это понижает потребляемую мощность. Очищается для включения входов синхронизации.

  •  4 – OTGPADE: Разрешение OTG Pad

Устанавливается для включения OTG pad. Очищается для выключения OTG pad. OTG pad на самом деле является VBUS pad.

Этот бит может быть установлен или очищен даже если USBE = 0. Это делает возможным VBUS обнаружение, даже если USB макрос(macro) выключен. Это должно быть разрешено как в режиме хоста, так и в режиме устройства для возможности стандартных операций на интерфейсе USB.

  •  3-2 – Зарезервированы

Считываемое значение из этих битов всегда 0.

  •  1 – IDTE: ID бит разрешения прерывания транзакции

Этот бит устанавливается для включения ID формирования разрешения прерываний. Очищается этот бит для выключения формирования ID прерывания транзакции. 

  •  0 – VBUSTE: VBUS бит разрешения прерывания транзакции

Этот бит устанавливается для включения формирования VBUS прерывания транзакции. Очищается этот бит для выключения формирования прерывания транзакции VBUS 

Бит

7

6

5

4

3

2

1

0

-

-

-

-

SPEED

ID

VBUS

USBSTA

Чтение/Запись

R

R

R

R

R

R

R

R

Начальное значение

0

0

0

0

1

0

1

0

  •  7-4 - Зарезервированы

Считываемое значение из этих битов всегда ноль.

  •  3 – SPEED: Флаг статуса скорости

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

Устанавливается аппаратно, когда контроллер в режиме предельной скорости. Очищается аппаратно, когда контроллер в низкоскоростном режиме.

  •  2 – Зарезервирован

Считываемое значение из этого бита всегда равно нулю.

  •  1 – ID: флаг вывода IUD 

Считываемое значение из этого бита указывает на состояние ножки UID.

  •  0 – VBUS: флаг VBus

Считываемое значение из этого бита показывает состояние ножки VBUS. Этот бит используется для диагностики состояния соединения USB шины в приложении

Бит

7

6

5

4

3

2

1

0

-

-

-

-

-

-

IDTI

VBUSTI

USBINT

Чтение/Запись

R

R

R

R

R

R

R/W

R/W

Начальное значение

0

0

0

0

0

0

0

0

  •  7-2 - Зарезервированы

Считываемое значение из этих битов всегда ноль.

  •  1 – IDTI: флаг прерывания транзакции D

Устанавливается аппаратно, когда обнаружен переход (высокий к низкому, низкий к высокому) на ножке UID. Т.е. когда идет переход с сигнального уровня к нулю и наоборот.

Должен быть очищен программно.

  •  0 – VBUSTI: Флаг прерывания транзакции IVBUS

Устанавливается аппаратно, когда обнаружен переход (высокий к низкому, низкий к высокому) на VBUS pad.

Должен быть очищен программно.

Бит

7

6

5

4

3

2

1

0

-

-

HNPREQ

SRPREQ

SRPSEL

VBUSHWC

VBUSREQ

VBUSRQC

OTGCON

Чтение/Запись

R

R

R/W

R/W

R/W

R/W

R/W

R/W

Начальное значение

0

0

0

0

0

0

0

0

  •  7-6 - Зарезервированы

Считываемое значение из этих битов всегда ноль.

  •  5 – HNPREQ: Бит запроса HNP

Устанавливается для инициализации HNP, когда контроллер находится в режиме устройства (B).Устанавливается для принятия HNP, когда контроллер в режиме хоста (A).

Очищается в противном случае.

  •  4 – SRPREQ: Бит запроса SRP

Устанавливается для инициализации SRP, когда контроллер находится в режиме устройства. Очищается аппаратно, когда контроллер включает SRP.

  •  3 – SRPSEL: Бит выбора SRP

Устанавливается для выбора метода выравнивания генерации SRP .

Очищается для выбора метода выравнивания генерации SRP

  •  2 – VBUSHWC: Бит управления аппаратурой VBus

Устанавливается для выключения управления аппаратурой над ножкой UVCON.

Очищается для включения аппаратурного управления над ножкой UVCON.

  •  1 – VBUSREQ: Бит запроса VBUS

Устанавливается для того, чтобы сомкнуть пин UVCON для получения питания с VBUS. Этот бит должен быть использован, когда контроллер в режиме хоста.

Очищается аппаратно, когда установлен VBUSRQC.

  •  0 – VBUSRQC: Бит очистки запроса VBUS

Устанавливается, чтобы разомкнуть пин UVCON для получения питания с VBUS. Этот бит должен быть использован, когда контроллер в режиме хоста.

Очищается аппаратно сразу же после установки.

Бит

7

6

5

4

3

2

1

0

-

PAGE

-

-

-

VALUE

OTGTCON

Чтение/Запись

R

R/W

R/W

R

R

R/W

R/W

R/W

Начальное значение

0

0

0

0

0

0

0

0

  •  7 – Зарезервирован

Этот бит зарезервирован и всегда установлен.

  •  6-5 – PAGE: Бит доступа к странице таймера

Устанавливается/очищается для доступа к специальному регистру таймера.

  •  4-3 - Зарезервированы

Считываемое значение из этих битов всегда равны нулю.

  •  1-0 – VALUE: Бит значения

Устанавливается для задания нового значения таймера.

Бит

7

6

5

4

3

2

1

0

-

-

STOE

HNPERRE

ROLEEXE

BCERRE

VBERRE

SRPE

OTGIEN

Чтение/Запись

R

R

R/W

R/W

R/W

R/W

R/W

R/W

Начальное значение

0

0

0

0

0

0

0

0

  •  7-6 - Зарезервированы

Считываемое значение из этих битов всегда 0.

  •  5 – STOE: Разрешение бита прерывания по таймауту приостановки

Устанавливается для включения STOI прерывания. Очищается для выключения прерывания STOI.

  •  4 – HNPERRE: HNP бит разрешения прерывания ошибки

Устанавливается для включения HNPERRI прерывания. Очищается для выключения HNPERRI прерывания.

  •  3 – ROLEEXE: Бит разрешения прерывания обмена ролей 

Устанавливается для включения ROLEEXI прерывания. Очищается для выключения ROLEEXI прерывания.

  •  2 – BCERRE: Бит разрешения прерывания ошибки В-соединения

Устанавливается для включения BCERRI прерывания. Очищается для выключения BCERRI прерывания.

  •  1 – VBERRE: Бит разрешения прерывания VBus ошибки

Устанавливается для включения VBERRI прерывания. Очищается для выключения VBERRI прерывания.

  •  0 – SRPE: Бит разрешения прерывания SRP

Устанавливается для включения SRPI прерывания. Очищается для выключения SRPI прерывания.

Бит

7

6

5

4

3

2

1

0

-

-

STOI

HNPERRI

ROLEEXI

BCERRI

VBERRI

SRPI

OTGINT

Чтение/Запись

R

R

R/W

R/W

R/W

R/W

R/W

R/W

Начальное значение

0

0

0

0

0

0

0

0

  •  7-6 - Зарезервированы

Считываемое значение из этих битов всегда 0..

  •  5 – STOI: флаг прерывания  по таймауту приостановки  

Устанавливается аппаратно при обнаружении ошибки таймаута (более чем 150 ms) после приостановки.

Очищается аппаратно.

  •  4 – HNPERRI: Флаг разрешения ошибки HNP

Устанавливается аппаратно при обнаружении ошибки в течение работы протокола. Очищается программно.

  •  3 – ROLEEXI: Флаг прерывания обмена ролями

Устанавливается аппаратно, когда USB контроллер успешно переключил свой режим, из-за HNP согласования: хост на устройство или устройство на хост. Однако бит выбора режима является неизменяемым программно-аппаратными средствами для того, чтобы достичь корректности  расположения RAM и битов событий. Очищается программно.

  •  2 – BCERRI: Флаг разрешения ошибки В-соединения

Устанавливается аппаратно, когда происходит ошибка при В-соединении (то есть если периферия не подключается после 300 ms Vbus запроса доставки). Очищается программно.

  •  1 – VBERRI: Флаг прерывания ошибки V-Bus 

Устанавливается аппаратно при обнаружении удаления на VBus. Очищается программно.

  •  0 – SRPI: Флаг прерывания SRP

Устанавливается аппаратно при обнаружении SRP. Используется только в режиме хоста. Очищается программно. 

Режимы работы устройства USB

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

  •  Конечная точка 0: программируемый размер FIFO до 64 байт, по умолчанию конечная точка управления
  •  Конечные точки 1: программируемый размер FIFO до 256 байтов в режиме двойной буферизации.
  •  Конечные точки с 2 по 6: программируемый размер FIFO до 64 байт в режиме двойной буферизации.

Контроллер стартует в режиме ожидания. В этом режиме потребление (pad consumption) уменьшается до минимума.

Установка адреса

Адрес USB устройства устанавливается в соответствии с USB протоколом:

  •  USB устройство после включения питания, отвечает адресу 0
  •  Хост шлет команду установки (SET_ADDRESS(addr)),
  •  Прошивка записывает этот адрес в UADD, но держит ADDEN очищенным,
  •  USB устройство шлет IN команду нольбайтовую((IN пакет длины в ноль байт)
  •  Затем прошивка включает адрес устройства с помощью установки ADDEN. Единственный адрес, принимаемый контроллером – это тот, который хранится в UADD.

ADDEN and UADD не должны быть записаны в одно и то же время.

UADD содержит по умолчанию адрес 00h после включения питания или USB сброса.

ADDEN очищается оппаратноаппаратно:

  •  После сброса включения питания,
  •  Когда получен USB сброс,
  •  Или когда макрос выключен (USBE очищен)

Когда этот бит очищен, по умолчанию используется адрес устройства 00h.

Приостановка, пробуждение и восстановление

После 3 мс, в течение которых USB линия была выключена, контроллер переключается в режим предельной скорости и запускает (если разрешено) (приостановленное) прерывание SUSPI. Затем прошивка может установить бит FRZCLK.

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

Есть два способа восстановить режим ”приостановки”

  •  Первый-это очистить бит FRZCLK. Это возможно, если центральный процессор не находится в режиме задержки.
  •  Второй способ, если процессор в режиме задержки, - это включить WAKEUPI прерывание (WAKEUPE установка). Затем, как только контроллером виден non-idle сигнал, запускается WAKEUPI прерывание. Затем прошивка должна очистить бит FRZCLK для  возобновления передачи.

Нет никакой взаимосвязи между SUSPI прерыванием и WAKEUPI прерыванием: WAKEUPI прерывание запускается как только появляется сигнальный уровень в информационных линиях.Такимлиниях. Таким образом WAKEUPI прерывание возникает, даже если контроллер не находится в режиме “приостановки” ( (suspendmode).

Когда запущено WAKEUPI прерывание, если бит SUSPI прерывания был уже установлен, он очищается аппаратно.

Когда запущено SUSPI прерывание, если бит WAKEUPI прерывания был уже установлен, оно очищается аппаратно.

Отсоединение(Detach)

Значение сброса бита отсоединения равно 1.

Возможно пересчитать устройство просто установкой и очищением бита отсоединения.

  •  Установка отсоединения отключит подтяжку внутри микросхемы на D+ или D- контактах (в зависимости от выбора режима предельной скорости или малой скорости). Затем очистка отсоединения подключит подтяжку на D+ или D- контактах.

Схема 4  отсоединение устройства на предельной скорости.

Удаленное пробуждение(Remote Wake-up)

“Удаленное пробуждение ” (или “upstream resume”) запрос - это единственная операция, которую устройству разрешено отсылать по его собственной инициативе. В любом случае, чтобы это сделать, устройство сначала должно получить DEVICE_REMOTE_WAKEUP запрос от хоста.

  •  Первое, USB контроллер должен обнаружить  состояние “приостановки”  линии:  удаленное пробуждение может быть только послано, когда установлен флаг SUSPI.
  •  Затем прошивка имеет возможность установить RMWKUP для посылки “upstream resume” потока. Это будет автоматически сделано контроллером после 5 мс бездействия на линии USB.
  •  Когда контроллер начинает слать “upstream resume”, запускается UPRSMI прерывание (если разрешено). SUSPI очищается аппаратно.
  •  RMWKUP очищается аппаратно в конце “upstream resume”.
  •  Если контроллер обнаруживает хороший сигнал “Конца возобновления”(“End Of Resume”) из хоста, то запускается EORSMI прерывание (если оно разрешено).

Procyon AVRlib
C библиотека для Atmel AVR процессоров

  •  AVRlib это библиотека простых в употреблении С функций для общих и частных задач, использующих AVR процессоры.
  •  Цель AVRlib заключается в том, чтобы позволить программистам быстрее продвигаться к их конечной цели  с помощью сокращения времени на написание основных поддерживаемых функций и кода.
  •  Большинство заголовочных файлов AVRlib (*.h) имеют обширные описания того, как использовать предоставляемые функции библиотеки. Все файлы с кодом (*.c) имеют комментарии и дополнительную информацию.
  •  Также для данной библиотеки есть объемная документация и примеры кода.

Результаты

Была проведена исследовательская работа по микроконтроллерам с интерфейсом USB, из которых был выбран определенный микроконтроллер для дальнейшей разработки проекта по защите ПО. Соответственно были изучены устройство микроконтроллеров, их работа.

На основе даташита микроконтроллера AT90USB1287 и reference design аналогичного процессора была сделана принципиальная схема.

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

Планируемая дальнейшая работа в рамках проекта по защите ПО

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


Исполняемый код

Маркер

сполняемый код

Маркер

Защищаемые данные

Исполняемый модуль

Метка начала блока

Защищаемый блок

Метка окончания блока

Исполняемый модуль

Персональный компьютер

    USB криптопроцессор

(Прием данных, дешифрация и возврат дешифрованных данных)

Передача данных

Прием дешифрованных данных

USB port


 

А также другие работы, которые могут Вас заинтересовать

17107. Циклічні алгоритми 61.5 KB
  Лабораторна робота № 3 Тема: Циклічні алгоритми. Мета: навчитися складати схеми циклічних алгоритмів. Обладнання: інструкція до практичної роботи олівець лінійка. Хід роботи. Правила Т/Б в кабінеті комп'ютерної техніки. Методичні вказівки. Базова ст...
17108. Вкладені цикли 58 KB
  Лабораторна робота № 4 Тема: Вкладені цикли. Мета: навчитися складати алгоритми з вкладеними циклами. Обладнання: інструкція до практичної роботи олівець лінійка. Хід роботи Правила Т/Б в кабінеті комп'ютерної техніки. Методичні вказівки. Можливі в
17109. Програмування програм багатомодульної структури 68 KB
  Лабораторна робота № 18 Тема: Програмування програм багатомодульної структури. Мета: навчитися програмувати програми багатомодульної структури. Обладнання: ПК інструкція до практичної роботи. Хід роботи. 1.Правила техніки безпеки в класі комп'ютерної техніки. ...
17110. Розробка програм з функціями. Оголошення, визначення і виклик функцій 109.5 KB
  Лабораторна робота № 19 Тема: Розробка програм з функціями. Оголошення визначення і виклик функцій Ціль роботи: виробити практичні навички в написанні програм з виділенням функцій їхнім оголошенням визначенням і використанням. Обладнання: ПКПО Borland C Теорети...
17111. Розробка програм з покажчиками 88.5 KB
  Лабораторна робота № 20 Тема: Розробка програм з покажчиками Ціль роботи: вивчити конструкції й оператори мови С для роботи з покажчиками. Обладнання: ПКПО Borland C Теоретичні відомості Самим могутнім інструментом у С безумовно є покажчики і для того щоб опанув...
17112. Масиви. Селективна обробка масивів 74 KB
  Лабораторна робота № 21 Тема: Масиви. Селективна обробка масивів Ціль роботи: вивчити роботу з масивом як зі складеним типом даних прийоми введення і виведення даних обробку одномірних масивів. Обладнання: ПКПО Borland C Теоретичні відомості Масив це набір...
17113. Формування робочих масивів за допомогою операцій селекції вихідного масиву 74 KB
  Лабораторна робота № 22 Тема: Формування робочих масивів за допомогою операцій селекції вихідного масиву Ціль роботи: вивчити і навчитися застосовувати обробку масивів по заданих логічних умовах формування нових масивів. Обладнання: ПКПО Borland C Теоретичні відо
17114. Обробка символьних даних 57 KB
  Лабораторна робота № 23 Тема: Обробка символьних даних Ціль роботи: вивчити і навчитися використовувати масиви символьних даних. Обладнання: ПКПО Borland C Хід роботи 1.Вивчити теоретичні відомості 2.Відповідно до індивідуального завдання розробити алгоритм...
17115. Використання бібліотечних функцій для роботи із символьними даними 79.5 KB
  Лабораторна робота № 24 Тема: Використання бібліотечних функцій для роботи із символьними даними Ціль роботи: виробити практичні навички в написанні програм з використанням бібліотечних функцій для роботи із символьними даними. Обладнання: ПКПО Borland C Теоретичн...