关键词不能为空

当前您在: 主页 > 英语 >

5 存储于EEPROM管理

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 18:52
tags:

-

2021年2月1日发(作者:fireball)





这里,我们对



APM EEPROM


存储接口进行讲解。如有问题,可以交流


30175224@< /p>


。新浪


@WalkAnt


,转载本博客文 章,请注明出处,以便更大范围的


交流,谢谢。



第六部分



存储与

EEPROM


管理




详细参考:


/wiki/learning- ardupilot-storage-and-eeprom- manageme


nt/




用户参数、航点、集结点、地图数据以及其他有用的信息需要存储。

ArduPilot


提供


4


个基本 存储接口:



1


、< /p>


AP_HAL::Storage


对象:


e




2

< p>


StorageManager



,是


e


更高级别的封装;



3



DataFla sh


用于日志存储;



4



Posix


IO


函数


,是传统文件系统读写函数。



其他用于永久存储信息的函数库,都是 基于以上


4


种实现。例如:


AP_Pa ram library


(用于处理用户可配置参数)是建立在


StorageManager


库之上的,


< br>StorageManager


库则是基于


AP_HAL ::Storage


之上。


AP_Terrain library


(用于处理地形数据)则是建立在


Posix IO functions


之上,用于操作地形数据库。



1



AP_HAL::Storage library


AP_HAL::Storage

< br>对象适用于所有


ArduPilot


硬件平台。最小支持


4096


字节空间的


存储,一些类似< /p>


PX4v1


的板子有


8K EEPROM



Pixhawk


< br>16K FRAM


。所有这些都封装


< br>AP_HAL::Storage API


中。



e API


,非常简单,仅


3


个函数:



1



init()


,初始化存储系统;

< br>


2



rea d_block()


,读块数据;



3



write_block()


,写 块数据。




之所以这 么简单,是因为


APM


团队鼓励开发者使用

StorageManager API


,而不是


e



只有在代码移植或调试时,


使用

< p>
e


会比较方便


(原文:


Y ou should


only be delving into e when doing bringup of a new board, or when


debugging.


)。




存储空间的大小,



AP_HAL/AP_HAL_Boards.h


文件中的


HAL_STORAGE_SIZE



中定 义,如下:



#define CONFIG_HAL_BOARD_SUBTYPE HAL_BOARD_SUBTYPE_PX4_V2


#define


HAL_STORAGE_SIZE


16384 //


存储空间



16KB


#endif



也就是说,我们不支持动态存储空间的定义。 如果希望使用动态存储空间,可以使用


Posix IO




2



StorageManager library



在将


ArduPilot


代码移植到一个新的硬件板上时,


e A PI


非常简单,但是在


操作存储区时就不那么好使了。我们会采 用


StorageManager



S torageManager library


提供对存储区域“伪连续块”

< p>
(一般用作不同的功能和目的)的访问。正因此我们将存储区


域分配了不同 的功能:



1


、参数区;



2


、飞行区域限制点数据区;



3


、航点数据区;



4


、集结点数据区。




参见:



libraries/Sto rageManager/


,我们可以看到存储区域


的划分:< /p>



const StorageManager::StorageArea


StorageMana ger::layout_copter[STORAGE_NUM_AREAS] PROGMEM = {


// ------------------------ 0-4096


分配给了



AVR


版本的



APM


{ StorageParam, 0, 1536}, // 0x600 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 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


版本用到存储地址是

< br>0-4095




PX4



到地址是


4096-8191



Pixhawk


用到的地址是

8192-16383


。这样的结构,是为了更好的


与之前 的版本兼容。


这样一来,


用户在更新最新的固件时,

< p>
所有之前配置的参数将不会改变,


将继续起作用。



StorageManager API


也提 供对类似整型数的读写访问,


AP_Mission


中就会利用 这



API


来存储和恢复航点数据。< /p>




相关例程(


libraries/StorageManager/examples/

)对


StoageManager layer



AP_HAL::Storage object


进行了测试。它对随机的偏移量、随


机的长度进行了随机的


IO


操作。这也就意味可能会出现跨边界访问。这个例程非常有用,


它用于对


StorageManager API


进行严苛测试,同样对于移植


ArduPilot


到 新硬件平台也


是极为有用的,因为它对


EEPROM

< p>
的访问函数进行了很严格的测试。




注意


StorageTest


是一个毁 坏性的测试,它将会删除你之前存储的参数和航点。一定


要记得测试之前,备份你的配置 。




存储对象的声明,一般如下:



StorageAccess AP_Param::_storage(StorageManager::StorageParam);



又或者



StorageAccess AP_Rally::_storage(StorageManager::StorageRally);


StorageAccess AP_Mission::_stor age(StorageManager::StorageMission);

-


-


-


-


-


-


-


-



本文更新与2021-02-01 18:52,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/594596.html

5 存储于EEPROM管理的相关文章