EEDrone开源四旋翼从零开始(6)--FreeRTOS CLI调试

往期回顾:

EEDrone开源四旋翼从零开始(1)——项目计划与进展

EEDrone开源四旋翼从零开始(2)--引脚的讨论

EEDrone开源四旋翼从零开始(3)--软件框架的讨论

EEDrone开源四旋翼从零开始(4)--DEMO开发

EEDrone开源四旋翼从零开始(5)--git基础

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”中添加如下函数:

  1. /*

  2. * Implements the led command.

  3. */

  4. static BaseType_t prvLedCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

  5. /* Structure that defines the "led" command line command.  This

  6. takes a variable number of parameters that the command simply echos back one at

  7. a time. */

  8. static const CLI_Command_Definition_t xLed =

  9. {

  10. "led",

  11. "\r\nled [start | stop]:\r\n Starts or stops LED\r\n",

  12. prvLedCommand, /* The function to run. */

  13. 1 /* The user can enter any number of commands. */

  14. };

  15. static BaseType_t prvLedCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

  16. {

  17. const char *pcParameter;

  18. BaseType_t lParameterStringLength;

  19. /* Remove compile time warnings about unused parameters, and check the

  20. write buffer is not NULL.  NOTE - for simplicity, this example assumes the

  21. write buffer length is adequate, so does not check for buffer overflows. */

  22. ( void ) pcCommandString;

  23. ( void ) xWriteBufferLen;

  24. configASSERT( pcWriteBuffer );

  25. /* Obtain the parameter string. */

  26. pcParameter = FreeRTOS_CLIGetParameter

  27. (

  28. pcCommandString,           /* The command string itself. */

  29. 1,                                                    /* Return the first parameter. */

  30. &lParameterStringLength       /* Store the parameter string length. */

  31. );

  32. /* Sanity check something was returned. */

  33. configASSERT( pcParameter );

  34. /* There are only two valid parameter values. */

  35. if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )

  36. {

  37. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);

  38. sprintf( pcWriteBuffer, "Led started.\r\n" );

  39. }

  40. else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )

  41. {

  42. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);

  43. sprintf( pcWriteBuffer, "Stopping Led.\r\n" );

  44. }

  45. else

  46. {

  47. sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );

  48. }

  49. /* There is no more data to return after this single string, so return

  50. pdFALSE. */

  51. return pdFALSE;

  52. }

复制代码

在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

(0)

相关推荐