Como posso executar um snippet de código apenas uma vez na vida de um programa? Pode ser desligado e ligado várias vezes. A única opção para executar o trecho de código novamente deve estar piscando novamente no quadro.
O código é uma seção de calibração que não quero executar novamente. Se eu usar EEPROM ou Flash, definiremos um sinalizador como verdadeiro ou falso. Então, quando lemos pela primeira vez a localização da memória, qual seria o valor aleatório nessa área de memória?
Qual é o melhor método para implementar isso no C incorporado?
microcontroller
c
embedded
ganeshredcobra
fonte
fonte
Respostas:
Seu microcontrolador pode ter alguma EEPROM, memória OTP, bits de fusível do usuário, onde você pode definir um sinalizador.
Não existe um "melhor método no C incorporado", a gravação de memória não volátil é diferente em cada microcontrolador.
editar:
INSTANTÂNEO
O conteúdo da memória flash é apagado durante a programação do dispositivo. Após a programação, todos os bytes que não foram gravados contêm 0xFF. Consulte a folha de dados para encontrar uma área que pode ser programada com segurança no firmware em execução.
EEPROM
Embora não seja garantido nas folhas de dados, todas as EEPROMs que eu vi até agora continham 0xFF: s quando enviadas da fábrica (exceto as pré-programadas com um endereço MAC exclusivo, mas explicitamente documentado). Alguns dispositivos / softwares de programação também podem apagar ou programar o conteúdo da EEPROM. Alguns podem ser protegidos contra gravação, de forma permanente ou reversível.
OTP
A memória programável única contém sempre valores iniciais bem definidos, documentados na folha de dados.
É sempre uma boa ideia incluir uma boa soma de verificação, como o CRC32, com os dados gravados, para proteger contra corrupção de dados causada por peças defeituosas, erros de transmissão, raios cósmicos, qualquer que seja.
fonte
Você disse:
Outros disseram usar a EEPROM para armazenar um sinalizador para indicar quando a função run_once () foi executada. No entanto, isso tem uma desvantagem: se você atualizar o microcontrolador, o sinalizador ran_it_once na EEPROM já foi definido e a função run_once () não será executada. Se o seu microcontrolador tiver incorporado EEPROM, talvez seja possível limpar o sinalizador ran_it_once quando você atualizar o microcontrolador, se o programador suportar isso.
Uma maneira melhor é ter números de versão na EEPROM e no código. Quando o código é executado na inicialização, ele deve ler o número da versão da EEPROM e compará-lo com o número da versão armazenado no código. Se eles não corresponderem, a função run_once () será chamada e o ato final do código run_once () será escrever o número da versão do firmware na EEPROM. Cada vez que você modifica o código-fonte do firmware, você deve incrementar o número da versão incorporado.
fonte
Escolha um microcontrolador que possa gravar / apagar sua própria memória de programa. Depois de executar o código em questão, faça com que a última parte do código substitua a primeira instrução por um salto que a ignore. Opcionalmente, você também pode apagar o restante (talvez substitua por nop), para que haja uma chance absolutamente zero de que ele seja executado novamente.
Esta mensagem se autodestruirá em 5..4 ...
fonte
Como você está usando esse código para calibração, minha sugestão seria criar um processo de explosão que execute o código de calibração como um primeiro estágio e nem o tenha na versão de produção final da placa. Isso é semelhante à resposta de apalopohapa, exceto diferente no sentido de que você teria duas cargas de programa separadas: tenha um processo rápido que pisca a primeira carga de programa que executa todas as calibrações e cospe os dados a partir disso. Em seguida, pegue esses dados e incorpore-os aos dados da segunda carga do programa.
Um benefício dessa abordagem é que você minimiza absolutamente a quantidade de espaço de armazenamento necessária - não é necessário armazenar seu código único, apenas os dados que ele gera. Por ter um processo explosivo que carrega dois programas separados, você também se isola um pouco dos bugs no código de inicialização, que poderiam permanecer por aí. Você também tem alguma flexibilidade adicional se quiser executar novamente o seu código de calibração: em vez de precisar escrever um código extra para limpar o bit que denota que seu código foi executado (o que já pode ser acidentalmente limpo), basta executar novamente o seu código de calibração. processo de explosão.
fonte