博客
关于我
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 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>
    MySQL 错误
    查看>>
    mysql 随机数 rand使用
    查看>>
    MySQL 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>