ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:20.04KB ,
资源ID:6246312      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6246312.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(5 存储于EEPROM管理.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

5 存储于EEPROM管理.docx

1、5 存储于EEPROM管理这里,我们对 APM EEPROM存储接口进行讲解。如有问题,可以交流30175224。新浪WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。第六部分存储与EEPROM管理详细参考:用户参数、航点、集结点、地图数据以及其他有用的信息需要存储。ArduPilot提供4个基本存储接口:1、AP_HAL:Storage对象:hal.storage;2、StorageManager库,是hal.storage更高级别的封装;3、DataFlash用于日志存储;4、PosixIO函数,是传统文件系统读写函数。其他用于永久存储信息的函数库,都是基于以上4种实现

2、。例如:AP_Param library(用于处理用户可配置参数)是建立在StorageManager库之上的,而StorageManager库则是基于AP_HAL:Storage之上。AP_Terrain library(用于处理地形数据)则是建立在Posix IO functions之上,用于操作地形数据库。1、AP_HAL:Storage libraryAP_HAL:Storage对象适用于所有ArduPilot硬件平台。最小支持4096字节空间的存储,一些类似PX4v1的板子有8K EEPROM,Pixhawk有16K FRAM。所有这些都封装在AP_HAL:Storage API中。

3、hal.storage API,非常简单,仅3个函数:1、init(),初始化存储系统;2、read_block(),读块数据;3、write_block(),写块数据。之所以这么简单,是因为APM团队鼓励开发者使用StorageManager API,而不是hal.storage。只有在代码移植或调试时,使用hal.storage会比较方便(原文:You should only be delving into hal.storage when doing bringup of a new board, or when debugging.)。存储空间的大小,在AP_HAL/AP_HAL_Bo

4、ards.h文件中的HAL_STORAGE_SIZE宏中定义,如下:#define CONFIG_HAL_BOARD_SUBTYPE HAL_BOARD_SUBTYPE_PX4_V2#defineHAL_STORAGE_SIZE16384/ 存储空间 16KB#endif也就是说,我们不支持动态存储空间的定义。如果希望使用动态存储空间,可以使用Posix IO。2、StorageManager library在将ArduPilot代码移植到一个新的硬件板上时,hal.storage API非常简单,但是在操作存储区时就不那么好使了。我们会采用StorageManager。StorageMana

5、ger library提供对存储区域“伪连续块”(一般用作不同的功能和目的)的访问。正因此我们将存储区域分配了不同的功能:1、参数区;2、飞行区域限制点数据区;3、航点数据区;4、集结点数据区。参见:libraries/StorageManager/StorageManager.cpp,我们可以看到存储区域的划分:const StorageManager:StorageArea StorageManager:layout_copterSTORAGE_NUM_AREAS PROGMEM = / -0-4096分配给了 AVR版本的 APM StorageParam,0,1536, / 0x600

6、 param bytes StorageMission, 1536,2422, StorageRally,3958,90, / 6 rally points StorageFence,4048,48, / 6 fence points#if STORAGE_NUM_AREAS = 8/ -4096-8192分配给了PX4版本 StorageParam,4096,1280, StorageRally,5376,300, StorageFence,5676,256, StorageMission, 5932,2132, / leave 128 byte gap for/ expansion and

7、 PX4 sentinal#endif#if STORAGE_NUM_AREAS = 12/ Pixhawk/ -8192-16384分配给了 Pixhawk版本 StorageParam,8192,1280,/ 类型偏移量长度 StorageRally,9472,300, StorageFence,9772,256, StorageMission, 10028,6228, / leave 128 byte gap for expansion#endif;对于上面的存储分布,我们可以观察到AVR版本用到存储地址是0-4095,而PX4用到地址是4096-8191,Pixhawk用到的地址是81

8、92-16383。这样的结构,是为了更好的与之前的版本兼容。这样一来,用户在更新最新的固件时,所有之前配置的参数将不会改变,将继续起作用。StorageManager API也提供对类似整型数的读写访问,AP_Mission中就会利用这个API来存储和恢复航点数据。相关例程(libraries/StorageManager/examples/StorageTest.pde)对StoageManager layer和AP_HAL:Storage object进行了测试。它对随机的偏移量、随机的长度进行了随机的IO操作。这也就意味可能会出现跨边界访问。这个例程非常有用,它用于对StorageMan

9、ager API进行严苛测试,同样对于移植ArduPilot到新硬件平台也是极为有用的,因为它对EEPROM的访问函数进行了很严格的测试。注意StorageTest是一个毁坏性的测试,它将会删除你之前存储的参数和航点。一定要记得测试之前,备份你的配置。存储对象的声明,一般如下:StorageAccess AP_Param:_storage(StorageManager:StorageParam);又或者StorageAccess AP_Rally:_storage(StorageManager:StorageRally);StorageAccess AP_Mission:_storage(St

10、orageManager:StorageMission);StorageAccess AP_Limit_Geofence:_storage(StorageManager:StorageFence);3、DataFlash library另一类存储,就是飞行日志存储,这个基于DataFlash library。这个库的名字看上去有些怪怪的,实际上这个库最开始是为APM1的DataFlash芯片设计的,它原本是一个硬件驱动库,后来慢慢演变为一个通用日志系统,这个可以在代码中找到蛛丝马迹(这些都是以前的痕迹,不是最好的代码实现方式)。现在DataFlash API主要用于实现日志存储。它允许你自定义

11、日志消息的数据结构。例如GPS消息,用于记录GPS传感器的日志数据。它能够非常有效存储这些数据,它同时也对其他库提供相应的APIs,用来进行日志回传、下载。LOG数据结构是自定义的,其结构可以查看日志文件的FMT消息。FMT消息地应以的其他数据的存储格式。相关例程libraries/DataFlash/examples/DataFlash_test/DataFlash_test.pde。这里描述了数据的存储结构和数据格式。简单列举如下:第一点,在.log文件中,我们可以看到如下格式的表达:FMT, 128, 89, FMT, BBnNZ, Type,Length,Name,Format,Col

12、umnsFMT, 129, 23, PARM, Nf, Name,ValueFMT, 130, 45, GPS, BIHBcLLeeEefI,Status,TimeMS,Week,NSats,HDop,Lat,Lng,RelAlt,Alt,Spd,GCrs,VZ,TFMT, 131, 31, IMU, Iffffff, TimeMS,GyrX,GyrY,GyrZ,AccX,AccY,AccZFMT, 132, 67, MSG, Z, Message第二点,上述格式,对应的代码(参见DataFlash.h):#defineLOG_BASE_STRUCTURES LOG_FORMAT_MSG, s

13、izeof(log_Format), FMT, BBnNZ,Type,Length,Name,Format,Columns , LOG_PARAMETER_MSG, sizeof(log_Parameter), PARM, Nf,Name,Value , LOG_GPS_MSG, sizeof(log_GPS), GPS,BIHBcLLeeEefI, Status,TimeMS,Week,NSats,HDop,Lat,Lng,RelAlt,Alt,Spd,GCrs,VZ,T , LOG_IMU_MSG, sizeof(log_IMU), IMU,Iffffff,TimeMS,GyrX,GyrY

14、,GyrZ,AccX,AccY,AccZ , 上述结构,以 LOG_IMU_MSG为例讲解:信息类型ID数据大小信息名称数据类型数据1数据2数据3数据4数据5数据6数据7LOG_IMU_MSGsizeof(log_IMU)IMUIffffffTimeMSGyrXGyrYGyrZAccXAccYAccZ13131(字节)IMUl:整型; f:浮点整型464810.000703-0.000190-0.000359-0.1339950.034236-9.748702第三点,日志文件(.log)的一条数据如下:IMU, 46481, 0.000703, -0.000190, -0.000359, -0

15、.133995, 0.034236, -9.748702第四点,消息类型的定义:/ message types for common messages/ 消息类型,对应 FMT 中的消息类型,见日志文件 .log 文件。#define LOG_FORMAT_MSG128#define LOG_PARAMETER_MSG 129#define LOG_GPS_MSG130#define LOG_IMU_MSG131#define LOG_MESSAGE_MSG132#define LOG_RCIN_MSG133#define LOG_RCOUT_MSG134#define LOG_IMU2_MS

16、G135第五点, log_IMU的结构,共占用 3 + 4 + 12 + 12 =31字节。struct PACKEDlog_IMULOG_PACKET_HEADER;/ 3uint32_t timestamp;/ 4float gyro_x, gyro_y, gyro_z;/ 4*3 = 12float accel_x, accel_y, accel_z;/ 4*3 = 12;第六点:如果要增加自定义的数据结构,那么可以像以下代码一样增加。#define LOG_TEST_MSG 1struct PACKED log_Test LOG_PACKET_HEADER;uint16_t v1, v

17、2, v3, v4;int32_tl1, l2;static const struct LogStructure log_structure PROGMEM = LOG_COMMON_STRUCTURES, LOG_TEST_MSG, sizeof(log_Test),/增加自定义格式数据TEST, HHHHii,V1,V2,V3,V4,L1,L2 /增加自定义格式数据;第七点:具体的数据结构操作DataFlash.Init(log_structure, sizeof(log_structure)/sizeof(log_structure0);log_num = DataFlash.Start

18、NewLog();DataFlash.WriteBlock(&pkt, sizeof(pkt);DataFlash API隐藏了底层如何存储log文件的细节。另外,对于Pixhawk or Linux这样的支持 Posix IO的系统,日志文件是存储在microSD卡的“LOGS”目录中的。用户可以直接抽出SD卡,直接拷贝到电脑中。4、Posix IO有些板子是带操作系统的,支持类似Posix API,如Linux和NuttX。AP_Terrain library就是一个典型的例子。地形数据对于EEPROM是非常的大,经常要随机的存储。DataFlash API就不够灵活了,同时又了Posix

19、 IO支持,也就没必要再用DataFlash了。查看AP_HAL_Boards.h文件,确认HAL_OS_POSIX_IO宏已定义,如下:#defineHAL_OS_POSIX_IO1/ 带文件系统,has posix-like filesystem IO下面给出了LOG 和 TERRAIN 文件存放路径:#define HAL_BOARD_LOG_DIRECTORY /fs/microsd/APM/LOGS/ LOG 日志文件地址#define HAL_BOARD_TERRAIN_DIRECTORY /fs/microsd/APM/TERRAIN / 地表、地形文件地址有上述信息,就表示支持

20、Posix IO 功能,另外需要说明的是:1、Posix IO函数,智能通过IO timer定时器,或者其他低优先级线程调用。IO线程优先级59。2、不要通过其他API直接调用,哪怕是简单stat()函数,都不可以,除非你长得太帅。3、尽量少存储,存储数据长度小,尽量少用seek(搜寻)功能。很简单,一个原则,不要太耗时,影响飞控代码执行。一个简单的针对SD卡的IO操作有可能花上一秒钟,这段时间足够让你的飞行器翻转,垂直掉落,直接炸鸡了。Pixhawk SD卡读写操作一般几毫秒,偶尔花费的时间会很长。现在在你知道这么做了?相关例程libraries/AP_Terrain/TerrainIO.cpp,我们会发现处理IO的状态机都是通过AP_Terrain:io_timer调用的。前面的文章:Pixhawk源码笔记一:APM代码基本结构:Pixhawk源码笔记二:APM线程:Pixhawk源码笔记三:串行接口UART和Console:Pixhawk源码笔记四:学习RC Input and Output

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1