在 Azure Sphere 上使用存储

本主题介绍如何在 Azure Sphere 设备上使用存储。 Azure Sphere 提供两种类型的存储:只读闪存存储和可变存储。

只读存储用于在设备上存储应用程序映像包,因此如果不更新应用程序,就无法修改内容。 这可以包括任何数据,例如用户界面资产、静态配置数据、二进制资源(包括用于更新外部 MCU 的固件映像)或用于可变存储的初始化数据。 可用于应用程序的内存 提供有关可用存储量的其他详细信息。

可变存储存储在设备重新启动时保留的数据。 例如,如果要使用本地时区 管理系统时间 ,可以将时区设置存储在可变存储中。 其他一些示例包括用户可以修改的设置或下载的配置数据。 可变存储示例演示如何在应用程序中使用可变存储。

注意

反复更新闪光灯最终会将其磨损并使其无效。 因此,应设计代码以避免不必要的闪存更新。 例如,如果要在退出之前保存应用程序状态,以便可以在重启后恢复保存的状态,请考虑仅在状态已更改的情况下将应用程序的状态保存到闪存。

使用只读存储

可以使用这些 Applibs 函数来管理只读存储。 有关使用这些函数的示例,请参阅 使用 curl 连接到 Web 服务

只读存储要求

使用只读存储的应用程序必须包含相应的头文件。

在项目中包括存储和未设置标头:

#include <unistd.h>
#include <applibs/storage.h>

将文件添加到映像包

若要将文件添加到 Azure Sphere 设备上的只读存储,可以将其作为资源添加到项目中,并将其包含在应用程序的映像包中:

  • 使用 azsphere_target_add_image_package 来指定要在生成时包含的映像包文件和任何资源文件。 例如:

    azsphere_target_add_image_package(${PROJECT_NAME} RESOURCE_FILES "file1.dat" "file2.dat")

“file1.dat”和“file2.dat”文件现在应显示在映像包中。 有关这些 函数的详细信息,请参阅使用 CMake 函数。

注意

RESOURCE_FILES不支持绝对路径。

使用可变存储

为应用程序配置可变存储时,它将分配给应用程序的组件 ID,并且不能由具有不同组件 ID 的应用程序访问。 如果应用程序的组件 ID 发生更改,则新应用程序将无法访问上一个应用程序的可变存储。

如果从设备中删除应用程序,则分配给该应用程序的可变存储也会被删除。 如果随后将同一应用程序加载回设备,则可变存储将为空。 但是,如果在不删除应用程序的情况下更新应用程序,则会维护可变存储内容。

az sphere device app show-quota 命令显示当前正在使用的可变存储量。

Azure Sphere OS 具有断电保护机制,可避免关键配置状态和文件系统元数据损坏。 可变存储 API 受益于这些功能。 但是,可变存储的实际内容取决于是否刷新缓冲区以及刷新顺序,因此不能保证在断电时的所有挂起的更改将在恢复后反映在文件本身中。

可以使用以下 Applibs 函数来管理可变存储数据:

可变存储要求

使用可变存储的应用程序必须包含相应的头文件,并将可变存储设置添加到 应用程序清单

可变存储的头文件

在项目中包括存储和未设置标头:

#include <unistd.h>
#include <applibs/storage.h>

应用程序清单

若要使用本主题中的 API,必须将 功能添加到MutableStorage应用程序清单,然后设置 SizeKB 字段。 SizeKB 字段是一个整数,指定可变存储的大小(以千字节为单位)。 最大值为 64,根据设备的擦除块大小分配存储。 如果值不是设备的块大小的整个倍数,则通过将 SizeKB 值舍入到下一个块大小来完成分配。

注意

MT3620 的擦除块大小为 8 KB,因此任何不是 8 倍的值都将进行舍入。 例如,如果在“MutableStorage”功能中指定 12 KB,则会在 MT3620 上收到 16 KB。

在下面的示例中,MutableStorage 存储功能已添加到大小为 8 KB 的应用程序清单中。

{
  "SchemaVersion": 1,
  "Name" : "Mt3620App_Mutable_Storage",
  "ComponentId" : "9f4fee77-0c2c-4433-827b-e778024a04c3",
  "EntryPoint": "/bin/app",
  "CmdArgs": [],
   "Capabilities": {
    "AllowedConnections": [],
    "AllowedTcpServerPorts": [],
    "AllowedUdpServerPorts": [],
    "MutableStorage": { "SizeKB": 8 },
    "Gpio": [],
    "Uart": [],
    "WifiConfig": false,
    "NetworkConfig": false,
    "SystemTime": false
  }
}

写入持久性数据

若要将数据写入持久性存储,请首先调用 Applibs 函数 Storage_OpenMutableFile 检索永久性数据文件的文件描述符。 接下来调用 write 函数,将数据写入永久性数据文件。 如果尝试写入的数据量超过可变存储分配,则写入函数可能会成功;但是,写入的唯一数据是不超过存储分配的部分。 为确保写入所有数据,必须检查函数调用的write返回值。

读取持久性数据

若要从持久存储读取数据 ,请调用 Storage_OpenMutableFile 检索持久数据文件的文件描述符,然后调用 read 函数来读取数据。

删除持久性数据

若要从持久存储中删除数据 ,请调用 Storage_DeleteMutableFile