Sadržaj
- Kako eksperimentalno izmjeriti vrijeme izvršavanja koda
- 1. Znajte procesorsku snagu i veličinu memorije vašeg mikrokontrolera
- 2. Izbor varijabli za optimizaciju u veličini koda
- 3. Izbor varijabli za optimizaciju u vremenu izvršavanja koda
- 4. Optimizacija aritmetičkih operacija
- 5. Upotrijebite mikrokontroler s mogućnošću DSP-a za intenzivne izračune
- Upute koje DSP procesor može izvršiti brže od ALU-a su:
- Korištenje DSP motora mikrokontrolera zahtijeva sljedeće:
- 6. Rad s prekidima
- 7. Koristite najbolje dostupne kompajlere
- 8. Inteligentno koristite uvjetne izjave
- 9. Koristite ugrađene funkcije
- 10. Upotrijebite smanjene petlje
- Završavati
Autor je završio svoju posljednju godinu inženjerskog projekta s dsPic mikrokontrolerima, stekavši opsežan uvid u ove uređaje.
Kôd C-jezika mikrokontrolera može zahtijevati optimizaciju u određenim naprednim aplikacijama. Ova optimizacija koda vježba se kako bi se smanjile dvije ključne stvari:
- Veličina koda: Mikrokontroleri mogu pohraniti ograničene podatke i upute zbog ograničene veličine njihove RAM memorije. Stoga kod treba optimizirati, tako da se dostupne upute i memorija podataka mogu iskoristiti na najučinkovitiji način.
- Vremena izvršavanja koda: Mikrokontroleri su sekvencijalni uređaji koji izvršavaju jednu po jednu naredbu. Svaka uputa za sastavljanje troši određeni broj taktova za samo izvršavanje. Stoga kod mora biti optimiziran kako bi se osiguralo da izvršava potrebni zadatak u najmanje broju ciklusa takta ili uputa za montažu. Što kôd koristi manje ciklusa sata, to je brži. To znači da se aplikacije mogu brže izvoditi jer je vrijeme obrade minimalizirano.
Ovaj članak predstavlja savjete i trikove koji se mogu koristiti za smanjenje veličine i vremena izvršavanja koda mikrokontrolera.
Microchip-ov razvojni IDE za MplabX koristit će se za demonstraciju primjera tamo gdje je to prikladno.
Kako eksperimentalno izmjeriti vrijeme izvršavanja koda
Da biste dobili ideju koliko vremena vašem kodu zapravo treba za izvršavanje u stvarnom vremenu, trebate ga eksperimentalno izmjeriti. Logički analizator može se prikladno koristiti za mjerenje vremena izvršavanja koda, a zainteresirani mogu putem e-pošte pitati za postupak za to. Pored ovoga:
- Neki kompajleri imaju mogućnost brojanja ciklusa takta koje će kôd potrošiti.
- Neki ispravljači programa, na primjer ICD 3 iz mikročipa, mogu izravno mjeriti vrijeme izvršavanja putem štoperice.
1. Znajte procesorsku snagu i veličinu memorije vašeg mikrokontrolera
Nije uvijek frekvencija takta (Mhz) ono što daje pravu sliku brzine obrade mikrokontrolera, realnija mjera je MIPS (mega upute u sekundi) ili broj uputa koje MCU može izvršiti u sekundi.
MCU-ovi se obično kreću od 60–70 MIPS u high-end kategoriji do 20 MIPS 8-bitnih AVR-a. Visoki MIPS mikrokontroler vjerojatno će biti skuplji od jeftinog uređaja, tako da ovdje imate kompromis između cijene i brzine obrade.
Mikrokontroleri imaju odvojenu memoriju za pohranu podataka i programskog koda. Veličina obojice može se pronaći u tehničkom listu. Možda će vam trebati MCU s većom veličinom memorije ako je vaš kod bitno velik.
2. Izbor varijabli za optimizaciju u veličini koda
Mikrokontroleri imaju ograničenu memoriju podataka, obično u rasponu od 1 do 4 Kbytes. U ovom je slučaju pametno odabrati najprikladniju vrstu varijable prema očekivanom rasponu datuma koji se pohranjuje. Tablica u nastavku sažima ove varijable:
Tip varijable | Veličina u bajtovima | Domet |
---|---|---|
bool | 1 | Samo 0 ili 1 |
ugljen | 1 | -128 do 127 |
int | 2 | -32.768 do 32.767 |
nepotpisani int | 2 | 0 do 65.535 |
dugo | 4 | -2,147,483,648 do 2,147,483,647 |
plutati | 4 | Precizno do 6 decimalnih mjesta |
dvostruko | 8 | Precizno do 15 decimalnih mjesta |
dugi dvostruki | 10 | Precizno do 19 decimalnih mjesta |
Primjer:
- Ako se dodaju dvije varijable X i Y i rezultat pohrani u Z, ali očekuje se da će vrijednost Z biti veća od 65.535 nakon zbrajanja, tada se Z može proglasiti dugačkom, a X i Y kao nepotpisane int, vrijednosti X i Y također se ne očekuju negativne. To će uštedjeti 04 bajta u memoriji podataka koji bi se inače potrošili da su sve varijable deklarirane kao dugačke.
- Dvije varijable X i Y, čije se vrijednosti očekuju u cijelim brojevima, trebaju se podijeliti, ali rezultat dijeljenja može dati decimalu, zatim X i Y mogu se proglasiti int, a rezultat se može proglasiti floatom ili dvostrukim, ovisno o potrebna preciznost.
Izbor vrste podataka može biti presudan kada se deklariraju nizovi koji sadrže velik broj elemenata.
3. Izbor varijabli za optimizaciju u vremenu izvršavanja koda
- Utvrđena je činjenica da izračuni s pomičnom zarezom traju dulje od izračuna s fiksnom točkom. Ne koristite varijablu s pomičnom zarezom tamo gdje decimalna vrijednost nije potrebna. Radite s nepotpisanim cijelim brojevima gdje god je to moguće.
- Lokalne varijable imaju prednost pred globalnim varijablama. Ako se varijabla koristi samo u funkciji, tada se ona mora deklarirati u toj funkciji jer je pristup globalnim varijablama sporiji od lokalnih varijabli.
- 8-bitni MCU pronaći će varijablu veličine jednog bajta brže za pristup, a 16-bitni MCU pronaći će varijablu od 2 bajta kojoj je lakše pristupiti zbog duljine generirane adrese.
4. Optimizacija aritmetičkih operacija
Aritmetičke operacije mogu se optimizirati na sljedeće načine.
- Upotrijebite tablice pretraživanja unaprijed izračunatih vrijednosti umjesto da procjenjujete sinus ili bilo koju drugu trigonometrijsku funkciju ili bilo koju drugu operaciju čiji rezultat može biti unaprijed poznat u kodu.
- U slučaju da je tablica pretraživanja sinusa već pohranjena u memoriji, kosinus se može izračunati pomicanjem pokazivača polja ekvivalentnog 90 stupnjeva.
- Među četiri aritmetičke operacije, dijeljenje i množenje oduzimaju najviše vremena obrade, u praksi to može biti u rasponu od stotina mikro-sekundi u slučaju vrijednosti s pomičnom zarezom.
- Upotrijebite upute za pomak bitova umjesto dijeljenja i množenja. Uputa za desni pomak 3 služi za dijeljenje s 23 gdje će kao lijeva smjena instrukcija 1 poslužiti za množenje s 21.
5. Upotrijebite mikrokontroler s mogućnošću DSP-a za intenzivne izračune
Neki mikrokontroleri imaju DSP procesnu jedinicu koja je drugačija od uobičajene ALU ugrađene u njihovu arhitekturu. Ovaj DSP mehanizam namijenjen je izvođenju aritmetičkih izračuna vrlo brzo u najmanjem broju taktova (jedan u većini slučajeva) mnogo puta brže od ALU.
Upute koje DSP procesor može izvršiti brže od ALU-a su:
- Upute za pomicanje i okretanje bitova.
- Množenja, dijeljenja i ostale računske radnje.
- Procjena sinusa i ostalih trigonometrijskih funkcija.
- Sve DSP operacije kao što su FFT, DFT, konvolucija i FIR filtriranje.
Korištenje DSP motora mikrokontrolera zahtijeva sljedeće:
- U projekt su ugrađene zasebne DSP knjižnice.
- Imena funkcija razlikuju se od standardne matematičke biblioteke C jezika. Dokumentacija ovih knjižnica i funkcija može se dobiti na web mjestu pojedinih proizvođača.
- DSP motor koristi drugačiji varijabilni tip 'frakcijski'. Naučite kako koristiti varijable frakcijskog tipa prije nego što nastavite s funkcijama biblioteke dsp.
Imajte na umu da standardne funkcije matematičke knjižnice neće pozivati DSP mehanizam jer se prevode u upute za sastavljanje ALU.
6. Rad s prekidima
Koristite prekide za obavljanje određenih funkcija kao što su:
- Čitanje ADC vrijednosti.
- Slanje i primanje od UART-a.
- Ažuriranje registara radnog ciklusa PWM-a.
- CAN ili I2C komunikacija.
Prekidi će ove funkcije servisirati brzo u usporedbi s njihovim izvršavanjem u glavnom tijelu putem poziva funkcije ili ugrađenog koda.
Prekidi će se također aktivirati samo kada je to potrebno, dok ako se kodira u glavnom tijelu, kôd će se izvršiti u svakoj iteraciji while (1) petlje.
7. Koristite najbolje dostupne kompajlere
Prevoditelji mogu automatski implementirati neke od gore spomenutih optimizacija, dok prevode kôd s C-jezika na montažni jezik ako su pravilno konfigurirani. Potražite opcije optimizacije u vašem kompajleru i, ako je moguće, nadogradite ih na profesionalne verzije kompajlera jer su oni moćniji optimizatori koda.
8. Inteligentno koristite uvjetne izjave
- Kada koristite niz if-else naredbi, prvo zadržite najvjerojatnije stanje. Na taj način MCU neće morati skenirati sve uvjete nakon što utvrdi istinsko stanje.
- Izjava o slučaju prebacivanja obično je brža, ako je drugačije.
- Upotrijebite ugniježđene if-else izraze umjesto niza naredbi. Blok if-else koji ima mnogo izraza može se podijeliti u manje podgrane radi optimizacije u najgorem slučaju (posljednjem) stanju.
9. Koristite ugrađene funkcije
Funkcije koje se trebaju koristiti samo jednom u kodu mogu se deklarirati kao statične. To će natjerati kompajler da optimizira tu funkciju na ugrađenu funkciju i stoga neće biti preveden nijedan kôd sklopa za poziv funkcije.
- Funkcija se može proglasiti ugrađenom pomoću ključne riječi 'static' s njom.
10. Upotrijebite smanjene petlje
Dekrementirana petlja generirat će manje koda sklopa u odnosu na povećanu petlju.
To je zato što je u petlji prirasta potrebna uputa za usporedbu za usporedbu indeksa petlje s maksimalnom vrijednošću u svakoj petlji kako bi se provjerilo doseže li indeks petlje maksimalnu vrijednost. Suprotno tome, u petlji smanjenja ova usporedba više nije potrebna jer će smanjeni rezultat indeksa petlje postaviti nultu zastavicu u SREG ako dosegne nulu.
S obzirom na to da petlja mora ponoviti sto puta, smanjivanjem jedne naredbe iz petlje izbjeći će se njezino izvršavanje stotinu puta, pa će utjecaj vjerojatno biti značajniji kada petlja mora ponoviti više puta.
Završavati
Ovi savjeti mogu biti korisni, ali njihova istinska primjena i učinkovitost ovise o vještini programera i naredbi koju ima na svom kodu. Zapamtite, veličina programa ne određuje uvijek vrijeme izvršavanja, neke upute mogu potrošiti više ciklusa takta nego druge, pa opet vještine programa moraju odigrati svoju ulogu.
Ovaj je članak točan i vjeran prema autorskom znanju. Sadržaj je samo u informativne ili zabavne svrhe i ne zamjenjuje osobne savjete ili profesionalne savjete u poslovnim, financijskim, pravnim ili tehničkim pitanjima.