Vedeli ste, že mnohé AVR čipy majú typ hardvéru exkluzívnej alebo (xor), keď sa týka logických úrovní výstupných kolíkov? Ak sa pozriete do dátového listu (obrázok vyššie je screenshot z dátového listu Attiny13) nájdete časť o prepínaní PIN. Ukazuje sa, že ak nastavíte port ako výstup, písanie logiky jedna do príslušného registra PIN prepínaním logických úrovní. To je naozaj jednoduché zanedbávanie, ak píšete v C, ale pracujem na učení sa trochu spojovacieho jazyka a našiel som to byť veľmi užitočné. Udržujte čítanie po prestávke a poviem vám, ako som sa stal na týchto informáciách a čo je to dobré.
Takže najprv, povedzme o tom, prečo to nezáleží veľmi veľa, ak píšete v Code C. Typicky, ak chcete prepnúť niektoré výstupné piny, stačí napísať jednu vložku, ktorú XOR je s bitmarskou
1
Portb ^ = 0xff;
To je trochu C Losshand (učiť sa oveľa viac o tom, že z mojich tutoriálnych sérií), ktorá vykonáva XOR na aktuálnych úrovniach výstupu a píše výsledok späť do portu. Ale to isté je možné vykonať v hardvéri písaním bitmask do registra PINB:
1
Pinb = 0xff;
Nezaujímate sa, pretože je to len jeden riadok kódu. V skutočnosti je to pravdepodobne jednoduchšie na XOR Portb, pretože to robí oveľa väčší zmysel. Ale kompilátor môže skončiť s použitím oveľa viac cyklov, ako keby ste zapísali do registra PIN.
Stalo som sa cez túto funkciu, pretože som bliká niektoré LED ako spôsob, ako sa učiť assembler. Mal som tento útok kódu v rutine prerušenia:
1
2
3
4
LDI MYREG, 0xFF
v IntRG, Portb
eor intreg, myreg
OUT PORTB, INTREG
Vloží bitmask do jedného registra, zaťaženie v aktuálnej logike z PORTB do iného registra, vykoná XOR z dvoch a píše výsledok späť do Portb. To trvá štyri cykly a vyžaduje dva registre. Prepínacie bity je taká základná operácia, ktorú som bol ohromený, nebolo príkaz na xor bity priamo, takže som začal hľadať okolo. Našiel som tento krátky článok na AVR FREAKS, KTORÉ MAJÚ ZAPOJENOSTI MÁ MOŽNOSTI DO BIT TOPINGIENT FUNME. Teraz som bol schopný znížiť môj assedbler kód takto:
1
2
LDI INTRESH2, 0xFF; Časovárnosť Použite IntReg2 ako bitovú masku
OUT PINB, INTRESH2; Písanie pinb efectivley robí exkluzívny alebo na portb
To má za následok rovnaký prepínací efekt, ale trvá len dva cykly a vyžaduje použitie iba jedného registra.
To, čo som našiel mnoho zaujímavých, je, že bez ohľadu na to, koľko používam AVR čipy, nikdy nie je nedostatok prekvapení, ktoré čakajú, že sa nachádzajú v liste.