3 Comentários

Scan Memory: Checando a integridade da memória Flash no PIC18F47K40

PIC18F47K40

No mundo dos produtos eletrônicos sabe-se que o termo “segurança” deixou há muito tempo de servir apenas de ferramenta de marketing, para tornar-se uma característica essencial na maioria dos dispositivos desenvolvidos com o mínimo de seriedade pelos seus projetistas. Normas reguladoras de produtos estreitam ainda mais essas condições, garantindo que novos produtos sejam lançados no mercado dentro de um limite de segurança aceitável para o consumidor. Neste artigo trataremos sobre um método on running (Scan Memory) para checar a integridade da memória Flash do PIC18F47K40, eliminando, assim, qualquer possibilidade de um sistema corrompido se manter indevidamente operante.

Security Features: Arquitetura Orientada à Segurança

A varredura do conteúdo de todos os endereços da memória Flash de um microcontrolador pode ser uma tarefa um tanto dispendiosa para aplicações em tempo real. Nem todos os microcontroladores são dotados de recursos suficientemente ágeis, para poder realizar tal procedimento dentro de uma performance aceitável. Geralmente o Memory Scan de um microcontrolador é realizado através de técnicas de DMA, necessitando, para isso, uma arquitetura diferenciada, onde um bloco periférico interno do microcontrolador tem acesso ao conteúdo da memória principal sem a participação ativa da CPU. O Memory Scan se enquadra nas chamadas “Security Features”, funcionalidades especialmente desenvolvidas pelos fabricantes de uC’s para contemplar projetos com níveis de segurança mais altos.

O CRC (Cyclic Redundancy Check)

Vídeo 1: Cálculo manual do CRC por um polinômio gerador de 5° Grau.

O CRC é um método matemático que viabiliza o teste da integridade de uma certa cadeia de dados. Basicamente a operação consiste na divisão polinomial binária da cadeia de dados em teste por um polinômio (binário) gerador, sendo o resto da divisão o resultado da operação propriamente dita. Em processos de comunicação o tal “resto” é anexado ao final da mensagem a ser transmitida. O receptor do outro lado, portando o polinômio gerador, realiza a mesma operação sobre a mensagem recebida (incluindo o CRC anexado). Caso o resultado seja nulo, entende-se que a mensagem foi transmitida sem erros.

Slide 1: Demonstração de uma Importante Propriedade do CRC.

O CRC, além de ser muito poderoso na detecção de erros em processos digitais, mostra-se ainda muito leve em implementação via hardware. Isso se deve à natureza das operações binárias realizadas por esse algoritmo. O leitor que estiver familiarizado com álgebra booleana e circuitos sequenciais poderá entender que o circuito da Figura 1, composto de shift register’s e portas XOR’s, realiza o cálculo do CRC utilizando pouquíssimos recursos de hardware. Tendo em vista tamanha elegância, a implementação em software desse algoritmo acaba ficando menos interessante.

Implementação do CRC via Hardware no PIC18F47K40 para Scan Memory
Figura 1: Implementação do CRC via Hardware

CRC no Scan Memory do PIC 18F47K40

Principais características do Módulo CRC do PIC:

  • Implementação em hardware via Linear Feedback Shift Register (Figura 1);
  • Configuração do Polinômio Gerador via software (exceto MSB e LSB, que são fixados por hardware como ‘1’);
  • Configuração da ordem dos bits via software (big-endian/little-endian);
  • Escolha do valor inicial do acumulador do CRC via software (seed value).

Principais características do Módulo Scan Memory do PIC:

  • Configuração do range da memória em teste;
  • Trabalha com interrupções;
  • 4 Modos de checagem da memória:
    • Burst Mode: Paralisa a Operação da CPU para a realização da checagem de toda a memória especificada. (Alto throughput para o processo de scan, com o custo de travar o fluxo do programa principal);
    • Concurrent Mode: De forma análoga ao Burst Mode, também trava o fluxo do programa principal para a execução do scan, contudo permite a CPU retomar suas atividades nos intervalos dos acessos à memória (access cycles);
    • Triggered Mode: Análogo ao Concurrent Mode, contudo o início do Scan Memory se dá por uma fonte de Trigger externa, invés da chamada de uma instrução pela CPU;
    • Peek Mode: Opondo-se ao Burst Mode, no Peek Mode o scan é feito sempre nos intervalos que a CPU não tem acesso à memória não-volátil do micro. (Menor throughput para o processo de scan, com a vantagem de não travar o fluxo do programa principal).

Utilizando o Scan Memory do PIC

Este exemplo foi desenvolvido utilizando-se:

  • Linguagem: C
  • Compilador: xc8
  • IDE: MplabX
  • Calculadora de CRC oferecida pela Microchip
  • Target: PIC18F47K40
  • Ambiente: Windows

A verificação da memória de programa “on running” pode ser implementada através das seguintes etapas:

1°) Codificação da Aplicação: nessa etapa o programador deve implementar o código propriamente dito. Um detalhe importante é a declaração de uma variável const que armazenará o CRC da memória de programa em um local específico da própria memória flash.

