本文共 3136 字,大约阅读时间需要 10 分钟。
FreeRTOS+CLI(Command Line Interface, 命令行接口)为FreeRTOS应用程序提供了一种轻量级、高效的命令行调试接口。通过该接口,可以方便地查看传感器状态、报警信息等,帮助开发者快速排查问题。添加命令的实现步骤包括:
从FreeRTOS源码中提取以下文件:
FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI
下的FreeRTOS_CLI.c
和FreeRTOS_CLI.h
FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos
下的Sample-CLI-commands.c
和UARTCommandConsole.c
FreeRTOS/Demo/Common/include
下的serial.h
FreeRTOS\Demo\CORTEX_STM32F103_Keil\serial
下的serial.c
文件夹结构示意图:
-FreeRTOS-Plus-CLI├── FreeRTOS_CLI.c // 命令处理核心├── FreeRTOS_CLI.h // 命令处理接口定义├── UARTCommandConsole.c // 运行FreeRTOS的任务定义├── Sample-CLI-commands.c // 命令定义及实现├── serial.c // 底层接口实现└── serial.h // 底层接口定义
在serial.c
文件中:
修改xSerialPortInitMinimal
函数,初始化串口3:
xComPortHandle xSerialPortInitMinimal(unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength) { // 创建接收和发送队列 xRxedChars = xQueueCreate(uxQueueLength, sizeof(char)); xCharsForTx = xQueueCreate(uxQueueLength + 1, sizeof(char)); if (xRxedChars != serINVALID_QUEUE && xCharsForTx != serINVALID_QUEUE) { // 初始化串口3,配置DMA+IDLE中断 bsp_usart3Init(115200); } else { return 0; } return 0;}
修改xSerialPutChar
函数,改用轮询方式发送数据:
signed portBASE_TYPE xSerialPutChar(xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime) { signed portBASE_TYPE xReturn; if (xQueueSend(xCharsForTx, &cOutChar, xBlockTime) == pdPASS) { // 发送数据时使用轮询方式 if (xQueueReceive(xCharsForTx, &cChar, 0) == pdTRUE) { if (HAL_UART_GetState(&huart3) != HAL_UART_STATE_BUSY_TX) { HAL_UART_Transmit(&huart3, &cChar, 1, 1000); } } } else { xReturn = pdFAIL; } return xReturn;}
在stm32f4xx_it.c
文件中:
void USART3_IRQHandler(void) { BaseType_t pxHigherPriorityTaskWoken = pdFALSE; if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) != RESET) { // 接收完成中断处理 __HAL_UART_CLEAR_IDLEFLAG(&huart3); HAL_UART_DMAStop(&huart3); usart3_rx_buffer.finish_flag = 1; usart3_rx_buffer.len = USART_RX_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart3.hdmarx); for (uint16_t i = 0; i < usart3_rx_buffer.len; ++i) { xQueueSendFromISR(xRxedChars, &usart3_rx_buffer.data[i], &pxHigherPriorityTaskWoken); } HAL_UART_Receive_DMA(&huart3, usart3_rx_buffer.data, USART_RX_BUFFER_SIZE); } HAL_UART_IRQHandler(&huart3); portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);}
在FreeRTOSConfig.h
文件中添加以下宏定义:
/* ***************************************************************** FreeRTOS Plus CLI相关配置 ***************************************************************** */#define configCOMMAND_INT_MAX_OUTPUT_SIZE 1024
在main.c
文件中:
// 启动FreeRTOS调度器之前添加以下代码vRegisterSampleCLICommands();vUARTCommandConsoleStart(512, 1);
通过串口助手,可以输入help
查看帮助信息,获取命令列表。您可以仿照Sample-CLI-commands.c
中的示例,根据需求自定义命令。
在实际使用中,若发现程序进入hardfault
中断,可能是由于strcpy
函数调用导致的。请修改prvUARTCommandConsoleTask
函数中的以下代码:
// 修改为strncpy(cLastInputString, cInputString, cmdMAX_INPUT_SIZE);
仅复制指定长度的数据,避免越界问题。