8890|4

655

帖子

30

TA的资源

版主

楼主
 

EEDrone开源四旋翼从零开始(6)--FreeRTOS CLI调试 [复制链接]

本帖最后由 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,可以查看各个命令以及介绍:

    输入task-stats,run-time-stats,query-heap可以查看任务状态,运行时间,堆大小。

     输入led start,led stop将会控制灯的开关,输入led on,和led会提示参数错误。

     由于处于开发初级阶段,目前源代码只保留IAR工程文件,除去LWIP库,该版本更新了串口例程,采用LL库中断输出,新增FreeRTOS_Test例程(也即本贴的工程)使用方法参考前面帖子。
YAT下载: YAT-2.0_Gamma-2_Version-1.99.52_x64_(64-bit).zip (7.63 MB, 下载次数: 92)

最新回复

谢谢!  详情 回复 发表于 2018-6-27 18:42

赞赏

2

查看全部赞赏

点赞 关注(1)
个人签名QQ:252669569
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
mark
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
您好,我自己编的工程出现了许多问题,目前就是想您这边有例程么,方便给我一份么。邮箱2375729860@qq.com

点评

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

回复

655

帖子

30

TA的资源

版主

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

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

回复

8

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表