这是FreeRTOS带有的命令行形式的操作。

使用HAL库的串口传输。在CubeMX里打开串口的中断,打开FreeRTOS的USE_TRACE_FACILITY和USE_STATS_FORMATTING_FUNCTIONS,这两个用于任务基本信息查询,Sample-CLI-commands里的一个命令示例函数需要用到。

GENERATE...这个暂时可以不用,在扩展的时候用。

从源码中得到以下6个文件:

FreeRTOSv10.2.1\FreeRTOS\Demo\CORTEX_STM32F103_Keil\serial\serial.c

FreeRTOSv10.2.1\FreeRTOS\Demo\Common\include\serial.h

FreeRTOSv10.2.1\FreeRTOS-Plus\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c和FreeRTOS_CLI.h

FreeRTOSv10.2.1\FreeRTOS-Plus\Demo\Common\FreeRTOS_Plus_CLI_Demos\UARTCommandConsole.c和Sample-CLI-commands.c

注:这里我改成了c++文件,其实是不用改的,原本就是c文件

1、在FreeRTOS_CLI头文件里加上#define configCOMMAND_INT_MAX_OUTPUT_SIZE 500,这是用来定义输出缓存的大小,命令会将数据一次性全部复制到这里面,300起步。太小会因为数组不够导致只能回显一部分。

2、

(1)、在serial源文件里添加:

#include "main.h"

extern UART_HandleTypeDef huart1;

uint8_t aRxBuffer;

(2)、将xSerialPortInitMinimal函数里的开头的部分结构体定义删掉。再把if ((xRxedChars != serINVALID_QUEUE) && (xCharsForTx != serINVALID_QUEUE)){}里的内容替换为HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);,因为串口初始化已经自动被CubeMX配置好了,这条函数的作用是当接收到1字节后就调用HAL_UART_RxCpltCallback函数。

(3)、将xSerialPutChar函数里的if (xQueueSend(xCharsForTx, &cOutChar, xBlockTime) == pdPASS){}里的内容替换为:

xReturn = pdPASS;

uint8_t cChar;

if (xQueueReceive(xCharsForTx, &cChar, 0) == pdTRUE) { while(HAL_UART_Transmit_IT(&huart1, &cChar, 1) != HAL_OK); }。这里不能用阻塞式的函数,否则在回显的时候有问题,还导致接收也有问题。很可能是HAL库的问题,有看到过讨论这种问题的文章,可能和__HAL_LOCK有关。

(4)、删掉vUARTInterruptHandler函数。再添加:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if (huart->Instance == USART1)

{

portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

xQueueSendFromISR(xRxedChars, &aRxBuffer, &xHigherPriorityTaskWoken);

HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);

}

}

3、在UARTCommandConsole源文件里,将

static void prvUARTCommandConsoleTask( void *pvParameters );

void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority );这两条函数声明去掉。

添加extern void vRegisterSampleCLICommands( void );,这个用于添加cli的命令。

注:extern "C"的作用是将函数从C++接口改为C接口,只用C就就只要添加extern void vRegisterSampleCLICommands( void );。

将vUARTCommandConsoleStart函数里的:

xTxMutex = xSemaphoreCreateMutex();

configASSERT( xTxMutex );

移到下面的prvUARTCommandConsoleTask函数里面的for( ;; )的前面,再删掉vUARTCommandConsoleStart函数。

把vRegisterSampleCLICommands函数放到prvUARTCommandConsoleTask的for( ;; )前面。

4、在main源文件里添加extern void prvUARTCommandConsoleTask( void *pvParameters );,再将该函数作为任务函数来配置,栈用128 * 8的大小。

现在在单片机每次开机就会从串口输出一段话。\n和\r都可以作为回车。发送help\n,会将已经添加的命令都发送回来。

注:在Sample-CLI-commands源文件里有两处strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ));,这个函数不对,需要在strlen( "\r\n" )后面写+1,因为需要将最后面的空字符也拼接上去。即使不改,在使时也没发现有问题。

扩展:

说明:打开Sample-CLI-commands源文件的prvRunTimeStatsCommand函数,这样可以查询每个任务的运行时间的占空比。

方法:在CubeMX里打开FreeRTOS的USE_TRACE_FACILITY、USE_STATS_FORMATTING_FUNCTIONS和GENERATE_RUN_TIME_STATS。

在FreeRTOSConfig头文件里的最下面有两个宏定义:

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats

#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue

这两个都是函数名,是自带的弱函数。configureTimerForRunTimeStats函数是一个用于初始化的函数,可以不用。getRunTimeCounterValue函数则是关键,它返回一个值,这个值必须是不断累加的,用于计算任务执行时间的占比。例:

