23.07.2013 Views

Regulering af Quad-rotor helikopter - VBN - Aalborg Universitet

Regulering af Quad-rotor helikopter - VBN - Aalborg Universitet

Regulering af Quad-rotor helikopter - VBN - Aalborg Universitet

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

eksekvere kode.<br />

Til sidst skal timer0 sættes op til at skabe interrupts med et fast interval. Dette gøres ved hjælp <strong>af</strong><br />

følgende linier kode der skal placeres i main-rutinen således at de bliver kørt når processoren starter:<br />

1 MCUCR = _BV( SE ) ; / / m u l i g g ø r p r o c e s s o r e n s sleepmode<br />

2 TCNT0 = TCNT0_INIT ; / / I n i t i a l i s e r t i m e r 0 t æ l l e r e n<br />

3 TCCR0 = TMC8_CK256 ; / / Sæt t i m e r 0 t i l a t b l i v e t a l t op hver 2 5 6 .<br />

p r o c e s s o r c l o c k<br />

4 TIMSK = _BV( TOIE0 ) ; / / T i l l a d i n t e r r u p t s f r a t i m e r 0<br />

Første linje i denne kode sætter bit SE i control registret på processoren hvilket gør at processoren<br />

bliver i stand til at gå i standby, hvis den bliver bedt om det (kernen benytter dette hvis der ikke er<br />

flere tråde tilbage i aktiv-køen). Anden linje har den funktion at den initialiserer timer0-tælleren til<br />

værdien TCNT0_INIT. Denne værdi kan beregnes således såfremt divideren på timer0 er sat til 256<br />

som med ovenstående kode:<br />

Hvor<br />

TCNT0_INIT = 255 −<br />

TCNT0_INIT er konstanten der skal lægges ind i TCNT0<br />

CPUCLK<br />

256 · TICKRATE<br />

for at opnå den rigtige opgaveskiftfrekvens [-]<br />

CPUCLK er clockfrekvensen på processoren [Hz]<br />

TICKRATE er frekvensen hvormed der skal ske opgaveskift [Hz]<br />

Dog skal det nævnes til formel J.1 kun kan benyttes såfremt resultatet bliver positivt, da en negativ<br />

værdi i tælleren ikke har den ønskede funktion. Desuden skal TCNT0_INIT defineres som en makro<br />

således at den både kan benyttes i rutinen til timer0-overflow interrupts og i main-rutinen, uden at<br />

beregningen skal udføres på processoren.<br />

Tredje linje sætter to bits i kontrol registret til timer0 på processoren. Disse bits sørger for en divider<br />

på 256 på clockfrekvensen på processoren, således at timer-counteren kun bliver talt op en gang per<br />

256 clockpulser. Fjerde linje tillader overflow-interrupts fra timer0 mens andre typer interrupts fra<br />

timer0 bliver blokeret.<br />

Når dette er gjort er størstedelen <strong>af</strong> kernen sat op, og tilbage er derfor kun at starte de rigtige tråde.<br />

Dette gøres ved hjælp <strong>af</strong> følgende funktionskald:<br />

1 AvrXRunTask (TCB( t a s k _ n a v n ) ) ;<br />

Hvor TCB() er en prekompiler macro der finder den rigtige TaskControlBlock (datastruktur der<br />

indeholder information om en tråd). AvrXRunTask() placerer blot information om tråden i aktiv-<br />

køen, således at den kommer i betragtning når der skiftes tråd.<br />

Til sidst er blot tilbage at køre funktionen Epilog() der sørger for at starte kernen op og starte<br />

med at udføre kode til første tråd.<br />

A40<br />

(J.1)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!