__IO tanımlaması ve kullanımı

Başlatan volkii, 30 Haziran 2012, 01:47:28

volkii

arkadaşlar iyi geceler,

keilde bir kod inceliyorum ki, ne olduğunu tam çözemediğim bir noktaya takıldım. tanımlama şu şekilde:
static __IO uint32_t TimingDelay = 0;

burdaki __IO ne anlama gelmektedir.
birde şöyle bir şey var:

NOR_ID->Device_Code1 = *(__IO uint16_t *) ADDR_SHIFT(0x0001);

burada da pointerlı bir tipe dönüşüm yapmış ama doğal olarak bunu anlayamadım. yardımcı olursanızı çok sevinirim

controller

__IO karşılığı volatile olarak tanımlanmış bir define

#define __IO volatile

volatile kullanım amacı gpio gibi işlemcinin donanım (peripheral) register leri üzerindeki derleyici optimizasyonunu pas geçmek. çünkü bu register adreslerine atanan değişkenlerin içeriği programın akışından bağımsız değişebilir. bu keyword ile derleyiciye değişkenin her seferinde donanım registerinden okunması söylenir.

Diğer satırda da sanırım ADDR_SHIFT fonksiyonun döndürdüğü değer 32bit ancak atanacak değer (Device_Code1) 16 bit.
Burada 32 bit olarak dönen değer 16 bit adres değişkenine cast edilmiş, daha onra bu adresin içeriği pointer ile Device_Code1 değişkeninin içeriğine yazılmış.
Tam kodu görmeden söylemek zor ama 32bit bir değeri 2 parça halinde 2 16bit değişkene atanması gibi görünüyor.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.