C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

yamak

Bi farkı yok hocam. Ama benim bahsettiğim sorun örneğin bi değişkeni int olarak tanımladık daha sonra bit kaydırma operatörünü kallanarak 0xFFFF0000 değerini aştık bunu aştıktan sonra sorun oluşmaz mı?Ya da farklı şeylerden bahsediyor olabiliriz :)

z

#121
....
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Derleyici, optimizasyon yaparken yazdığınız bazı satırları hiç işleme almayabilir.

Örneğin

int a;
           a=1;
           a=2;

örneğinde a=1; gereksiz görünmektedir.         

Fakat burada a bir register ise

           a=1;
           a=2;

satırlarının her ikisi de işletilmelidir.

Zira, bazı registerlere veri yazmak aynı zamanda bir başka registerde bilmem ne bitinin otomatik sıfırlanmasına neden olur.
Bu durumda yukarıdaki kod optimize edilip sadece a=2 koduna çevrilirse program hatalı çalışacaktır.

Bu gibi durumlara engel olmak için veri tipinin tanımlandığı satırın başına volatile ekinin getirilmesi yeterli olur.

#define Reg  (*((unsigned int*) 0x42345678))              // sorun oluşturacak tanımlama şekli

#define Reg  (*((volatile unsigned int*) 0x42345678))   // sorunsuz tanımlama şekli


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: GreeN - 26 Ekim 2011, 22:10:53
Bunu derleyebildinizmi?
const int *ap=&a;
bu satırda c++ hata vermişti bende.

BORLAND C 4.5 ile denedim calisti

c++ yerine c compiler secenegi ile deneyin. C++ daha 'strong typed' bir derleyicidir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

Alıntı yapılan: yamak - 27 Ekim 2011, 01:23:24
Hocam volatile eğer kesme içinde bir değişken değer alıp sonra o değişkeni main içinde kullanacaksak kullanırız.Yani derleyiciye kod optimizasyonu yapma diyoruz.Eğer volatile kullanmazsak o değişkenin eski değerini okuyabiliriz.

volatile, eger program calisirken kendi kendine degisen (buyuk olasilikla donanimdan dolayi) sayaclar vb icin kullanilir. Bunlarin kesme ile bir alakasi yoktur.

Aslinda volatile ile derleyiciye optimizasyon sirasinda program icinde degeri degismeyen degiskenleri optimize etme diyoruz yoksa ornegin seri data gelmismi diye bir registerin bir bitine surekli bakan bir while dongusunu derleyici bu degiskeni dongu icerisinde degeri hic degismiyorki der ve onun icin gerekli kodu uretmeyebilir.

onun icin donanimi kontrol eden butun registerlar  program icinden volatile diye tanimlanir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Merak ettiğim bir konu var.

#define Reg  (*((volatile unsigned int*) 0x42345678))   

Kullanılan işlemcinin derleyicisinde unsigned integerin 32 bit olduğunu biliyoruz. Buna rağmen çipin register tanımlamalarının yapıldığı dosyalarda  #define Reg  (*((volatile unsigned long*) 0x42345678))   tanımı yapılıyor.

Öte yandan hangisini kullanırsak kullanalım aynı kod üretiliyor.

Buradaki espiri nedir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

O zaman ARM işlemciler için yazdığımız kodları ileride çok farklı bir işlemciye taşırken sorun çıkmasın diye düşünebiliriz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

Geçen gün veri tiplerinin tanımlanması hususunda baya uzun bir mesaj yazdım. Ancak tam yollayacakken şimdi yeri değil diye iptal ettim. Keşke etmeseymişim. Bilmeyen arkadaşlar için söylüyorum. Yazdığınız kodları başka platformlar içinde kullanmak istiyorsanız eğer; @gerbay' ın dediği gibi stdint.h dosyasını iyice bir inceleyin. Bu kütüphane C99 Standartlarına göre düzenlenir.

Eğer kodunuzu taşıdığınız platformda veri tiplerinizin kaç byte ile ifade edileceğini belirlemek istiyorsanız bu tanımlamaları göz önünde bulundurmanız yeterli.

Keil stdint.h'den alıntıdır
    /* minimum values of exact-width signed integer types */
#define INT8_MIN                   -128
#define INT16_MIN                -32768
#define INT32_MIN          (~0x7fffffff)   /* -2147483648 is unsigned */
#define INT64_MIN  __ESCAPE__(~0x7fffffffffffffffll) /* -9223372036854775808 is unsigned */

    /* maximum values of exact-width signed integer types */
#define INT8_MAX                    127
#define INT16_MAX                 32767
#define INT32_MAX            2147483647
#define INT64_MAX  __ESCAPE__(9223372036854775807ll)

    /* maximum values of exact-width unsigned integer types */
#define UINT8_MAX                   255
#define UINT16_MAX                65535
#define UINT32_MAX           4294967295u
#define UINT64_MAX __ESCAPE__(18446744073709551615ull)
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

MC_Skywalker

C dilini hiç bilmeyen arkadaşlar için C derneğinin hazırlamış olduğu ders notları

dökümanın şifresi        cdernek

http://hotfile.com/dl/133447593/03cab39/cdersi_cdernek.pdf.html

yamak

Alıntı yapılan: mufitsozen - 27 Ekim 2011, 13:38:18
volatile, eger program calisirken kendi kendine degisen (buyuk olasilikla donanimdan dolayi) sayaclar vb icin kullanilir. Bunlarin kesme ile bir alakasi yoktur.

