博客
关于我
FreeRTOS-Plus-CLI使用笔记
阅读量:238 次
发布时间:2019-03-01

本文共 3136 字,大约阅读时间需要 10 分钟。

FreeRTOS-Plus-CLI使用笔记

简介

FreeRTOS+CLI(Command Line Interface, 命令行接口)为FreeRTOS应用程序提供了一种轻量级、高效的命令行调试接口。通过该接口,可以方便地查看传感器状态、报警信息等,帮助开发者快速排查问题。添加命令的实现步骤包括:

  • 编写实现命令功能的函数
  • 将命令映射到对应的功能函数
  • 注册命令
  • 启动命令解释器
  • 移植

    环境配置

    • 开发环境:Keil MDK
    • 芯片类型:STM32F429
    • 库类型:HAL

    获取文件

    从FreeRTOS源码中提取以下文件:

  • FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI下的FreeRTOS_CLI.cFreeRTOS_CLI.h
  • FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos下的Sample-CLI-commands.cUARTCommandConsole.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);

    仅复制指定长度的数据,避免越界问题。

    参考文献

    FreeRTOS+CLI使用教程

    你可能感兴趣的文章
    Mysql-丢失更新
    查看>>
    Mysql-事务阻塞
    查看>>
    Mysql-存储引擎
    查看>>
    mysql-开启慢查询&所有操作记录日志
    查看>>
    MySQL-数据目录
    查看>>
    MySQL-数据页的结构
    查看>>
    MySQL-架构篇
    查看>>
    MySQL-索引的分类(聚簇索引、二级索引、联合索引)
    查看>>
    Mysql-触发器及创建触发器失败原因
    查看>>
    MySQL-连接
    查看>>
    mysql-递归查询(二)
    查看>>
    MySQL5.1安装
    查看>>
    mysql5.5和5.6版本间的坑
    查看>>
    mysql5.5最简安装教程
    查看>>
    mysql5.6 TIME,DATETIME,TIMESTAMP
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    Mysql5.6主从复制-基于binlog
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    查看>>
    MySQL5.6的zip包安装教程
    查看>>