Тестовое задание
Описание
Программа демонстрирует взаимодействие клиента с сервером посредством протокола 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 оказалось забито, то отправитель данных будет ждать пока оно освободится.
Функции и их параметры
tools
- TOOL_workerPrintBlocks
- hdlcHost_s *worker - указатель на машину
- uint8_t mode - режим
- 0 - не выводить ничего
- 1 - вывести содержимое пакета
- 3 - вывести содержимое буфера