-
这里,我们对
APM EEPROM
存储接口进行讲解。如有问题,可以交流
30175224@<
/p>
。新浪
@WalkAnt
,转载本博客文
章,请注明出处,以便更大范围的
交流,谢谢。
第六部分
存储与
EEPROM
管理
详细参考:
/wiki/learning-
ardupilot-storage-and-eeprom-
manageme
nt/
用户参数、航点、集结点、地图数据以及其他有用的信息需要存储。
ArduPilot
提供
4
个基本
存储接口:
1
、<
/p>
AP_HAL::Storage
对象:
e
;
2
、
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
。
只有在代码移植或调试时,
使用
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
文件中的
p>
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
提供对存储区域“伪连续块”
(一般用作不同的功能和目的)的访问。正因此我们将存储区
域分配了不同
的功能:
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
。这样的结构,是为了更好的
与之前
的版本兼容。
这样一来,
用户在更新最新的固件时,
所有之前配置的参数将不会改变,
将继续起作用。
StorageManager API
也提
供对类似整型数的读写访问,
AP_Mission
中就会利用
这
个
API
来存储和恢复航点数据。<
/p>
相关例程(
libraries/StorageManager/examples/
)对
StoageManager
layer
和
AP_HAL::Storage object
进行了测试。它对随机的偏移量、随
机的长度进行了随机的
p>
IO
操作。这也就意味可能会出现跨边界访问。这个例程非常有用,
它用于对
StorageManager API
进行严苛测试,同样对于移植
ArduPilot
到
新硬件平台也
是极为有用的,因为它对
EEPROM
的访问函数进行了很严格的测试。
注意
StorageTest
是一个毁
坏性的测试,它将会删除你之前存储的参数和航点。一定
要记得测试之前,备份你的配置
。
存储对象的声明,一般如下:
StorageAccess
AP_Param::_storage(StorageManager::StorageParam);
又或者
StorageAccess
AP_Rally::_storage(StorageManager::StorageRally);
StorageAccess AP_Mission::_stor
age(StorageManager::StorageMission);
-
-
-
-
-
-
-
-
-
上一篇:ADS40与ADS80相机诸元比较
下一篇:常用文件扩展名和它们的说明.