AVR funkce
Tomáš Halabala
tomas.halabala@iol.cz
Středa Srpen 19 09:48:49 CEST 2009
Chovani GCC je nekdy opravdu nevyspytatelne. Takovych pripadu divneho
chovani bych sem mohl psat tuny.
Ve vasem pripade bych si asi napsal makra pro cbi a sbi v asembleru a
byl by pokoj.
#define sbi(PORT, BIT) __asm__ __volatile__("sbi %[_PORT], %[_BIT]" \
: : [_PORT] "I" _SFR_IO_ADDR(PORT), [_BIT] "I" (BIT) )
#define cbi(PORT, BIT) __asm__ __volatile__("cbi %[_PORT], %[_BIT]" \
: : [_PORT] "I" _SFR_IO_ADDR(PORT), [_BIT] "I" (BIT) )
Proti tomuto zakerna optimalizace nic nezmuze.
Tomas
huda napsal(a):
> Dekuji,
>
>>> __attribute__((noinline)) void cekej(unsigned int cas)
>
> to je presne ono.
>
> Jeste mam jeden problem.
> Pouzivam ATXmega128A1 a PORTD jsem si namapoval
> jako virtualni VPORT1, abych mohl pouzivat instrukce CBI a SBI,
> ktere umi pracovat s hodnotou registru maximalne 32.
>
> A ted k problemu.
> Mam nadefinovano ovladani jednotlivych pinu portu takto:
> #define SDA1 2
> #define SDA1_ON sbi(VPORT1.OUT,SDA1)
> #define SDA1_OFF cbi(VPORT1.OUT,SDA1)
>
> V jedne casti programu tyto piny inicializuji a prekladac to prelozi
> spravne.
> SDA1_OFF; --> cbi 0x15, 2 ;
> v jine casti to prelozi takto: (Y je nastaveno spravne na 0x0014)
> SDA1_OFF; --> in r24, 0x15 ;
> andi r24, 0xFB ;
> std Y+1, r24 ;
> Obe casti jsou v jednom modulu. Toto dela i u jinych, takto definovanych
> pinu.
>
> Nevim uz co s tim. Jedna se o cast, kde bych ocenil kratke instrukce,
> ale jeste to neni tak kriticke, aby to muselo byt psane v asembleru.
>
> Dekuji za kazdy napad.
> HUDA
Další informace o konferenci Hw-list