Optimalizácia kódu pre Arduino UNO

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 09:48

Ahojte
Je tento kód možné ešte nejako zoptimalizovať aby Arduino stihalo viac? Momentálne už na osciloskope vidím že nestiha ak je prerušenie 1,5kHz a viac. Nie ASM - aj keby mi to niekto napisal, neviem ako by som to do Arduina dostal. Vopred dik.

Kód: Vybrať všetko

 
volatile bool snimac = false;
unsigned long  cas_startu_f1=0;
unsigned long dlzka_pulzu=50;
unsigned long dlzka_fazy=0;
byte f1_ON=0, f2_ON=0, f3_ON =0; // faza zapnuta
byte f4_ON=0, f5_ON=0; // faza zapnuta


void setup()
{
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, zapni, FALLING); //prerusenie na pine 2
  DDRC = 0b11111111;
}

void loop()
{
 if (snimac==true)
  {
    f1_ON=true;
    dlzka_fazy = ( micros() - cas_startu_f1 ) / 6;
    cas_startu_f1=micros();
    snimac=false;
  }
    if (f1_ON && ( micros() > (cas_startu_f1 + dlzka_fazy)))      {PORTC = 0b00100100; f1_ON = false; f2_ON = true;}
    if (f2_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 2)))  {PORTC = 0b00100001; f2_ON = false; f3_ON = true;}
    if (f3_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 3)))  {PORTC = 0b00001001; f3_ON = false; f4_ON = true;}
    if (f4_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 4)))  {PORTC = 0b00011000; f4_ON = false; f5_ON = true;}
    if (f5_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 5)))  {PORTC = 0b00010010; f5_ON = false;}
}

void zapni()
{
    PORTC = 0b00000110; //zapni fazu jedna
    snimac=true;
} 
0

Používateľov profilový obrázok
budvar10
Ultimate člen
Ultimate člen
Príspevky: 1567
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa budvar10 » 24 Nov 2024, 10:09

Tak v prvom rade, o aké Arduino sa jedná?
2. ASM nie je žiadna raketová veda. Dá sa to implementovať aj priamo do C/C++, ale odpoveď an 1. otázku je nevyhnutná. Ale aj v C/C++ sa dá urobiť veľmi efektívny kód.
3. Zvoleja vieš napr. nahradiť volanie funkcií. Neustále používaš micros(). Funkcia má dosť veľkú réžiu už len samotným volaním. Či by sa to nedalo nahradiť premennou do ktorej to načítaš raz. Avšak musíme si uvedomiť, že pri každom volaní môže micros() vrátiť inú hodnotu. Dá sa upraviť kód tak, aby si uložil micros do premennej povedzme len na začiatku loop()?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2382
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 58
Kontaktovať používateľa:

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa peterple » 24 Nov 2024, 10:59

To čo píše budvar asi nebude zámer ale chyba. Dosť pochybujem že v tých testoch chce zámerne vždy použiť aktuálny čas. Takže jednoznačne vytvoriť premennú a na začiatku loop len raz do nej vložiť čas pomocou micros.

ďalší námet:
-

Kód: Vybrať všetko

    if (f1_ON && ( micros() > (cas_startu_f1 + dlzka_fazy)))      {PORTC = 0b00100100; f1_ON = false; f2_ON = true;}
    if (f2_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 2)))  {PORTC = 0b00100001; f2_ON = false; f3_ON = true;}
    if (f3_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 3)))  {PORTC = 0b00001001; f3_ON = false; f4_ON = true;}
    if (f4_ON && ( micros() > (cas_startu_f1 + dlzka_fazy * 4)))  {PORTC = 0b00011000; f4_ON = false; f5_ON = true;}
na

Kód: Vybrať všetko

unsigned long  microsec=micros();
unsigned long  cmpTemp=cas_startu_f1+dlzka_fazy;
    if (f1_ON && ( microsec > (cmpTemp)))      {PORTC = 0b00100100; f1_ON = false; f2_ON = true;}
    cmpTemp+=dlzka_fazy;
    if (f2_ON && ( microsec > (cmpTemp)))  {PORTC = 0b00100001; f2_ON = false; f3_ON = true;}
    cmpTemp+=dlzka_fazy;
    if (f3_ON && ( microsec > (cmpTemp)))  {PORTC = 0b00001001; f3_ON = false; f4_ON = true;}
    cmpTemp+=dlzka_fazy;
    if (f4_ON && ( microsec > (cmpTemp)))  {PORTC = 0b00011000; f4_ON = false; f5_ON = true;}
    cmpTemp+=dlzka_fazy;
    if (f5_ON && ( microsec > (cmpTemp)))  {PORTC = 0b00010010; f5_ON = false;}
  
