C Programlama diliyle şamatalar

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

foseydon

o arada boşlukta neler olduğu işlemcinin ilgili dökümanında yazar, yazmıyorsa zaten senin bilmene ve ellemene gerek yoktur.

*0x4000300C =0x00000001;

böyle atama olmaz. şu şekilde yaparsın, çalışadabilir. muhtemelen derleyici hata uyarısı verir. ama çalışsa bile bunun birkaç sakıncası var. birincisi kodu okuyan kişi(bu senden başkasıda olabilir) bu atamanın ne amaçla yapıldığını anlayamaz, belki birkaç saat döküman karıştırması gerekir. ikincisi ise pointer'ın type'ı nerde? senin verdiğin adrese istediğin değeri yazacak, fakat o adresin kapasitesi ne? diyelim 16 bit olsun kapasite, yazılımcı gitti 32 bit değer yazmaya kalktı, ne olacak? yandaki alana taşacak verdiğin değer ve belkide istemediğin bir sonuç doğuracak. pointer'ın type'ı olmadığı için derleyici type check yapamayapacak.

altunalperr

'implicit declaration of function is invalid in c99'  Keil'da stm32 için kod yazarken bu uyarıyı alıyorsam ne yapmam gerekir?

e-zeki

Yazdığınız fonksiyon tipini oluşturmadığınız anlamına geliyor.
void, int vb. gibi bir fonksiyon tipi ile yazmamışsınız. C99'da bu tip fonksiyonlar geçersiz sayılır.

mehmetali5454

Merhaba
GPIO->MODER &=~1<<4 ;
Yazmak yerine
GPIO->MODER &=~ (3UL<<4)
yazmış
Buradaki L düşük bitli registeri mi anlatiyor
4. Biti 1 yapma diyor ama neden böyle karisik bir ifade seçilmiş
neden 3 .5 değil,7 değil
neden UL yada neden neden UH değil?


flowchartx

UL unsigned long demektir. Yani işaretsiz 32 biti temsil eder. Bu kod satırı bitleri sıfırlama veya işlemciye göre pinleri input olarak ayarlamaya yarar. UL yazmak implicit dönüşümden kaçmak için kullanılır.

Tagli

Arkasında UL gibi ekler olmayan sayılar (literal) int türünden sayılır, yani işaretli kabul edilir. C'de işaretli bir sayı üzerinde kaydırma işlemi yapılması tehlikeli bir işlemdir ve bazı durumlarda "undefined behavior" sayılır, yani duruma göre çalışma ihtimali olsa da dil standartında bir kurala bağlanmadığı için tehlikeli bir işlemdir. Bu sebeple kurallar dahilinde kalmayı garantilemek için sayının işaretsiz olduğu belirtilmiş. Sadece U yazsaydı da olurdu bence.

Not: C'yi bilmiyorum ama C++20'den itibaren işaretli sayıların kaydırılması işlemi artık "undefined behavior" değil. Yine de olaya temkinli yaklaşmak lazım.
Gökçe Tağlıoğlu

mehmetali5454

Cevaplariniz için teşekkür ederim
UL harfinin yanindaki sayilari ve değeri nasil açiklayabiliriz,logik 1 yerine 3 yazilmiş,4.biti 3 yapma desek anlami olmaz.

flowchartx

o satırı şöyle okuyabilirsiniz 3(0011) yazıp 4 tane sola kaydırıp registerın kendisiyle and işlemine sokuyor ve tersini alıyor büyük ihitimalle registerın ilgili bitlerini 0'lamak için kullanılıyor.

mehmetali5454


mehmetali5454

4 adım gitmesi mantikli olmaz,3 adim gitse yine 4.biti 1 yapma,anlamina gelir,işin mantigi anlatilinca 6UL<<7 de olabileceği anlaşılır

Tagli

MODER bitleri 2'şerli gruplar halinde. Her bir bacağın hangi modda olduğunu 2 bit belirliyor yani. 4 defa kaydırmak demek, ilgili portun 2 numaralı bacağına (0 ve 1'i atlayıp) ulaşmak demek. Yeni ayarları yapmadan önce maskenin tersi ile AND'leyerek ilgili 2 biti sıfırlamış.

Ben olsam ön tanımlı maske adını kullanırdım ama. Şu anda aklımda olmadığı için örnek veremiyorum. GPIO_MODER_MODE2 falan gibi bir şey olsa gerek, yani GPIO->MODER &= ~GPIO_MODER_MODE2; yazılabilirdi (maske adını yanlış hatırlıyor olabilirim tabi)
Gökçe Tağlıoğlu

mehmetali5454

Profesyonel bir ifade, Gökçe hocam , iyi çalışmalar