Virtual PORT

Atxmega má instrukce pro manipulaci s jednotlivými bity (CBI, SBI a podobně), ale ty nelze uplatnit na registry, které řídí porty. Z toho plyne že se k portům musí přistupovat komplikovanějšími istrukcemi (nejméně 2 strojové cykly) a ty zpomalují jejich ovládání. Někdy ale budete chtít ovládat porty co nejrychleji. V takovém případě si můžete celkem čtyři porty "namapovat" na takzvané virtuální porty. Virtuální porty už lze ovládat bitovými instrukcemi a práce s nimi může být rychlejší (1 srojový cyklus). Virtuální porty lze ovládat pomocí registrů DIR,OUT a IN. Na první pohled se vám může zdát, že absence registrů typu "SET" a "CLR" vás bude nutit k read-modify-write přístupu, který je sám o sobě pomalý. Kompilátor, ale přístup optimalizuje, takže zápis:

VPORT0.OUT |= PIN6_bm;
VPORT0.OUT &= ~PIN6_bm;

se do asembleru přeloží jako:
SBI 0x11,6		Set bit in I/O register 
CBI 0x11,6		Clear bit in I/O register 

Konvenční přístup bez virtuálních portů s využitím OUTSET a OUTCLR registrů vypadá následovně:
PORTC.OUTSET = PIN6_bm;
PORTC.OUTCLR = PIN6_bm;	

A v assembleru má následující podobu:
STD Z+5,R24		Store indirect with displacement 
STD Z+6,R24		Store indirect with displacement 

Která je evidentně už sama o sobě hodně zhušťěná, protože překladač už předem ví že budeme zapisovat do obou registrů tutéž hodnotu. Takže by její výsledek byl ještě pomalejší, pokud by překladač předem nevěděl jakou hodnotu do registrů bude zapisovat. I tak je rychlost dvakrát nižší, protože intrukce STD trvá dva strojové cykly. Porovnání můžete vidět na následujícím obrázku.
Virtual PORT vs konvenční přístup - Růžový průběh s pomocí virtuálních portů. Při 32MHz je vidět že PC6 tráví v log.1 pouze dobu 1 strojového cyklu (cca 31ns). Oranžový průběh pak znázorňuje dvakrát pomalejší přístup přes registry OUTSET a OUTCLR.


Limitace rychlosti přeběhu - Oranžový průběh s limitací, růžový bez limitace