Počítaš tam výrazy so 4 bytami a máš tam násobenie. To trvá tiež dosť cyklov (lebo to bude asi 8 bitopvé UNO) Násobenie som zrušil a výpočet zjednodušil.
Otázka je tiež či to treba počítať ako long a ci by sa to nedalo počítať aspoň ako int.

Inak ak chceš písať optimálne C programy, tak zanalostiam ASM sa nevyhneš, lebo musíš vedieť čo je za tým keď v C napíšes nejakú konštrukciu.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
budvar10
Ultimate člen
Ultimate člen
Príspevky: 1567
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa budvar10 » 24 Nov 2024, 11:32

Beriem späť moju prvú otázku. Odpoveď je priamo v nadpise UNO = ATmega328P. :rolleyes:
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 11:36

Arduino UNO mám v názve temy.
Celý projekt je ovladanie motorčeka HDD aby som dal čo najvyššie otáčky (som doma, po operácii, na bajk nemôžem .. :D ).
Vrchol jednej fázy motorčeka snimam optickým senzorom - v kotuči mam vyvrtane 4 otvory - je to moment kedy spúšťam fazu 1 (už v prerušení).
Medzi jednotlivými otvormi na disku (vrcholmi jednej fazy) musím prehodiť ešte ďalších 5 fáz a vytvoriť tak trojfazové točivé magneticke pole. Časy kedy prepínam tieto fázy musím zakaždým prepočitavať , keďže sa disk roztáča (čo mi je divne , roztočí sa aj z nuly ale len pri nízkom napajacom prúde) do nejakých max otáčok, dlžka fáz sa postupne meni. Takže "stopnem" ako dlho trvá od prerušenia k prerušeniu a tento čas rozdelim na 6 kusov a použijem pre následujuci cyklus. A opakujem par minút...
teraz už pri 25k RPM arduino nestiha robiť všetky fázy, proste su vypočty pomale.
Alebo máte iný napad ako to napisať aby to fičalo bez zmeny hardweru? Respektíve idedm to skúsiť nakopač do Arduino DUE , aj keď sa mi veľmi nechce prekopávat môj fabrický motor driver na 3,3V.
pre zaujimavosť, foto "projektu" :biggrin:
Prílohy
20241123_202043.jpg
0

Používateľov profilový obrázok
balu
Pokročilý člen
Pokročilý člen
Príspevky: 692
Dátum registrácie: 21 Feb 2022, 12:06

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa balu » 24 Nov 2024, 11:38

Abys mohl využívat funkce jako micros nebo millis, musí v arduinu běžet "na pozadí" nejaký timer s čítačem, který ten čas sleduje. Jsou prostě věci, které Arduino nasype do procesoru, aniž bys o tom věděl a třeba je ani nikdy nepoužil, ale procesorový čas zabírají. Moje rada k optimalizaci Arduina je : Nepoužívat Arduino, ale použít třeba Atmel Studio (dneska Microchip Studio) a procesor si nakonfigurovat pro běh sám. Jednak z datasheetu (a zase to sprosté slovo, že ?) víš, jakou má po zapnutí konfiguraci a jednak si podle toho datasheetu zapneš jen to, co skutečně potřebuješ. 1,5kHz přerušení není ještě tak moc, aby program nestíhal.
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 11:56

