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

lb8820265   2017-2-13 18:20 楼主
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,可以查看各个命令以及介绍:
11.png
输入task-stats,run-time-stats,query-heap可以查看任务状态,运行时间,堆大小。
22.png
输入led start,led stop将会控制灯的开关,输入led on,和led会提示参数错误。
33.png
由于处于开发初级阶段,目前源代码只保留IAR工程文件,除去LWIP库,该版本更新了串口例程,采用LL库中断输出,新增FreeRTOS_Test例程(也即本贴的工程)使用方法参考前面帖子。
YAT下载:
YAT-2.0_Gamma-2_Version-1.99.52_x64_(64-bit).zip (7.63 MB)
(下载次数: 92, 2017-2-13 18:18 上传)
本帖最后由 lb8820265 于 2017-2-17 10:28 编辑
QQ:252669569

回复评论 (4)

mark
点赞  2017-2-17 09:45
您好,我自己编的工程出现了许多问题,目前就是想您这边有例程么,方便给我一份么。邮箱2375729860@qq.com
点赞  2017-2-20 22:14
引用: 一江川水 发表于 2017-2-20 22:14
您好,我自己编的工程出现了许多问题,目前就是想您这边有例程么,方便给我一份么。邮箱

我的程序就在帖子上面的源码地址中,进去后直接点击clone or download就可以了
QQ:252669569
点赞  2017-2-20 23:22
谢谢!
点赞  2018-6-27 18:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复