2°) Criação de um .txt com a cadeia de opcodes que formam o programa: após compilar o código fonte, acesse os opcodes gerados para a memória Flash através do seguinte caminho:

Window >> PIC Memory Views >> Program Memory

Acessando os Opcodes da Memória de Programa no MplabX
Figura 2: Acessando os Opcodes da Memória de Programa no MplabX.

Selecione toda a coluna referente aos opcodes e dê um “Ctrl+C”.

Copiando os Opcodes do MplabX
Figura 3: Copiando os Opcodes do MplabX.

Em um editor de texto cole a coluna dos opcodes. Vale lembrar que o último opcode (0x0000) deve ser apagado, pois essa posição de memória armazenará o CRC que iremos calcular. Salve o documento com um nome qualquer.

3°) Cálculo do CRC: possuindo os opcodes sequenciados em um arquivo separado, abra a calculadora de CRC disponibilizada no site da Microchip. Importe o .txt gerado no passo anterior e calcule o CRC da memória de programa (as configurações do cálculo do CRC devem ser as mesmas escolhidas no firmware).

Calculando o CRC do Firmware
Figura 4: Calculando o CRC do Firmware.

4º) Carregue o valor calculado no código fonte: O valor calculado pela aplicação externa será carregado na última posição da memória Flash. Assim, quando o firmware periodicamente checar a memória de programa, os valores devem coincidir, caso contrário a memória estará corrompida.

Segue uma implementação do scan memory no modo burst, com o uso de um polinômio gerador 0x1021/CCITT para o módulo CRC:

Conclusões

Concluímos que a verificação da memória de programa do PIC pode ser um processo viável a aplicações críticas caso a arquitetura do microcontrolador possuir: acesso direto à memória (DMA – Direct Memory Access) e um módulo de hardware dedicado para o cálculo do CRC. Vimos ainda que existem 4 modos distintos para realizar a checagem da memória, garantindo ao projetista uma significativa liberdade no desenvolvimento do produto.

Espero que o artigo tenha sido útil, qualquer dúvida é só fazer um comentário abaixo.

Saudações e até a próxima!

Saiba mais sobre Segurança em Sistemas Embarcados

O seu dispositivo IoT é seguro?

Webinar Gravado: Segurança em Sistemas Embarcados: Onde, Como e Por quê?

Segurança da Informação – Criptografia AES

Referências

Fonte da Imagem de destaque 

Fonte da Figura 1

Datasheet do PIC18(L)F27/47K40

Computer Interfacing and Protocols

Using a Hardware or Software CRC with Enhanced Core PIC16F1XXX in Class B Applications

Vídeo: How to calculate CRC (Cyclic Redundancy Check)

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Scan Memory: Checando a integridade da memória Flash no PIC18F47K40
Comentários:
Notificações
Notificar
guest
3 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Robson Paula
Robson
20/03/2018 00:26

Ainda não testei essa função CRC, no site mercadolivre, tem o PIC18F46K40 (64k Flash), acho que tem quase tudo que tem no PIC18F47K40 (128k Flash), parece que só muda a capacidade de código da flash, será que esse exemplo roda no 46K40 sem nenhuma alteração?

Encontrei uma tabela de modelos de 8-bits com esta funcionalidade de CRC:
PIC12F1612, PIC16F1613, PIC16F1614, PIC16F1615, PIC16F1618, PIC16F1619, PIC16F18854, PIC16F18855, PIC16F18856, PIC16F18857, PIC16F18875, PIC16F18876, PIC16F18877.

PIC18F24K40, PIC18F24K42, PIC18F24Q10, PIC18F25K40, PIC18F25K42, PIC18F25Q10, PIC18F26K40, PIC18F26K42, PIC18F26Q10, PIC18F27K40, PIC18F27K42, PIC18F27Q10, PIC18F45K40, PIC18F45K42, PIC18F45Q10, PIC18F46K40, PIC18F46K42, PIC18F46Q10, PIC18F47K40, PIC18F47K42, PIC18F47Q10, PIC18F55K42, PIC18F56K42, PIC18F57K42, PIC18F65K40, PIC18F66K40, PIC18F67K40.

Fonte: http://www.microchip.com//wwwAppNotes/AppNotes.aspx?appnote=en573120

Robson
Robson
12/03/2018 12:58

Isso ajuda muito, mas enquanto a fabricante continuar dizendo que o produto deve ser usado por conta e risco do usuário, então a segurança continua duvidosa. Ver datasheet Pg 637: “O uso de dispositivos Microchip em suporte de vida e / ou aplicações de segurança é inteiramente o risco do comprador e o comprador concorda em defender, indenizar e isentar a Microchip de todos e quaisquer danos, reclamações, ações ou despesas decorrentes desse uso.”

Talvez você goste:

Séries

Menu

WEBINAR
 
Porque o RTOS não faz o que eu quero?

Data: 28/10 às 19:30h - Apoio: Mouser Electronics
 
INSCREVA-SE AGORA »



 
close-link