90 lines
7.6 KiB
Markdown
90 lines
7.6 KiB
Markdown
# Тестовое задание
|
||
|
||
## Описание
|
||
Программа демонстрирует взаимодействие клиента с сервером посредством протокола HDLC
|
||
|
||
## Структура проекта
|
||
- **fifo** - исходные коды для работы с fifo
|
||
- fifo_type.h - структуры и типы для работы с fifo
|
||
- fifo.h
|
||
- fifo.c
|
||
- **hdlc** - исходные коды для работы с hdlc
|
||
- hdlc_type.h - структуры и типы для работы с hdlc
|
||
- hdlc.h
|
||
- hdlc.c
|
||
- main.h
|
||
- main.c
|
||
- tools.c - вспомагательные функции
|
||
- worker - исходные коды обработчиков (хостов)
|
||
- worker.h
|
||
- worker.c
|
||
- worker_master.c - файл с ведущим хостом
|
||
- worker_slave.c - файл с ведомым хостом
|
||
|
||
|
||
## Задача
|
||
Необходимо разработать программу на языке C без использования сторонних
|
||
библиотек и наработок (ChatGPT, исходники с github и т.п.) для реализации
|
||
её основных функций. Для реализации вспомогательных функций типа ввода-вывода,
|
||
расчёта CRC и т.п. можно использовать библиотечные функции или исходные
|
||
тексты библиотек с github или аналогичного ресурса.
|
||
|
||
Программа должна реализовывать модель системы, состоящей из двух узлов
|
||
(ведущего и ведомого), взаимодействующих друг с другом по протоколу
|
||
HDLC (https://ru.wikipedia.org/wiki/HDLC) через два байтовых FIFO размером 8 байт.
|
||
Один блок FIFO должен обеспечивать передачу байт данных от ведущего к ведомому,
|
||
а другой в обратном направлении. Программная реализация FIFO должна обеспечивать
|
||
возможность записи и чтения одного байта в FIFO, а также проверку его состояния:
|
||
FIFO пуст или FIFO полон. Вся логика работы программы должна быть реализована
|
||
в виде общего цикла в функции main (big loop OS) и демонстрировать отправку
|
||
ведущим узлом команды в направлении ведомого, ожидание получения ответа от ведомого,
|
||
получение и обработку ответа. При этом на экран в текстовом виде должны
|
||
выводиться сообщения, позволяющие понять что сейчас происходит и в каком из
|
||
узлов моделируемой системы.
|
||
|
||
Адреса на виртуальной шине HDLC можно выбрать константными.
|
||
Управляющее поле пакета должно обеспечивать выбор команды, которая будет
|
||
выполняться на стороне ведомого устройства. Размер информационного поля пакета должен
|
||
быть не менее 16 байт. При реализации обработки команды на стороне
|
||
ведомого не требуется реализовывать какую-то сложную обработку, достаточно например
|
||
поменять порядок байт в исходной полученной команде или что-то вроде этого.
|
||
|
||
Сразу уточню, что по условиям задачи посылка от ведущего к ведомому целиком
|
||
не влезет в FIFO между ними. Поэтому по сути необходимо будет реализовать работу в
|
||
асинхронном режиме записи в FIFO с опросом его состояния и возвратом управления
|
||
в главный цикл при невозможности чтения или записи из/в FIFO.
|
||
|
||
При оценке будет учитываться как логика работы, так и стиль написания
|
||
(имена функций и переменных должны быть осмысленными, комментарии должны
|
||
пояснять ключевые решения в коде и т.п.).
|
||
|
||
Программа должна компилироваться типовым компилятором и не должна требовать
|
||
наличия нестандартных библиотек (для реализации достаточно stdio, stdlib и т.п.
|
||
стандартных библиотек С).
|
||
|
||
Апдейт
|
||
Протокол нужно реализовать как транспорт для своих тестовых команд. Поэтому в нём должны быть реализованы только самые базовые вещи: фрейминг, проверка контрольных сумм, байт-стаффинг и т.п. Минимальная реализация.
|
||
Никаких множественных буферов пакетов не требуется, достаточно одного буфера на приём и одного буфера на передачу на каждом из участников обмена. Ведущий всегда отправляет один пакет данных с командой и параметрами, а далее ждёт получения ответа на свою команду от ведомого. Аналогично и у ведомого - он ждёт получения команды от ведущего, а дальше отправляет ответ ведущему и пока не отправил новые запросы от ведущего не обрабатывает. Никаких очередей команд. FIFO, указанный в задании, используется для эмуляции канала между ведущим и ведомым устройствами, т.к. как RX и TX FIFO UART. В канале предполагается наличие контроля потока и блокировка передачи при заполнении FIFO, т.е. если FIFO оказалось забито, то отправитель данных будет ждать пока оно освободится.
|
||
|
||
|
||
## Функции и их параметры
|
||
### worker
|
||
- *int WORK_execute(int (*callback)(workerHost_s*), workerHost_s *worker);*
|
||
- int WORK_preparePackage(workerHost_s *worker);
|
||
- int WORK_sendPackage(workerHost_s *worker);
|
||
- int WORK_waitPackage(workerHost_s *worker);
|
||
- int WORK_receivePackage(workerHost_s *worker);
|
||
- int WORK_checkPackage(workerHost_s *worker);
|
||
- int WORK_parsePackage(workerHost_s *worker);
|
||
- int WORK_fillBuffer8b(uint8_t *buffer, size_t size);
|
||
|
||
// tools
|
||
int WORK_printBlocks(workerHost_s *worker, uint8_t mode);
|
||
int WORK_testFill(uint8_t* buffer, size_t bufferSize);
|
||
### tools
|
||
- TOOL_workerPrintBlocks
|
||
- hdlcHost_s *worker - указатель на машину
|
||
- uint8_t mode - режим
|
||
- 0 - не выводить ничего
|
||
- 1 - вывести содержимое пакета
|
||
- 3 - вывести содержимое буфера |