Como posso fazer atualizações incrementais com um flash que só pode ser apagado em blocos?

11

Cenário

Desejo atualizar um dispositivo IoT de baixo custo pelo ar com o novo firmware atualizando os microcontroladores do dispositivo. A memória do microcontrolador é uma memória flash na faixa de 32k a 128k (cada centavo conta). Essa memória barata tem uma grande limitação: só pode ser apagada em blocos.

Questão

Isso significa que não posso fazer atualizações diferenciais ( delta )? Sempre preciso atualizar toda a memória do controlador (ou pelo menos partes substanciais)?

Quero reduzir a necessidade de exibir tudo em flash e correr o risco de bloquear o dispositivo completamente, tanto quanto possível. Existem estratégias existentes ao piscar microcontroladores no ar?

Helmar
fonte
O que é mais importante para você, custo ou menor taxa de risco?
Bence Kaulics
@BenceKaulics encontrando o equilíbrio certo entre os dois, eu acho. Afinal, um risco de tijolo também é um custo (ponderado).
Helmar

Respostas:

8

A resposta simples é sim - você precisa de blocos de flash suficientes para suportar imagens do carregador de inicialização e código A / B, se desejar alta confiabilidade. Antes de ativar a nova imagem, você pode escrever a coisa toda, verificar e potencialmente tentar novamente.

No entanto, essa é uma estratégia cara / confiável e há coisas que você pode fazer para reduzir a sobrecarga. O suporte de baixo nível para atualizações do OTA também pode ser parte do firmware do dispositivo ou do SO, para que você possa evitar o uso de seus próprios recursos, a menos que queira aprender. Esse recurso pode ser descrito como FOTA.

O particionamento da sua base de código permite atualizações incrementais; na melhor das hipóteses, o gerenciador de inicialização é capaz de ativar a conexão de rede, fazer o download e verificar o código sem precisar de nenhum código de usuário substituto. Com um gateway local, o gerenciamento desta tarefa pode ser delegado a partir dos pontos de extremidade de baixo custo.

Muitos dispositivos possuem uma pequena quantidade de flash para apagar palavras e, mesmo com essa falha, você pode definir bits sem precisar apagar um bloco inteiro. Esses recursos podem ser usados ​​para manipular tabelas de salto e unir códigos atualizados em blocos de tamanhos de blocos. Mesmo se você planejou inicialmente um espaço de código A / B completo, pode ser necessário voltar a um esquema mais complexo quando a base de código crescer demais.

Para esclarecer a funcionalidade que pode ser alcançada com uma solução sofisticada de firmware por via aérea, o carregador de inicialização e potencialmente uma pilha de comunicação primária podem permanecer residentes enquanto o espaço restante total do aplicativo do usuário é reapresentado. Isso não precisa de sobrecarga (principalmente se o particionamento de bloco for suave). No cenário em que a pilha de comunicação precisa ser atualizada, a região geralmente usada para o código do aplicativo pode ser temporariamente usada durante o download e a verificação. Conseguir isso requer algum suporte no SoC, mas os dispositivos de segunda e terceira geração projetados com isso em mente já existem.

Sean Houlihane
fonte
6

Quero reduzir a necessidade de exibir tudo em flash e correr o risco de bloquear o dispositivo completamente, tanto quanto possível. Existem estratégias existentes ao piscar microcontroladores no ar?

Além do código que faz a atualização que seria relativamente estática, você precisa manter duas imagens em seu armazenamento: uma imagem ativa e uma imagem de backup. Sempre que você precisar atualizar, faça-o no backup e mude para que fique ativo. Depois de estável, atualize a imagem ativa antiga, que agora deve ser seu backup.

Com isso em mente, você pode usar algoritmos de nível de desgaste ao atualizar as duas imagens. O código para esses algoritmos pode levar de 10 a 15% do armazenamento total, mas vale a pena estender a vida útil do dispositivo.

O nivelamento de desgaste é geralmente gerenciado pelo controlador flash, que usa um algoritmo de nivelamento de desgaste para determinar qual bloco físico usar cada vez que os dados são programados. Existem dois tipos de nivelamento de desgaste da unidade de estado sólido (SSD): dinâmico e estático. O nivelamento dinâmico de desgaste agrupa blocos apagados e seleciona o bloco com a menor contagem de apagamentos para a próxima gravação.

O nivelamento estático de desgaste, por outro lado, seleciona o bloco de destino com a menor contagem geral de apagamento, apaga o bloco, se necessário, grava novos dados no bloco e garante que os blocos de dados estáticos sejam movidos quando a contagem de apagamento de blocos estiver abaixo de uma certo limiar. Essa etapa adicional de mover dados pode diminuir o desempenho de gravação devido à sobrecarga no controlador flash, mas o nivelamento estático de desgaste é consideravelmente mais eficaz que o nivelamento dinâmico de desgaste para prolongar a vida útil dos dispositivos de estado sólido.

( Techtarget.com: nivelamento de desgaste )

Leon Carlo Valencia
fonte
6

A Freescale Semiconductor descreve uma maneira robusta de atualização de firmware sem fio para seus microcontroladores Kinetis .

É chamado: Programa de troca de memória flash .

Sistemas que utilizam troca de memória flash

Em dispositivos com dois ou mais blocos flash internos que suportam troca, o endereço base da memória de cada bloco flash pode ser trocado. A localização do endereço de cada bloco flash será trocada no mapa de memória lógica do dispositivo. Após uma redefinição, o sistema de troca de flash embutido basicamente seleciona qual software é executado pela localização do bloco de flash no mapa de memória lógica. Isso permite um sistema de backup de código com a facilidade adicional de programação. Você pode executar fora de um bloco enquanto apaga / programa o outro bloco. Nos dispositivos Kinetis, o sistema de troca instantânea monitora / controla todas as etapas da mudança do aplicativo antigo para o novo; há uma garantia adicional de operação confiável em caso de perda de energia durante uma dessas etapas.

Vantagens

  • Facilidade de programação. O aplicativo sempre é executado fora do bloco inferior no mapa de memória.
  • Tolerante à perda de energia.
  • Nenhum carregador de inicialização é necessário. Sem demora para o início do aplicativo principal.
  • Adequado para um sistema operacional multitarefa. Tempo de inatividade mínimo do aplicativo. Em um sistema multitarefa, é possível continuar executando as principais tarefas do aplicativo enquanto estão em execução tarefas em segundo plano para atualizar a nova cópia do aplicativo.
  • Cópia de backup do código. Possível reverter para o aplicativo de trabalho conhecido.

Desvantagens

  • Espaço adicional na memória flash necessário para armazenar a cópia de segurança.

Você pode atualizar os blocos e depois trocá-los.

troca de memória durante a atualização visualizada

O documento vinculado contém uma descrição detalhada.

Ele garante atualizações de firmware mais seguras, mas como requer mais memória flash, certamente custa mais . Também não é aplicável a qualquer tipo de microcontrolador, apenas aqueles que suportam troca de blocos flash internos.

Bence Kaulics
fonte
2
Isso parece ótimo e parece uma solução que certamente deve ser considerada se puder ser equilibrada com os requisitos de custo. + 1
Helmar