Viem že Arduino kod nieje zďaleka optimálny, ale keby nebolo jeho, nikdy by som s MCU nerozblikal ani blbú LEDku. Dosť dlho mi trvalo kým som pochopil ako pužiť: PORTC = 0b00000110; namiesto DigitalWrite xxx; (aby som ušetril hafo cyklov).
Niekoľkokrát som sa snažil pochopiť funkciu Timerov z datasheetu - zatial nič... :(
Tak idem skusiť to DUE či bude rýchlejšie keď ma vyšší takt, uvidime ako veľmi ho spomali Arduino "mikros".
Mám na to cca týždeň, tak Timery asi nedoštudujem :(
0

Používateľov profilový obrázok
budvar10
Ultimate člen
Ultimate člen
Príspevky: 1567
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa budvar10 » 24 Nov 2024, 12:04

Tieto technologicky vyspelejšie procesory, ako v DUE, nemusia byť riešenie. Rýchlosť spínania I/O je častokrát rovnaká ako pri ATmega. Nie je tam priama úmera s MHz procesora.

Okrem toho, čo tu bolo poradené, ešte je možnosť overclock. ATmega328P bude bežať absolútne spoľahlivo na 24MHz. To je dosť podstatné zrýchlenie.
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2894
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 29

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa maskrtnik01 » 24 Nov 2024, 12:08

Rýchlosť GPIO môže byť rovnaká, ale aspoň je vyššia frekvencia CPU na arduino overhead.

Ale tiež súhlasím. Arduino je dobré, keď chceš rýchlo nejaké výsledky. Ale keď chceš optimálny kód, musíš ísť hlbšie. Najjednoduchšia vec, pozri si zdrojáky digitalWrite, a porovnaj s tým jedným riadkom PORTx = .
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 12:13

Rýchlosti spinania I/O sa neobavam, mám pomerane skopom že je je to ďaleko rýchlejšie ako moje UNO
Okrem toho, tu som limitovaný výpočtom / programom , nie rýchlosťou spínania I/O, zatiaľ.
0

Používateľov profilový obrázok
budvar10
Ultimate člen
Ultimate člen
Príspevky: 1567
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa budvar10 » 24 Nov 2024, 12:34

Na tej podložke, čo si dal foto, chováš tam holuby?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2382
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 58
Kontaktovať používateľa:

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa peterple » 24 Nov 2024, 12:37

Mňa by zaujímalo či sa to zlepšilo keď si aplikoval tie naše námety na zrýchlenie kódu. Ja by som to typol že by to malo pomôcť minimálne 10x

K tým časovačom. Kludne používaj arduino prostredie. Podobne ako je to s PORTx DDRx tak je to aj s časovačmi. Môžeš to mixovať. Normálne sa na millis. micros použiva Timer0 myslím že keď tam nemáš millis alebo micros tak ho ani nepoužije. To znamená že ďalšie (timer1, 2) si neskôr keď sa to naučíš môžeš používať ako budeš chcieť.
Prípadne sa dá prekonfigurovať aj ten timer0 len potom už musíš vedieť kedy sa to bije s arduino funkciami.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 14:21

budvar, nie nekrmim holuby, len je taka doničena od cinu a kalafuny. Tenka plastova folia ma mindierky, neda sa to už umyť.
peterple, nevidim rozdiel na osciloskope ale asi pretože to nebude tym žeby arduino nestihalo.

V kode mam nejaku chybu, lebo už aj pri nizkych frekvenciach sa mi lišia dlžky fáz (to som si doteraz nevšimol) - so zvyšujúcou frekvenciou nepomer narasta, takže som si to skor všimol až pri vyššich frekvenciach.
budem musieť vymyslieť nejake ine rozdelenie na fazy, aby to bolo presnejšie
0

Používateľov profilový obrázok
balu
Pokročilý člen
Pokročilý člen
Príspevky: 692
Dátum registrácie: 21 Feb 2022, 12:06

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa balu » 24 Nov 2024, 16:08

Máš tam strašně moc výpočtů. Šlo by to udělat velice jednoduše s minimálním nárokem na počítání :

Přerušení od snímače :

Kód: Vybrať všetko

DobaMeziPrepnutim = MereniDelkyFaze / 6;
CasDoPrepnutiFaze = DobaMeziPrepnutim;
MereniDelkyFaze = 0;
AktivniFaze = 0;
ZapnutiPrvniFaze;
Přerušení od časovače :

Kód: Vybrať všetko

MereniDelkyFaze++;
if (CasDoPrepnutiFaze) CasDoPrepnutiFaze--;
Loop :

Kód: Vybrať všetko

if ((!(CasDoPrepnutiFaze))&&(DobaMeziPrepnutim))
{
    CasDoPrepnutiFaze = DobaMeziPrepnutim;
    AktivniFaze++;
    switch(AktivniFaze)
    {
        case 0: ZapnoutFazi0;
                break;
        case 1: ZapnoutFazi1;
                break;
        case 2: ZapnoutFazi2;
                break;
        case 3: ZapnoutFazi3;
                break;
        case 4: ZapnoutFazi4;
                break;
        case 5: ZapnoutFazi5;
                break;
        default: 
                AktivniFaze = 6;
                VsechnoVypnout;
                break;
    }
}
Všechny proměnné by měly stačit jako unsigned int (uint16_t).

V nejhorším by proměnné na měření času DobaMeziPrepnutim, MereniDelkyFaze, CasDoPrepnutiFaze a MereniDelkyFaze mohly být definované jako unsigned long int (uint32_t). Můžeš definovat až uint64_t, ale to už je opravdu přehnané...

Čím častěji budeš mít přerušení od časovače, na měření délky pulzu a odpočítávání času mezi přepnutím fází, tím přesnější budeš mít rozfázování. Hlavně - máš přesné časování díky časovači, který není závislý na tom, co zrovna procesor dělá a můžeš mít spočítáno, jak často toto přerušení přijde. Tudíž i nějaké vlastní časování nějakých pravidelných akcí je možné takto s přehledem udělat.

Možná budeš muset vyřešit nějakou "defaultní" výchozí hodnotu délky fáze (DobaMeziPrepnutim) pro případ rozběhu motoru, kdy ještě nemáš potřebná data pro výpočet délky fáze případně kdy se motor točí příliš pomalu a proměnná MereniDelkyFaze by přetekla.

S tímhle provedením budeš mít jen minimum (navíc jednodchých) výpočtů a i slušnou přesnost délky jednotlivých fází. V podstatě by měla "plavat" jen délka poslední fáze před dalším přerušením. Buď by se o neco málo zkrátila, když by impulz od snímače přišel dřív, než by se dopočítalo do nuly nebo by se fáze vypla dřív, než by se přepnulo na první. Případně by zůstala zapnutá déle, pokud bys v default v loopu vyhodil to vypnutí všeho.
0
Naposledy upravil/-a balu v 24 Nov 2024, 17:47, upravené celkom 1 krát.

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 16:20

balu, dik, precitam, len som už stihol napisat čo som zistil ja:
Zistil som že najdlhšie trvá vždy prvá fáza. Upravil som teda:
1. prvú fázu nezapínam v prerušení ale až v hlavnom programe (oneskorenie a skratenie prvej fázy o par us)
2. keďže najdlhšie trva delenie, a ja som čas od kedy sa začinalo počitať prehadzovanie faz, bral za delením, bol tento čas (aktualne trvajúci 40us) pripočitaný k dlžke prvej fázy. Čas "aktualny_cas" teda berem pred delením, a delenie sa uskutoční v čase keď je fáza zapnuta a ničomu to nevadi. Môžem tak skrátiť dlžku fazy až na nejakých 50us.
3. použitie premennej namiesto staleho volania micros , ušetrilo 6us v časti programu s delením, povodne teda trval 46us a predlžoval prvu fázu
4. tiež som použil premennu "aktualny_cas1" v ifoch pre prepinanie fáz (neušetri nič, ale asi lepšie vyzera program)
Pred upravami som mal pri 2kHz dlžku prvej fázy 130ms, ostatné cca 75ms.
Po úpravach som nameral od 86 do 90ms na vsetkých fázach.
zajtra test, BTW, neviete koľko vydrží disk HDD predtým než sa roztrhne? Hlinikový..., dal sa navtať. Už pri 25k mal zvuk že som sa bál viac pridávať a vietor z neho rohýbal záclonu.
kod:

Kód: Vybrať všetko

volatile bool snimac = false;
unsigned long  cas_startu_f1=0;
unsigned long dlzka_pulzu=50;
unsigned long dlzka_fazy=0;
unsigned long aktualny_cas=0;
unsigned long aktualny_cas1=0;
byte f1_ON=0, f2_ON=0, f3_ON =0; // faza zapnuta
byte f4_ON=0, f5_ON=0; // faza zapnuta


void setup()
{
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, zapni, FALLING); //prerusenie na pine 2
  DDRC = 0b11111111;
}

void loop()
{
 if (snimac==true)
  {
    PORTC = 0b00000110; //zapni fazu jedna
    aktualny_cas=micros();
    f1_ON=true;
    dlzka_fazy = ( aktualny_cas - cas_startu_f1 ) / 6;
    cas_startu_f1=aktualny_cas;
    snimac=false;
    
  }
  unsigned long aktualny_cas1=micros();
    if (f1_ON && ( aktualny_cas1 > (cas_startu_f1 + dlzka_fazy)))      {PORTC = 0b00100100; f1_ON = false; f2_ON = true;}
    if (f2_ON && ( aktualny_cas1 > (cas_startu_f1 + dlzka_fazy * 2)))  {PORTC = 0b00100001; f2_ON = false; f3_ON = true;}
    if (f3_ON && ( aktualny_cas1 > (cas_startu_f1 + dlzka_fazy * 3)))  {PORTC = 0b00001001; f3_ON = false; f4_ON = true;}
    if (f4_ON && ( aktualny_cas1 > (cas_startu_f1 + dlzka_fazy * 4)))  {PORTC = 0b00011000; f4_ON = false; f5_ON = true;}
    if (f5_ON && ( aktualny_cas1 > (cas_startu_f1 + dlzka_fazy * 5)))  {PORTC = 0b00010010; f5_ON = false;}
}

void zapni()
{
  snimac=true;
} 
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 24 Nov 2024, 16:28

balu, ak nepojde moje riešenie, skusim to Tvoje nahádzať
Ďakujem Vám páni za reakcie :agree:
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 27 Nov 2024, 11:10

takže, včerajší test nedopadol podla mojich predstav. Otáčky vpohode vybehli na 1,7kHz a dosť. Skušal som aj posunúť "predzápal" aby som mal pri 1A čo najvyššie otáčky. Bolo mi to divné, keďže arduino sa správalo vpohode keď som prerušenie budil "externe" zdrojom signálu, fičalo na 2kHz uplne krásne.
Takže znova merania. Nakoniec som zistil že vo vysokých otáčkach už nestiha signal zo snímača QRD1113 klesnúť pod "rozhodovaciu" úroveň operáku (tiež nevhodne zvolený operák, ale akú doma mala , takú dala :biggrin: ) a teda vypadávali impulzy pre prerušenie. Snímač som teda zaťažil menším odporom, napetie išlo nižšie, ešte som doladil "rozhodovaciu úroveň" na operáku a hľa:
2,3Khz (cca 34 000 RPM) pri cca 40V a 2,5A - motor samozrejme po chvíli smrdí ale zatiľ prežil niekoľko roztočení.
0

Používateľov profilový obrázok
budvar10
Ultimate člen
Ultimate člen
Príspevky: 1567
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa budvar10 » 27 Nov 2024, 11:16

O čo sa snažíš, o max. možné otáčky?

Pre optimalizáciu kódu je dobré porovnávať ASM listing, kde je koľko inštrukcií. To ale nie je až také jednoduché pre začiatočníka.
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4688
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 49

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa misocko » 27 Nov 2024, 11:48

max otáčky, ano
Ale myslim že 35k RPM bohate stačí. Už toto je nad moje očakávania. Hlavne s hardwerom ktorý mám...
To už pomaly treba začať počítať o koľko ° pustiť fázu skor aby max prúd v cievke bol práve vtedy keď treba max ťah.
0

Používateľov profilový obrázok
budvar10
Ultimate člen
Ultimate člen
Príspevky: 1567
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Optimalizácia kódu pre Arduino UNO

Príspevok od používateľa budvar10 » 27 Nov 2024, 14:13

Ostal si pri UNO alebo si zamenil za DUE?

Ešte mi napadlo ohľadne tej matematiky, či je potrebné unsigned long, či nestačí 16bit napr. alebo aj 8bit. Záleží s akými veľkými číslami robíš. Pri porovnaní by sa ušetrili inštrukcie. Tiež násobenie napr. x * 2 je x <<2, x* 3 je x << 2 + x.
Prípadne dlzka_fazy jednoducho pripočítavať pri každom if., lebo tam máš v podstate dlzka_fazy * 1, 2, 3, 4, 5.
Takisto rovno vytvoriť premennú cas_startu_f1 + dlzka_fazy, kde už len pripočítaš dlzka_fazy pre každý if.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok