Spørgsmål:
Enhedstest AVR-monteringssprog
Len Holgate
2009-11-12 15:26:42 UTC
view on stackexchange narkive permalink

Hvordan testes enheden din samlingskode?

Jeg arbejder på en seriel servostyring som en del af et hexapod-robotprojekt, og koden er nået til det punkt, hvor det bliver kompliceret;) Alligevel , Jeg er vant til at bruge enhedstest i mit daglige job som en C ++ - serverudvikler og har derfor prøvet at anvende de samme slags test på min AVR-samlingskode. Jeg har udarbejdet en måde, der fungerer OK for mig (se her), men jeg er interesseret i, om der er nogen standardværktøjer eller teknikker, jeg mangler.

Opdateret: For de af jer, der er interesserede, er den fulde kilde til servostyringen og enhedstestene nu tilgængelige her.

To svar:
Kortuk
2009-11-13 14:57:06 UTC
view on stackexchange narkive permalink

Jeg vil også beskrive dette som elegant, men vil gerne tilføje problemet, hvis du vil tilgive min indtrængen.

Jeg ved, at der er meget dyre softwarepakker til at arbejde igennem situationer som denne, men i det firma, jeg arbejder hos, har vi ikke råd til omkostningerne, medmindre vi er sikre på, at det gør, hvad vi har brug for.

Test Driven Development (TDD) er et af de bedre systemer, jeg har hørt om til udvikling, og jeg nyder godt af det, men de problemer, der tager min tid, skyldes normalt komplekse afbrydelser og hardwarehændelser, som mange ville kalde fejl. Det virker som en mindre ting at have et problem hver anden time, når stjernerne tilpasser sig, men hvis din telefon bare frøs en gang om ugen, forbander du ingeniørernes navn. I vores tilfælde er vi nødt til at gå ind i et feedparti, når tingene virkelig går i stykker, hvilket jeg som du kan forestille dig kan lide at undgå.

Jeg har set meget intelligente løsninger til kontrol af delsystemers funktionalitet, som, hvis det blev implementeret ordentligt, ville det sandsynligvis spare mig 3 timer ud af en 50 timers arbejdsuge, men hvis der var en intelligent måde at finde fejlsituationer på, ville det spare mig i flere ugers arbejde på udkig efter "bug", der sker i marken lejlighedsvis under tunge indlæs.

Dette indlæg hjælper sandsynligvis ikke et stort beløb, men jeg finder det at gøre alt lettere at løse ved at bringe alt i lyset. Hvis der var en TDD-metode til at finde fejlsituationer, kunne jeg få ti tusinder tildelt til at betale for det. -Maks

Jeg har ikke rigtig tænkt på at teste interaktionen mellem interrupt-koden og non-interrupt-koden. Det er et godt punkt. Jeg planlagde at afprøve min PWM-generering af timer-afbrydelseskode uden for en afbrydende situation på samme måde som den måde, jeg testede min hovedlinjeseriekode på. Jeg antager, at selv når jeg først har dækning for alt dette, mangler jeg stadig interaktionen. Jeg formoder, at jeg kunne udløse afbrydelser inden i testene (det er let med timerafbrydelsen, men al afbrydelseskode kan indstilles til at køre på en timeafbrydelse inden i testens ledning). Ikke trivielt dog.
Jeg kan misforstå dig, men jeg prøver at være ret forsigtig med ikke-afbryde og afbryde kodeinteraktioner. Jeg burde sandsynligvis være mere slap i min brug af atomoperationer, men det har aldrig vist sig at forårsage skade på det niveau, jeg har vores optimizer. Problemerne opstår, når en afbrydelse forsinker en anden, en almindelig, som jeg hjælper studerende med, ville være afbrudt PWM-generation. Hvis du har brug for en ekstremt nøjagtig hastighed, for eksempel ved at bruge et sammenligningsmodul i din chip, og en anden afbrydelse har travlt med at bruge tid på noget andet og forsinker dig med 50uS, der kan være verdens ende.
I nogle tilfælde kan du have prioritet, eller du kan endda få en afbrydelse til at deaktivere sig selv og genaktivere globale afbrydelser internt, platformafhængig, men den nemmeste vej til min egen udvikling er at begrænse tiden i afbrydelse til ting, der er absolut nødvendige og have normal kode at gøre resten af ​​arbejdet.
Mit nuværende design forklares på min blog, ligesom et foreslået nyt design. Lige nu har jeg 64 PWM-kanaler genereret af en timer-afbrydelse og ingen andre afbrydelser; seriel udføres ved afstemning. Dette betyder, at PWM er bunnsolid, men serien kan have problemer. Mit nye design vil bruge afbrydelser til UART såvel som timeren til PWM-generering og omhyggelig genaktivering og blokering af afbrydelser for at sikre fejlfri PWM- og fejlfri UART-behandling ...
Jeg brugte PWM som et eksempel, det system, jeg har haft dette problem med, har 3 SPI-grænseflader, hvor 1 af SPI-forbindelserne har 3 chips, vi bruger på den. Der er 4 forskellige portafbrydelser, der informerer om ændring i tilstanden af ​​eksterne chips og et par andre ting, der foregår. Problemet bliver værre jo flere grænseflader du har.
Forstå. Jeg har endnu ikke fundet ud af, hvordan det kan være muligt at teste sådanne interaktioner. Hovedårsagen til spørgsmålet var at finde ud af, om andre havde bedre ideer :)
Ja, jeg forstod dit spørgsmål og betragtede det som et fremragende spørgsmål. Jeg kunne ikke tilføje noget til svaret, så hvorfor ikke udvide spørgsmålsområdet.
Amos
2009-11-12 18:16:42 UTC
view on stackexchange narkive permalink

Interessant. Efter jul planlagde jeg at undersøge at lave nogle Assembler med Pics, når jeg har lidt mere tid, vil jeg se godt på dit system.

En måde, jeg kunne se på, var at script en slags ramme på et andet sprog for at oprette og nedbryde de mock-objekter osv., men hvordan du ville interface dette til chippen / simuleringen ville være et problem.

Hvis det dog bliver for belastende, vil det opveje fordelene ved enhedstest og også gøre dig mindre ivrig efter at bruge det.

At få det til at fungere inde i simulatoren var min indledende forhindring, indtil jeg regnede ud, hvordan jeg kunne bryde koden i separate filer og blot "spotte" nogle af de etiketter, som jeg ville springe til i den rigtige kode. Jeg sender det hele, når jeg er færdig. Eftermontering af enhedstest til koden tager et stykke tid, men det har været det værd.
Nu hvor jeg har haft en ordentlig chance for at gennemse din metode, synes jeg det er ret elegant. Måske kigger jeg på avrs efter jul, da der ser ud til at være meget mere community-baserede ting til dem end for Pics. Eventuelle ideer om, hvad en anstændig Linux IDE til AVR Assembler-programmering kan være.
Der er en GNU-værktøjskæde, som du kan bruge i stedet for AVR Studio (som er Atmels gratis værktøjssæt). Det er sandsynligvis muligt at køre det på Linux, men det har jeg ikke haft brug for.
Fandt netop dette link til en Linux Journal-artikel om udvikling til AVR under Linux: http://www.linuxjournal.com/article/7289
Min største bekymring med denne artikel er, at den er fra 2005 og derfor kan være forældet.
Jeg laver AVR-GCC på Linux hele tiden. Det fungerer som en mester. (og hvis du har brugt Arduino på Linux, har du også brugt det)


Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 2.0-licens, den distribueres under.
Loading...