FreeRTOS简介 | 少将全栈
  • 欢迎访问少将全栈,学会感恩,乐于付出,珍惜缘份,成就彼此、推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。
  • 吐槽,投稿,删稿,交个朋友
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏少将全栈吧

FreeRTOS简介

嵌入式 admin 10年前 (2015-06-27) 4552次浏览 已收录 扫描二维码

在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。

作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。
FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。
FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用
时间。

FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺
低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任
务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率.

Crazepony-II的FreeRTOS移植

目前稳定的裸机程序已暴露出很多弊端,比如CPU资源浪费问题,处理任务单一,只能是中断嵌套或者CPU轮询机制去处理各类事件,CPU空挡期远大于实际利用期.
所以,目前我们正专人负责移植FreeRTOS系统,在系统层面做到兼容Bitcraze的crazefile固件,在这期间肯定会遇到很多问题,这都需要大家在实际体验过程中发现并解决问题,在Crazepony这个平台更加稳定,更加成熟.

介绍几个常用的宏的作用

在Crazyflie的固件代码中,宏一般都定义在文件Makefile中。使用CFLAGS += -D的方式添加。

# Flag that can be added to config.mk
CFLAGS += -DUSE_UART_CRTP        # Set CRTP link to UART
CFLAGS += -DUSE_ESKYLINK         # Set CRTP link to E-SKY receiver
CFLAGS += -DENABLE_UART          # To enable the uart
CFLAGS += -DDEBUG_PRINT_ON_UART  # Redirect the console output to the UART 

ENABLE_UART

启用串口打印功能。要想调试期间把信息打印到串口,还需要加上宏:DEBUG_PRINT_ON_UART

USE_UART_CRTP

crtp模块为:Crazy Realtime Transfer Protocol stack,是crazy flie的通信协议栈。通信链路可以2.4G 遥控信息,可以使用USE_ESKYLINK,也可以使用串口。若要使用蓝牙模块作为通信链路,应该开启此宏。

DEBUG_PRINT_ON_UART

使用串口调试。在平衡算法当中进行调试的时候,串口打印显得尤为重要,通过此宏可以开启串口调试。注意:开启串口调试的时候不能开启宏USE_UART_CRTP,串口作为通信链接。

BOARD_2

此宏在drivers/i2c_gpio.c文件中。因为版本2与版本3的i2c部分引脚有区别,去掉此宏定义适用于第三版的硬件

系统流程框架

介绍系统的初始化流程,以及系统任务之间的关系。

系统任务

最关心的是系统中由多少个任务在运行。在FreeRTOS下,任务的初始化使用函数。所以,用grep命令参看一下源代码,可以看到一共有下面这些系统初始化的任务:

