博客
关于我
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 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>