EEDrone开源四旋翼从零开始(6)--FreeRTOS CLI调试
往期回顾:
ST在16年末对STM32F7的库文件进行了一次重要的升级,推出了LL库,该库与HAL库功能类似,LL库相当于操作寄存器,可分别单独使用也可以共同使用,HAL库的效率低下是受人诟病的,高频率的uart与tim都不敢用,LL库就解决了这个问题。因此接下来的工程中所有的初始化采用HAL库,其他的操作全部使用LL代替。还有一个升级就是使用了Free RTOS 9.0版本,这是一个革命性的升级,支持文件系统和网络功能,还处于实验室阶段,这样就有了更多的选择。
Pixhawk具有nsh,可以用来进行简单的人机交互,这个在FreeRTOS中叫做CLI,目前在F7芯片上还没有Demo,需要移植,下面来简单介绍下移植的要点:
1. 确保串口的收发通顺:
本工程采用LL库使用串口中断收发,结合FreeRTOS的列队用来发送字符串。
2. 复制相关库文件:
下载FreeRTOS,将FreeRTOS_CLI.c/.h,UARTCommandConsole.c,Sample-CLI-commands.c,serial.c/.h复制到自己的工程,其中serial来自stm32f103的demo,需要进行修改。
3. 添加代码:
stm32f7xx_it.c中串口中断入口使用vUARTInterruptHandler(USART3);
“ FreeRTOS_CLI.h”中加#define configCOMMAND_INT_MAX_OUTPUT_SIZE 1000
“UARTCommandConsole.c””中修改参数:#define cmdQUEUE_LENGTH 2000
“UARTCommandConsole.c”修改if( cRxedChar == '\n'|| cRxedChar == '\r' )为(cRxedChar == '\n' ),这是因为在windows中回车是\n\r,会触发两次。
“Sample-CLI-commands.c”中注释vTaskList();,
在启动os前添加vRegisterSampleCLICommands();vUARTCommandConsoleStart(1000, 1 );
这样就可以通常串口进行交互了,下面来使用CLI来打印任务运行情况和占用时间,占用时间需要一个频率非常高的定时器,本工程使用的是5KHz,这个在以前的低效率HAL中是非常吃力的,现在使用LL库运行起来就轻松很多,如果以后因为这个高频率的定时器导致资源吃紧,那么将其移入到os的滴答时钟里面也是可以的。何配置在安富莱_STM32-V6开发板_FreeRTOS教程.pdf中有详细介绍。
CLI可以很方便的添加命令行:
仿照例子轻松写出,例如添加一个LED灯的控制,具有一个参数,用来控制开关。在“Sample-CLI-commands.c”中添加如下函数:
/*
* Implements the led command.
*/
static BaseType_t prvLedCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
/* Structure that defines the "led" command line command. This
takes a variable number of parameters that the command simply echos back one at
a time. */
static const CLI_Command_Definition_t xLed =
{
"led",
"\r\nled [start | stop]:\r\n Starts or stops LED\r\n",
prvLedCommand, /* The function to run. */
1 /* The user can enter any number of commands. */
};
static BaseType_t prvLedCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
{
const char *pcParameter;
BaseType_t lParameterStringLength;
/* Remove compile time warnings about unused parameters, and check the
write buffer is not NULL. NOTE - for simplicity, this example assumes the
write buffer length is adequate, so does not check for buffer overflows. */
( void ) pcCommandString;
( void ) xWriteBufferLen;
configASSERT( pcWriteBuffer );
/* Obtain the parameter string. */
pcParameter = FreeRTOS_CLIGetParameter
(
pcCommandString, /* The command string itself. */
1, /* Return the first parameter. */
&lParameterStringLength /* Store the parameter string length. */
);
/* Sanity check something was returned. */
configASSERT( pcParameter );
/* There are only two valid parameter values. */
if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
sprintf( pcWriteBuffer, "Led started.\r\n" );
}
else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
sprintf( pcWriteBuffer, "Stopping Led.\r\n" );
}
else
{
sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );
}
/* There is no more data to return after this single string, so return
pdFALSE. */
return pdFALSE;
}
复制代码
在vRegisterSampleCLICommands中注册FreeRTOS_CLIRegisterCommand(&xLed );
关于串口调试工具这里推荐使用YAT,最大的好处是可以将常用的命令编写好。
下面来看看效果:
输入help,可以查看各个命令以及介绍:
输入task-stats,run-time-stats,query-heap可以查看任务状态,运行时间,堆大小。
输入led start,led stop将会控制灯的开关,输入led on,和led会提示参数错误。
由于处于开发初级阶段,目前源代码只保留IAR工程文件,除去LWIP库,该版本更新了串口例程,采用LL库中断输出,新增FreeRTOS_Test例程(也即本贴的工程)使用方法参考前面帖子。
源代码地址:https://github.com/EEDrone/Firmware/tree/V0.02_FreeRTOS