Aslinda volatile ile derleyiciye optimizasyon sirasinda program icinde degeri degismeyen degiskenleri optimize etme diyoruz yoksa ornegin seri data gelmismi diye bir registerin bir bitine surekli bakan bir while dongusunu derleyici bu degiskeni dongu icerisinde degeri hic degismiyorki der ve onun icin gerekli kodu uretmeyebilir.

onun icin donanimi kontrol eden butun registerlar  program icinden volatile diye tanimlanir.
Hocam kesme örneğini şu yüzden verdim:
Örneğin kesme içinde benim "a"  adında bi değişkenim var ,ben bu değişkeni main fonksiyonu içinde kullanıyorum ve "a" nın değeri seri porttan okunan değerlere göre değişebiliyo.ben bu "a" nın değerini main fonksiyonu içinde kullanacağım zaman derleyici bu değişkenin herhangi bir zamanda değişmeyeceğini kabul edip  hep başlangıçtaki değerini bu değişkenin içinde tutabilir.Yani derleme yaparken bu değişkenin yerine sabit bir sayı ya da string koyabilir.Fakat ben bu değişimi kesme içinde değil de main içinde yapmış olsaydım örneğin:
while(1)
{
   a=uart_register;
}
bu durumda derleyici a nın değerini uart_derleyicisini bağlı olduğunu bileceği için optimizasyon yapmayacaktı. Bu söylediklerimde haksız mıyım?

eistain_54

Hocam anlamadıım iki konu var...
structure ve union
pointer
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

mufitsozen

#131
Alıntı yapılan: yamak - 28 Ekim 2011, 14:15:05
Hocam kesme örneğini şu yüzden verdim:
Örneğin kesme içinde benim "a"  adında bi değişkenim var ,ben bu değişkeni main fonksiyonu içinde kullanıyorum ve "a" nın değeri seri porttan okunan değerlere göre değişebiliyo.ben bu "a" nın değerini main fonksiyonu içinde kullanacağım zaman derleyici bu değişkenin herhangi bir zamanda değişmeyeceğini kabul edip  hep başlangıçtaki değerini bu değişkenin içinde tutabilir.Yani derleme yaparken bu değişkenin yerine sabit bir sayı ya da string koyabilir.Fakat ben bu değişimi kesme içinde değil de main içinde yapmış olsaydım örneğin:
while(1)
{
   a=uart_register;
}
bu durumda derleyici a nın değerini uart_derleyicisini bağlı olduğunu bileceği için optimizasyon yapmayacaktı. Bu söylediklerimde haksız mıyım?

Evet, haksizsiniz maalesef. :o  Cunki verdiginiz ornek yanlis. (buna eski dilde sui-misal emsal olmaz diyoruz  :-\). Diyelimki seri_port_status_reg diye bir (HW) register var ve bunun 1inci biti seri bilgi geldiginde 1 oluyor. Sizde bir yerden seri bilgi gelip gelmedigini programinizda anlamaya calisiyorsunuz.

Bunun icin suna benzer bir kod yazdiniz diyelim:

         while( (seri_port_status_reg & 1) == 0);  /* seri_port_status_reg 1.biti 0 ise bekle */
/* gelen seri datayi oku */
.......

compiler bu while icinde bu degiskenin degeri hic degismiyor diye bu donguye ait hic bir kod yaratmayabilir (optimizasyon secimine bagli olarak) ama volatile derseniz programin islemesinden bagimsiz olarak bu deger degisebilir diye while dongusune ait kod yaratilir.

Su anda cok vaktim olmadigindan daha guzel bir ornek veremiyorum ama, @gerbay'in vakti varsa cok daha guzel bir sekilde bunlari anlatabilir.


Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

#132
Alıntı YapEvet, haksizsiniz maalesef.   Cunki verdiginiz ornek yanlis. (buna eski dilde sui-misal emsal olmaz diyoruz  ). Diyelimki seri_port_status_reg diye bir (HW) register var ve bunun 1inci biti seri bilgi geldiginde 1 oluyor. Sizde bir yerden seri bilgi gelip gelmedigini programinizda anlamaya calisiyorsunuz.

Bunun icin suna benzer bir kod yazdiniz diyelim:

         while( (seri_port_status_reg & 1) == 0);  /* seri_port_status_reg 1.biti 0 ise bekle */
/* gelen seri datayi oku */
.......

compiler bu while icinde bu degiskenin degeri hic degismiyor diye bu donguye ait hic bir kod yaratmayabilir (optimizasyon secimine bagli olarak) ama volatile derseniz programin islemesinden bagimsiz olarak bu deger degisebilir diye while dongusune ait kod yaratilir.

Su anda cok vaktim olmadigindan daha guzel bir ornek veremiyorum ama, @gerbay'in vakti varsa cok daha guzel bir sekilde bunlari anlatabilir.
Aslında benim anlatmaya çalıştığım şey buna benzer bir şey.
Ama tamam gerbay'dan ya da bunalmis'tan yanıt bekliyorum.  :)

z

Alıntı yapılan: eistain_54 - 28 Ekim 2011, 17:13:56
Hocam anlamadığım iki konu var...
structure ve union
pointer

Neresinde takıldın?


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

konuyu anlamadım.komple yokbnde
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!