Usando o armazenamento no Azure Sphere

Este tópico descreve como usar o armazenamento em um dispositivo do Azure Sphere. O Azure Sphere fornece dois tipos de armazenamento, armazenamento flash somente leitura e armazenamento mutável.

O armazenamento somente leitura é usado para armazenar pacotes de imagens de aplicativo em um dispositivo para que o conteúdo não possa ser modificado sem atualizar o aplicativo. Isso pode incluir dados como ativos de interface do usuário, dados de configuração estáticos, recursos binários, incluindo imagens de firmware usadas para atualizar MCUs externas ou dados de inicialização para armazenamento mutável. A memória disponível para aplicativos fornece detalhes adicionais sobre a quantidade de armazenamento disponível.

O armazenamento mutável armazena dados que persistem quando um dispositivo é reiniciado. Por exemplo, se você quiser gerenciar o tempo do sistema usando o fuso horário local, poderá armazenar as configurações de fuso horário no armazenamento mutável. Alguns outros exemplos são configurações que um usuário pode modificar ou baixar dados de configuração. O exemplo de armazenamento mutável mostra como usar o armazenamento mutável em um aplicativo.

Nota

Atualizar repetidamente o flash eventualmente o desgasta e o torna inválido. Portanto, você deve projetar seu código para evitar atualizações desnecessárias do flash. Por exemplo, se você quiser salvar o estado do aplicativo antes de sair para que possa recuperar o estado salvo após uma reinicialização, considere salvar o estado do aplicativo no flash somente se o estado tiver sido alterado.

Usando o armazenamento somente leitura

Você pode usar essas funções Applibs para gerenciar o armazenamento somente leitura. Para obter um exemplo que usa essas funções, consulte Conectar-se aos serviços Web usando curl.

Requisitos de armazenamento somente leitura

Os aplicativos que usam armazenamento somente leitura devem incluir os arquivos de cabeçalho apropriados.

Inclua os cabeçalhos de armazenamento e unistd em seu projeto:

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

Adicionar um arquivo a um pacote de imagem

Para adicionar um arquivo ao armazenamento somente leitura no dispositivo do Azure Sphere, você pode adicioná-lo ao seu projeto como um recurso e incluí-lo no pacote de imagens do aplicativo. Use essas funções no CMakeLists.txt para adicionar o arquivo como um recurso:

  • Use azsphere_target_add_image_package para especificar o arquivo de pacote de imagem e todos os arquivos de recursos a serem incluídos ao criar. Por exemplo:

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

Os arquivos "file1.dat" e "file2.dat" agora devem aparecer no pacote de imagem. Consulte Usar funções CMake para obter mais informações sobre essas funções.

Nota

Não há suporte para caminhos absolutos para RESOURCE_FILES.

Usando o armazenamento mutável

Quando você configura o armazenamento mutável para seu aplicativo, ele é atribuído à ID do componente do aplicativo e não pode ser acessado por um aplicativo que tem uma ID de componente diferente. Se a ID do componente do aplicativo for alterada, o novo aplicativo não terá acesso ao armazenamento mutável do aplicativo anterior.

Se você excluir um aplicativo de um dispositivo, o armazenamento mutável atribuído ao aplicativo também será excluído. Se o mesmo aplicativo for carregado novamente no dispositivo, o armazenamento mutável ficará vazio. No entanto, se você atualizar o aplicativo sem excluí-lo, o conteúdo de armazenamento mutável será mantido.

O comando azsphere device app show-quota exibe a quantidade de armazenamento mutável atualmente em uso.

O sistema operacional do Azure Sphere tem mecanismos de proteção contra perda de energia em vigor para evitar a corrupção de metadados críticos do estado de configuração e do sistema de arquivos. A API de armazenamento mutável se beneficia desses recursos. No entanto, o conteúdo real do armazenamento mutável depende se, e em que ordem, os buffers são liberados, portanto, não há garantia de que todas as alterações pendentes no momento da perda de energia serão refletidas no próprio arquivo após a recuperação.

Você pode usar essas funções applibs para gerenciar dados de armazenamento mutáveis:

Requisitos de armazenamento mutáveis

Os aplicativos que usam o armazenamento mutável devem incluir os arquivos de cabeçalho apropriados e adicionar configurações de armazenamento mutáveis ao manifesto do aplicativo.

Arquivos de cabeçalho para armazenamento mutável

Inclua os cabeçalhos de armazenamento e unistd em seu projeto:

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

Manifesto do aplicativo

Para usar as APIs neste tópico, você deve adicionar o MutableStorage recurso ao manifesto do aplicativo e, em seguida, definir o SizeKB campo. O campo SizeKB é um inteiro que especifica o tamanho do armazenamento mutável em kibibytes. O valor máximo é 64 e o armazenamento é alocado de acordo com o tamanho do bloco de apagamento do dispositivo. A alocação é feita arredondando o valor SizeKB para o próximo tamanho do bloco se o valor não for um múltiplo inteiro do tamanho do bloco do dispositivo.

Nota

O MT3620 tem um tamanho de bloco de apagamento de 8 KB, portanto, todos os valores que não são múltiplos de 8 serão arredondados. Por exemplo, se você especificar 12 KB no recurso 'MutableStorage', receberá 16 KB em um MT3620.

No exemplo abaixo, o recurso de armazenamento MutableStorage é adicionado ao manifesto do aplicativo com um tamanho de 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
  }
}

Gravar dados persistentes

Para gravar dados no armazenamento persistente, comece chamando a função Applibs Storage_OpenMutableFile para recuperar um descritor de arquivo para um arquivo de dados persistente. Em seguida, chame a write função para gravar os dados no arquivo de dados persistente. Se a quantidade de dados que você tenta gravar exceder sua alocação de armazenamento mutável, a função de gravação poderá ter êxito; no entanto, os únicos dados gravados serão a parte que não excede a alocação de armazenamento. Para garantir que todos os dados sejam gravados, você deve marcar o valor retornado da chamada de write função.

Ler dados persistentes

Para ler dados da chamada de armazenamento persistente Storage_OpenMutableFile recuperar um descritor de arquivo para o arquivo de dados persistente e, em seguida, chamar a read função para ler os dados.

Excluir dados persistentes

Para excluir dados da chamada de armazenamento persistente Storage_DeleteMutableFile.