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?
Respostas:
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.
fonte
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.
( Techtarget.com: nivelamento de desgaste )
fonte
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 .
Você pode atualizar os blocos e depois trocá-los.
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.
fonte