博客
关于我
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中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>