Pergunta

Embora haja uma abundância de quadros de teste de unidade que o apoio C, estou um pouco perplexo sobre como escrever testes de unidade para código micro controlador (PIC no meu caso, mas eu acho que a questão é mais geral do que isso).

Grande parte do código escrito para micro controladores gira em torno valores de configuração e gravação de dados de registo e de leitura de dados de entrada de registos e responder a eventos de interrupção. Eu estou querendo saber se alguém pode fornecer algumas indicações sobre a forma mais eficaz para isso.

Foi útil?

Solução

Você escreve;

"Grande parte do código escrito para micro controladores gira em torno de configuração e de dados escrever valores para registros, a leitura de dados de entrada a partir de registos e responder a eventos de interrupção".

Eu concordo que este é frequentemente o caso na prática, mas eu realmente não acho que isso é uma coisa boa, e acho que repensar as coisas um pouco irá ajudá-lo com seus objetivos de teste.

Talvez porque os programadores microcontrolador pode chegar e tocar o hardware qualquer momento que eles gostam, muitos (a maioria?) Deles têm o hábito de fazer exatamente isso, ao longo do seu código. Muitas vezes, esse hábito é seguido inquestionavelmente, talvez porque muitas pessoas que fazem este tipo de trabalho são EEs não cientistas da computação de formação e inclinação. Eu sei, eu começado assim mesmo.

O ponto que estou tentando fazer, é que os projetos de microcontroladores pode e deve ser bem projetado como qualquer outro projeto de software. Uma parte muito importante de um bom design é restringir o acesso ao hardware para drivers de hardware! Partição fora todo o código que escreve registros, responde a interrupções etc. em módulos que fornecem o resto do seu software com agradável, acesso limpo, abstraída ao hardware. Testar os módulos de driver no alvo usando analisadores lógicos, osciloscópios, equipamentos de teste personalizado ou qualquer outra coisa que faz sentido.

Um ponto muito importante é que agora o resto do seu software, espero que a grande maioria dela, agora é apenas o código C que você pode executar e testar em um sistema host. No sistema host os módulos de hardware são apagou de uma forma que fornece visibilidade sobre o que o código sob teste está fazendo. Você pode usar o teste de unidade principais abordagens sobre este código. Este precisa de algumas preparações e trabalho, mas se você está bem organizado, você pode criar um sistema reutilizável que pode ser aplicado a todos os seus projetos. Os benefícios potenciais são enormes. Eu escrevi um pouco mais sobre estas idéias aqui;

[ http://discuss.joelonsoftware.com/default asp? joel.3.530964.12] [1]

Outras dicas

Uma abordagem a este pode ser usar um emulador. Eu tenho trabalhado em um emulador AVR e uma das idéias para o uso é realmente ao código de teste de unidade. Os implementos emulador do CPU e registra, interrompe e vários periféricos, e (no meu caso) bytes escritos para o UART emulado ir ao stdout regular do emulador. Desta forma, o código de teste de unidade pode ser executado no emulador e escrever seus resultados de teste para o console.

Claro, é preciso também garantir que o emulador está a implementar corretamente o comportamento da CPU real, caso contrário, os testes de unidade em cima do que não pode ser confiável.

versões simuladas de gravação do seu funções de acesso registo / macros. Note que este assume que o código usa um conjunto comum de funções de acesso de registro, e não ad-hoc coisas como *(volatile int*)0xDEADBEEF = 0xBADF00D em todos os lugares.

Chame seus manipuladores de interrupção diretamente do seu código de teste (pode ser problemático em alguns architectures¹), a "interrupção de software" se estiver disponível, ou a partir de um temporizador de interrupção manipulador se você precisar deles para executar de forma assíncrona. Isso pode exigir envolvendo sua interrupção ativar / desativar o código em funções / macros que você pode mock up.

¹ 8051 vem à mente: pelo menos com a Keil 8051 do compilador, você não pode chamar funções de interrupção diretamente. Isso pode ser trabalhado com o pré-processador C embora.

Existe talvez qualquer tipo de modo de auto-retorno de modo que você pode usar o controlador próprio para gerar eventos que você pode testar contra?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top