diff --git a/.gitignore b/.gitignore index 4fa1c75..dc84959 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,2 @@ -# ---> CMake -CMakeLists.txt.user -CMakeCache.txt -CMakeFiles -CMakeScripts -Testing -Makefile -cmake_install.cmake -install_manifest.txt -compile_commands.json -CTestTestfile.cmake -_deps -CMakeUserPresets.json +build/ diff --git a/README.md b/README.md deleted file mode 100644 index 51dee08..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# test-kod-bez - -Симулятор общения по протоколу HLDC \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..6f6dd6c --- /dev/null +++ b/readme.md @@ -0,0 +1,77 @@ +# Тестовое задание + +## Описание +Программа демонстрирует взаимодействие клиента с сервером посредством протокола 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 - вывести содержимое буфера \ No newline at end of file