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