博客
关于我
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事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>
    multi-angle cosine and sines
    查看>>
    Mysql Can't connect to MySQL server
    查看>>
    mysql case when 乱码_Mysql CASE WHEN 用法
    查看>>
    Multicast1
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>