$ grep -inIw ’xTaskCreate’ -r ./hal/ ./modules/
./hal/src/eskylink.c:312:  xTaskCreate(eskylinkTask, (const signed char * const)"EskyLink",
./hal/src/pm.c:111:  xTaskCreate(pmTask, (const signed char * const)"PWRMGNT",
./hal/src/uart.c:145:  xTaskCreate(uartRxTask, (const signed char * const)"UART-Rx",
./hal/src/radiolink.c:237:  xTaskCreate(radiolinkTask, (const signed char * const)"RadioLink",
./modules/src/stabilizer.c:157:  xTaskCreate(stabilizerTask, (const signed char * const)"STABILIZER",
./modules/src/crtp.c:77:  xTaskCreate(crtpTxTask, (const signed char * const)"CRTP-Tx",
./modules/src/crtp.c:79:  xTaskCreate(crtpRxTask, (const signed char * const)"CRTP-Rx",
./modules/src/info.c:68:  xTaskCreate(infoTask, (const signed char * const)"Info",
./modules/src/log.c:171:  xTaskCreate(logTask, (const signed char * const)"log",
./modules/src/pidctrl.c:43:  xTaskCreate(pidCrtlTask, (const signed char * const)"PIDCrtl",
./modules/src/param.c:92:   xTaskCreate(paramTask, (const signed char * const)"PARAM",
./modules/src/system.c:68:  xTaskCreate(systemTask, (const signed char * const)"SYSTEM", 

所有的任务在创建之后,都会进入while(1)的循环中,也就是任务一直循环运行。

任务之间的关系

那么任务之间的关系是怎么样的呢,如何各司其职完成系统的控制呢。下面使用一个简图进行了说明,逻辑主线是控制数据的传递。

FreeRTOS简介

通信部分介绍

通信协议指的是遥控端和主控之间交互数据的封装,是一种自行约定的数据封装格式。我们采用的是Crazyflie项目中定义的CRTP协议

遥控端和主控之间数据的交互,物理层可以有下面几种方式:

  • 单片2.4G无线射频收发芯片,通过SPI接口和MCU连接
  • 蓝牙2.1透传模块,通过串口UART和MCU连接
  • 蓝牙4.0低功耗BLE透传模块,通过串口UART和MCU连接

这几种不同的物理层通信方式在同一时刻只能够选择其中的一种。并且蓝牙2.1和蓝牙BLE根据安装的透传模块不一样进行选择。

FreeRTOS简介

ESky Protocol

在上面示意图的的通信方式选择上,最左边为EskyLink,对应使用宏USE_ESKYLINK来开启是否选择该种链接方式。

# Make copter firmware to be used with the bootloader, CF controlled with eSky ET6i transmitter

$ make clean && make USE_ESKYLINK=1 CLOAD=1 all 

所谓的Esky Protocol,其实就是ESky公司遥控器使用的通信协议。所以如果选用这种通信方式,那么可以使用ESky航模公司的遥控器进行控制。Crazyflie官网支持ESKY ET6I Remote Control遥控器。

关于ESky公司的2.4G遥控器设备的通信协议,参考ArduinoRCLib项目中的描述:

The Esky 2.4 GHz equipment uses the Nordic NRF2401AG in both the
transmitter and receiver. A compatible alternative to this chip is the
NRF24L01+ (which is widely available).

ESky相关协议内容暂时不研究。

串口

使用串口作为物理层指的是蓝牙透传模块(包括蓝牙2.1或者蓝牙4.0 BLE模块)。串口配置为115200 8N1,收发异步。

一个可供主控解析的数据包格式,约定如下:

 7   6   5   4   3   2   1   0
  |     Port      |  Res. | Chan. | 
  |            DATA 0             |
  :   :   :   :   :   :   :   :   :
  |            DATA 31            | 

开始为一个字节的头,该字节中包括port字段,reserve字段,channel字段。紧跟着该自己,就是0-31个字节的数据,数据的长度是任意的。

头字节中的port字段用来区分该数据包的功能,常见的包括下面几个

  • 0x0 : console
  • 0x2 : parameter,表示后面的数据是系统的参数
  • 0x3 : commander,操作命令,控制飞机的飞行,包括pitch/yaw/roll等
  • ……

对于串口传输,在上面数据包的最前面需要加上两个字节0xaaaa的起始数据,在最后加上一个字节的checksum数据。格式如下:

 7   6   5   4   3   2   1   0
  |             0xAA              |
  |             0xAA              |
  |      Port     |  Res  | Chan. |
  |         Packet length         |
  |            DATA 0             |
  :   :   :   :   :   :   :   :   :
  |            DATA 30            |
  |            Cksum              |

  |  0xAA  |  0xAA  | Header | Length | Data0  | Packet | Cksum  | 

注意,紧跟在头后面的第一个data字节,表示后面数据的长度。

操作命令

操作命令是指用于控制飞行器起飞,前后左右运动的命令,英文commander。操控命令是遥控器最基本,也是最常用的命令。数据包头中port字段为0x3表示操作命令。Crazyflie操作数据格式约定如下。

| ROLL  | PITCH |  YAW  |THRUST |
0       4       8       12      14 bytes 

操作数据一共14个字节,前12个字节分别表示Roll,Pitch,Yaw的值,每个值使用4个字节。后2个字节表示Thrust的值,使用2个字节。

所以,使用串口发送的一个操作命令示例如下:

0xaa 0xaa 0x30 0x0e 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x3e



转载自:http://www.crazepony.com/book/

喜欢 (0)
[🍬谢谢你请我吃糖果🍬🍬~]
分享 (0)
关于作者:
少将,关注Web全栈开发、项目管理,持续不断的学习、努力成为一个更棒的开发,做最好的自己,让世界因你不同。