unsigned long getRunTimeCounterValue(void)

{

return xTaskGetTickCount(); //返回当前滴答数

}。在任意文件的任意位置定义这个函数即可。

STM32使用FreeRTOS CLI相关推荐

  1. 基于STM32、FreeRTOS低功耗设计思路和原理

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 如今电池供电的产品很多,电池供电通常设计到一个问题,那就是低功耗. 本文为大家讲讲基于STM32.F ...

  2. 转发:stm32 移植 freertos

    原链接:http://www.51hei.com/bbs/dpj-106526-1.html 看到一篇stm32移植freertos的文章,讲述的最完整. 前言: 由于之前听过太多人抱怨移植FreeR ...

  3. 【STM32】FreeRTOS下载和介绍

    00. 目录 文章目录 00. 目录 01. FreeRTOS下载 02. FreeRTOS文件夹 03. FreeRTOS-Plus文件夹 04. 预留 05. 预留 06. 附录 07. 参考 0 ...

  4. 【STM32】FreeRTOS列表应用示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 任务设计 03. 相关设置 04. 程序设计 05. 实验结果 06. 附录 07. 参考 01. 概述 掌握FreeRTOS中列表和列表项 ...

  5. 【STM32】FreeRTOS列表和列表项详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 列表 03. 列表项 04. 列表相关宏 05. 列表相关函数 5.1 初始化列表 5.2 初始化列表项 5.3 列表项插入函数 5.4 列 ...

  6. 【STM32】FreeRTOS任务挂起和恢复示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 功能描述 03. 任务设计 04. 程序设计 05. 执行结果 06. 附录 07. 参考 01. 概述 任务挂起和恢复,当某个任务要停止运 ...

  7. 【STM32】FreeRTOS任务挂起和恢复API

    00. 目录 文章目录 00. 目录 01. 概述 02. vTaskSuspend函数 03. vTaskResume函数 04. xTaskResumeFromISR函数 05. 预留 06. 附 ...

  8. 【STM32】FreeRTOS创建和删除任务示例(静态方法)(了解)

    00. 目录 文章目录 00. 目录 01. 概述 02. 功能描述 03. 任务设计 04. 程序设计 05. 结果验证 06. 附录 07. 参考 01. 概述 FreeRTOS中创建和删除任务A ...

  9. 【STM32】FreeRTOS创建和删除任务示例(动态方法)

    00. 目录 文章目录 00. 目录 01. 概述 02. 功能描述 03. 任务设计 04. 程序设计 05. 结果验证 06. 附录 07. 参考 01. 概述 FreeRTOS中创建和删除任务A ...

  10. 【STM32】FreeRTOS任务相关API

    00. 目录 文章目录 00. 目录 01. 概述 02. xTaskCreate()函数 03. xTaskCreateStatic()函数 04. xTaskCreateRestricted()函 ...

最新文章

  1. 一、稀疏数组的实际应用和代码实现
  2. Windows平台SSH登录Linux并使用图形化界面
  3. zabbix设置邮件报警
  4. python二十三:装饰器 ?
  5. python svn模块_使用Python实现一键批量更新SVN/Git模块的脚本
  6. 经典C语言程序100例之九二
  7. 用HTML和CSS实现一个漂亮的个人博客页面!
  8. 使用Server 2008新GPO做驱动器映射
  9. 从单片机转到嵌入式Linux的跨度大吗?
  10. 平安夜海报PNG免扣素材来了,全都在这|搜图114
  11. 网络通信数据处理过程
  12. mysql建表常用sql语句
  13. 成都信息工程大学校友小程序设计方案
  14. javaweb项目实训总结_JAVA WEB实训总结
  15. ireport分页后最后多一页空白页
  16. 表单注册表单注册表单注册
  17. EasyExcel web上传下载功能实现
  18. 随感 | 毕设风雨 | 前端之路 | 暗夜与旅人 | 早槐与龙鲤
  19. Oracle sqlldr导入之“MAXIMUM ERROR COUNT EXCEEDED”
  20. 三态内容寻址寄存器(TCAM)

热门文章

  1. Transformer模型详解
  2. ps计算机设置,做着ps电脑卡了怎么办 试试设置这四项
  3. 深度学习--python 读取并显示图片的方法
  4. 触摸屏怎么禁止浏览器窗口的缩放
  5. 一个关于微信微信免费自动投票软件与专门投票的微信群的教程介绍
  6. 微信小程序修改data,页面数据实时更新
  7. virt-manager设置主机和虚拟机之间文件共享
  8. The Flee Plan of Groundhog(DFS)
  9. BOMAPI和DOMAPI
  10. 查看oracle归档日志scn,Oracle 归档日志