Mty 0 26 апреля Опубликовано 26 апреля · Жалоба Приветствую! Пытаюсь запустить командную строку FreeRTOS-CLI для своего проекта stm32f411. Большие сложности, документация во многом непонятная, примеров нормальных простых не могу найти. Хочу из UART ISR передавать данные через очередь в обработчик командной строки и там выполнять пару команд. Положил из \FreeRTOS-Plus\Source\FreeRTOS-Plus-CLI\ FreeRTOS_CLI.c и FreeRTOS_CLI.h в папку с проектом (CubeIDE) Дальше надо писать задачу обработки самого CLI и обработчик прерывания. Посоветуйте нормальное руководство или простой пример? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 26 апреля Опубликовано 26 апреля · Жалоба Кажется начинаю понимать концепцию. В центре всего есть задача обработки командной строки, назовем ее vCommandConsoleTask хотя название любое. Она получает данные по rs232, формирует строку команды и передает ее в функцию FreeRTOS-CLI под названием FreeRTOS_CLIProcessCommand() А эта функция уже разбирается с командой и возвращает указатель на строку результата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 3 мая Опубликовано 3 мая (изменено) · Жалоба Я использую библиотеку microRL для микроконтроллеров. Не зависит от внешней ОС, да и вообще мало от чего зависит. Умеет Escape-последовательности, сама разбивает введённую команду на слова (да, по пробелам), вызывает обработчик, объявленный в коде. Довольно легковесная. Пишет в объявленную функцию, принимающую строку. Успешно работает на AVR (относительно мелких с 1kiB+ RAM), STM32, ESP32, PC (да, я перетянул это в утилиту, работающуюу из командной строки, костылями, но перетянул). В общем виде: Спойлер #include "microrl.h" <...> microrl_t rl; microrl_t * prl = &rl; char * complete_variants[64]; // Подсказки команд. Не более 64 штук. <...> microrl_init (prl, console_put); // Инициализпция консоли Microrl microrl_set_complete_callback(prl, console_complete); // Выставляем callback "Дополнить!" microrl_set_execute_callback(prl, console_execute); // Добавляем callback на выполнение. <...> void USART3_IRQHandler(void) { <...> microrl_insert_char(prl, tmp); <...> } void console_put_char(const char data) { while(*text) { <...> } } char ** console_complete(int param_count, const char* const* params) { uint8_t j = 0; uint16_t i=0; char * bit; complete_variants[0] = NULL; // Если ничего не нашлось. if (param_count == 0) { // Не введено ничего. for (; j < (sizeof(keywords) / sizeof(keywords[0])); j++) { complete_variants[j] = keywords[j]; } } if (param_count == 1) { // Введён только 1 токен (слово) bit = (char*)params [0]; // Получаем последний введённый (первый же) for (i = 0; i < (sizeof(keywords) / sizeof(keywords[0])); i++) { // Если токен совпадает... if (strstr(keywords[i], bit) == keywords[i]) { // Добавляем его к списку слов. complete_variants[j++] = keywords[i]; } } } complete_variants[j] = NULL; return complete_variants; } int console_execute(int param_count, const char* const* args) { if (!strcmp(args[0], "help")) { console_put("Ssory, Mario, but it's test build.\r\n"); console_put("Avalable commands: reboot\r\n"); // Placeholder, lol. return 0; // Normal execute } else if (!strcmp(args[0], "batt_rst")) { I2C_Write16(0x6C, 0x06, 0x4000); return 0; // Normal execute } return 0; // В любом случае нормальное выполнение } Изменено 3 мая пользователем AlanDrakes Спрятал код под спойлер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться