社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 2574|回复: 3

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

[复制链接]

450

TA的帖子

21

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-2-13 18:20:05 | 显示全部楼层 |阅读模式
本帖最后由 lb8820265 于 2017-2-17 10:28 编辑

      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, 下载次数: 67)

评分

2

查看全部评分

QQ:252669569


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-17 09:45:24 | 显示全部楼层
mark


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-20 22:14:53 | 显示全部楼层
您好,我自己编的工程出现了许多问题,目前就是想您这边有例程么,方便给我一份么。邮箱2375729860@qq.com

点评

我的程序就在帖子上面的源码地址中,进去后直接点击clone or download就可以了  详情 回复 发表于 2017-2-20 23:22


回复

使用道具 举报

450

TA的帖子

21

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-20 23:22:14 | 显示全部楼层
一江川水 发表于 2017-2-20 22:14
您好,我自己编的工程出现了许多问题,目前就是想您这边有例程么,方便给我一份么。邮箱

我的程序就在帖子上面的源码地址中,进去后直接点击clone or download就可以了
QQ:252669569


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-12-18 20:41 , Processed in 0.235885 second(s), 17 queries , Redis On.

快速回复 返回顶部 返回列表