Microsin - avr cum se calculează timpul de execuție al unei comenzi

Atunci când programați AVR (ATmegaXX, ATtinyXX), trebuie să știți cât va funcționa codul. Aici vom descrie reguli simple pentru calcularea acestui moment.







timpul de execuție a instrucțiunilor de asamblare sunt strict legate de frecvența de ceas a microcontrolerului AVR, astfel încât primul lucru pe care trebuie să știți - ce setați frecvența de bază F. adică, la ce frecvență funcționează oscilator intern ... De obicei, frecvența de ceas este setat de cuarț, în timp ce acesta este egal cu frecvența de scris în cuarț. Uneori cuarț nu este utilizat, și nu se execută foarte precise oscilator intern RC (nu este necesară nici o componentă externă pentru generator), apoi de obicei, generatorul funcționează la o frecvență de 1 MHz (poate fi personalizat și frecvența de 8 MHz). Modul pe care este utilizat - este determinat de siguranțele de configurare interne (acestea sunt numite, de asemenea, jumperi). De exemplu, chip-ul implicit ATMEGA16 (atunci când cipul vine curat din fabrica) jumperii sunt setate să funcționeze fără cuarț, oscilatorul RC intern la o frecvență de 1 MHz.

Deci, știm frecvența nucleului F din Hertz. Acum puteți afla timpul unui singur ciclu de ceas TCLK = 1 / F (în secunde). Fiecare comandă execută un număr strict definit de cicluri (cât de multe depind de comandă). De exemplu, comenzile ANDI și ORI (care sunt adesea folosite când se controlează picioarele portului) sunt executate în 1 ciclu de ceas. Exemplu de calcul al duratei comenzii ANDI:

Tabelul de corespondență între comenzile microcontrolerului și numărul de măsuri poate fi găsit în fișa tehnică de pe microcontroler, vezi Rezumatul instrucțiunilor de la sfârșitul foii de date. Ultima coloană a tabelului #Clocks arată numărul de cicluri de ceas pentru care este executată comanda. Dacă există un număr - de exemplu 2, atunci totul este clar, comanda este de 2 cicluri. Dar uneori există 1/2 sau 1/2/3. Aceasta înseamnă, de exemplu, 1/2 că comanda poate fi executată în 1 sau 2 bare, în funcție de condiția de executare a comenzii. De exemplu, comanda BREQ va fi executată pentru 1 ceas, dacă nu există nici o ramură în funcție de condiție, iar pentru 2 cicluri de ceas, dacă are loc un salt condițional.







[Calculul performanței comenzii în limba C]

Există, de asemenea, o metodă de măsurare directă a lungimii codului cu un osciloscop. În acest scop, piciorul liber este ales din microcontroler, și începutul picioarelor de măsurare a pus setare cod la 1 și la sfârșitul codului picior de măsurare setat la 0. Porniți programul de performanță a osciloscopului se măsoară și durata impulsului.

[Calcularea unei constante pentru un timer / contor]

Timere / contoare sunt adesea folosite în program pentru a număra întârzierile de timp. De obicei, configurez contorul astfel încât întreruperea acestuia să fie declanșată aproximativ o dată la 1 milisecundă. În acest caz, programul este convenabil să numărați timpul relativ la contorul global (despre acest lucru mai târziu). Voi afișa pe timer 1 modul în care este configurat și modul în care este folosit.

void SetupTIMER1 (void)
// 1< TCCR1B = (1< TCNT1 = TCNT1_1MS;
// Activați întreruperea depășirii temporizatorului 1.
TIMSK = (1<>

void timePoll (void)
static u16 timecnt = 100;

dacă (TIMSK (1< return;

TCNT1 = TCNT1_1MS;
TIMSK = (1<

//[timerint.S]
#include
.text
.global TIMER1_OVF_vect
TIMER1_OVF_vect:
; cbi _SFR_IO_ADDR (PORTB), PB7
împingeți R24
; ldi R24,

(1< ldi R24, 0
out _SFR_IO_ADDR (TIMSK), R24
; out 0x39, R24
pop R24
; sbi _SFR_IO_ADDR (PORTB), PB7
Reti

[Timp de numărare în program cu o precizie de 1 ms]

Dacă aveți un contor glob global de marcaj de timp de milisecunde organizat în acest fel, contorizarea timpului în program devine o sarcină trivială. Iată un exemplu de calculare a unei întârzieri de 0,5 secunde:

u32 timecnt = timestamp + 500;
în timp ce (timestamp







Articole similare

Trimiteți-le prietenilor: