GPIORn

Odpovědět
butan
Příspěvky: 109
Registrován: 02 dub 2019, 07:06

GPIORn

Příspěvek od butan »

Použil jste někdy někdo na atmelech GPIORn registry?
Lubor
PS po chvilkách si listuji návodem od CPU arduína uno, a často narazím na něco neobvyklého.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: GPIORn

Příspěvek od DavidO »

To jsou prostě 3 bajty v I/O prostoru navíc. Žádná periferie je nepoužívá, programátor si s nima může dělat, co chce, třeba si tam něco uložit. Podobně jako bit T ve stavovém registru.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
butan
Příspěvky: 109
Registrován: 02 dub 2019, 07:06

Re: GPIORn

Příspěvek od butan »

A po resetu se ta ramka nuluje.
pokud to neudělá bootloader, ale když už jsem si udělal debugger, tak to můžu snadno zkontrolovat.
Lubor
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: GPIORn

Příspěvek od DavidO »

V datasheetu píšou, že po resetu tam je 0, takže leda obráceně, že by ti tam bootloader něco strčil (ale proč, když se obvykle používá generický, který nemá důvod)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
HonzaD
Příspěvky: 12
Registrován: 17 bře 2020, 12:39

Re: GPIORn

Příspěvek od HonzaD »

GPIOR0 a 1 jsou MNOHEM lepší než RAMKA - jsou v I/O prostoru dosažitelném instrukcemi cbi/sbi a lze testovat jednotlivé bity. Obecně přístup k nim je rychlejší než k obyčejné RAM a navíc je možné nastavovat/nulovat jednotlivé bity bez účasti registrů CPU. To je výhodné například (zejména) v obsluze přerušení které může vypadat např.

Kód: Vybrat vše

ISR(xxx_vect, ISR_NAKED) {
  GPIOR0|=MyFlag;
  reti();
}
Někde v programu si pak zkontroluji hodnotu MyFlag a vím, jestli se stala ta věc, které se dané přerušení týká. Obsluha přerušení je ale velmi rychlá, protože se nemusely ukládat žádné CPU registry.
Na první pohled to může vypadat jako samoúčelná blbost - mohl bych rovnou kontrolovat "flag" (jak se to řekne česky? vlajka?) příslušného přerušení. Pokud ale např. je procesor uspaný a je víc možných příčin, proč se probudí, tak se to musí udělat např. takhle. Druhá věc je, že do ISR mohu přidat např. "PORTB|=1", což také nejde přes CPU registry a zareaguje "ihned" a složitější rekce přijde "až bude mít procesor čas".

Jestli si dobře vzpomínám u ATMega328 je GPIOR2 mimo "privilegovanou" I/O oblast a oproti RAM paměti žádné výhody nemá.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: GPIORn

Příspěvek od DavidO »

Dík za připomenutí! :idea:
Na 128 nejsou (tam jsem používal v přerušení právě ten T) a s 328 jsem ještě takovýhle kejkle nedělal, tak mi to nedocvaklo...

Na 328 (+ těch stejných menších 48/88/168) a i na 16/32U4 je takhle použitelný jen GPIOR0, protože ty 4 instrukce co s tím pracujou přímo (nastavení SBI a CBI a podmíněné skoky SBIC a SBIS) dosáhnou jen na IO registry 0-31, ale GPIOR1 a 2 mají adresy nad 32. Takže z nějakého vyššího jazyka by se to muselo asi opsat a už to bysme si nepomohli.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: GPIORn

Příspěvek od DavidO »

Hm, tak teď jsem si to zkusil, ale avr-g++ (z instalace Arduina) mi to udělalo klasickou read-modify-write trojičkou in-ori-out pro libovolný dolní IO registr (a stejně tak mi to vygeneruje i avr-gcc od WinAVR). To je ňáký divný. Že bych měl nějak blbě nastavený optimalizace?
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
HonzaD
Příspěvky: 12
Registrován: 17 bře 2020, 12:39

Re: GPIORn

Příspěvek od HonzaD »

Myslím, že to bude vypnutou optimalizací. Mě každopádně Atmel Studio 7.0 generuje sbi/cbi, když to jde (i pro PINB|=1, což se dá považovat za bug).

Ještě jsem na to koukal - GPIOR1 a 2 skutečně nejsou dosažitelné pomocí instrukcí sbi, cbi, ale jsou v dosahu instrukcí in a out (ty dosáhnou až k registru 0x3F, což je snad vždy SREG). Takže je přeci jen o kousek efektivnější použít jeden z těchto dvou než SRAM.
Odpovědět