Linguagem de montagem do AVR para teste de unidade

11

Como você testar o seu código de montagem?

Estou trabalhando em um servocontrolador serial como parte de um projeto de robô hexapod e o código chegou ao ponto em que está se tornando complicado;) De qualquer forma, estou acostumado a usar testes de unidade no meu trabalho diário como desenvolvedor de servidor C ++ e então tentei aplicar os mesmos tipos de teste ao meu código de montagem do AVR. Eu trabalhei de uma maneira que funcione bem para mim (veja aqui ), mas estou interessado em saber se há alguma ferramenta ou técnica padrão que me falta.

Atualizado: para aqueles que estão interessados, a fonte completa do servocontrolador e os testes de unidade estão agora disponíveis aqui .

Len Holgate
fonte

Respostas:

3

Eu também descreveria isso como elegante, mas gostaria de adicionar o problema, se você perdoar minha intrusão.

Sei que existem pacotes de software muito caros para lidar com situações como essa, mas na empresa em que trabalho não podemos arcar com os custos, a menos que tenhamos certeza de que faz o que precisamos.

O TDD (Test Driven Development - Desenvolvimento Orientado a Testes) é um dos melhores sistemas que já ouvi falar em desenvolvimento, e eu aprecio isso, mas os problemas que levam meu tempo são normalmente causados ​​por interrupções complexas e eventos de hardware que muitos chamariam de falhas. Parece uma coisa pequena ter um problema a cada 2 horas quando as estrelas se alinham, mas se o seu telefone congelasse apenas uma vez por semana, você amaldiçoaria o nome dos engenheiros. No nosso caso, temos que caminhar para um lote de ração quando as coisas realmente quebram, o que, como você pode imaginar, eu gosto de evitar.

Vi soluções muito inteligentes para verificar a funcionalidade dos subsistemas, que, se implementadas adequadamente, provavelmente me economizariam 3 horas em uma semana de trabalho de 50 horas, mas se houvesse uma maneira inteligente de encontrar situações de falha, isso me economizaria semanas de trabalho procurando o "bug" que acontece no campo ocasionalmente sob carga pesada.

Este post provavelmente não ajuda muito, mas acho que trazer tudo à luz facilita tudo a resolver. Se houvesse um método TDD para encontrar situações de falha, eu poderia obter 10s de milhares alocados para pagar por isso. -Max

Kortuk
fonte
1
Realmente não pensei em testar a interação entre o código de interrupção e o código de não interrupção. É um bom argumento. Eu estava planejando testar meu código de interrupção do timer de geração PWM fora de uma situação de interrupção de maneira semelhante à maneira como testo meu código serial da linha principal. Acho que mesmo depois de ter cobertura para tudo isso, ainda estou perdendo a interação. Suponho que eu poderia acionar interrupções nos testes (é fácil com a interrupção do timer, mas todo o código de interrupção pode ser definido para ser executado em uma interrupção do timer dentro do equipamento de teste). Não é trivial.
21119 Len Holgate
1
Posso entendê-lo mal, mas tento ter bastante cuidado com interações de código sem interrupção e interrupção. Eu provavelmente deveria ser mais relaxado no uso de operações atômicas, mas nunca foi demonstrado que isso causa danos no nível em que tenho nosso otimizador. Os problemas surgem quando uma interrupção atrasa a outra, uma comum com a qual ajudo os alunos seria a geração de PWM orientada por interrupção. Se você precisa de uma velocidade extremamente precisa, por exemplo, usando um módulo Compare no seu chip, e outra interrupção é ocupada gastando tempo com outra coisa e atrasando-o em 50 uS, que pode estar acabando no mundo.
22430 Kortuk
1
Em alguns casos, você pode ter prioridade, ou pode até ter uma interrupção desativada e reativar as interrupções globais internamente, dependendo da plataforma, mas o caminho mais fácil para meu próprio desenvolvimento é limitar o tempo de interrupção a coisas absolutamente necessárias e fazer com que o código normal o resto do trabalho.
22413 Kortuk
1
Meu design atual é explicado em meu blog, assim como um novo design proposto. No momento, tenho 64 canais de PWM gerados por uma interrupção do timer e nenhuma outra interrupção; serial é feito por polling. Isso significa que o PWM é sólido, mas a série pode ter problemas. Meu novo design usaria interrupções para UART, bem como o temporizador para a geração de PWM e reativando cuidadosa e bloqueio das interrupções para garantir PWM livre falha e pulso aleatório processamento UART livre ...
Len Holgate
2
Eu estava usando o PWM como exemplo, o sistema em que tive esse problema tem 3 interfaces SPI com 1 das conexões SPI com 3 chips que usamos nele. Existem 4 interrupções de porta diferentes informando a alteração no estado dos chips externos e algumas outras coisas acontecendo. O problema se torna pior quanto mais interfaces você tiver.
21909 Kortuk
2

Interessante. Depois do Natal, eu estava pensando em fazer um Assembler com o Pics, quando tiver um pouco mais de tempo, darei uma boa olhada no seu sistema.

Uma maneira que eu pude ver seria o script de algum tipo de estrutura em uma linguagem diferente para criar e derrubar os objetos simulados etc., mas como você faria a interface com o chip / simulação seria um problema.

Se ficar muito oneroso, isso superará os benefícios do teste de unidade e também o deixará menos interessado em usá-lo.

Amos
fonte
Fazer com que funcionasse dentro do simulador foi meu obstáculo inicial, até que eu resolvi como dividir o código em arquivos separados e simplesmente "zombar" de alguns dos rótulos nos quais eu pularia no código real. Vou postar a coisa toda quando terminar. A atualização dos testes de unidade no código está demorando um pouco, mas valeu a pena.
21119 Len Holgate
Agora que tive a chance adequada de analisar sua metodologia, acho que é bastante elegante. Talvez eu dê uma olhada nos avrs depois do Natal, pois parece haver muito mais coisas baseadas na comunidade para eles do que para o Pics. Alguma idéia de como pode ser um IDE Linux decente para a programação do AVR Assembler.
Amos
1
Há uma cadeia de ferramentas GNU que você pode usar no lugar do AVR Studio (que é o conjunto de ferramentas gratuito da Atmel). Provavelmente é possível executar isso no Linux, mas não preciso.
21119 Len Holgate
Só encontrei este link para um artigo de Linux Journal no desenvolvimento para AVR sob Linux: linuxjournal.com/article/7289
Len Holgate
Minha principal preocupação com esse artigo é que é de 2005 e, portanto, pode estar desatualizado.
Amos