C Programlama diliyle şamatalar

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

z

Şimdi daha önceleri hiç C ile uğraşmamış olanları değil de uğraşanları davet edelim.

#include "STM32F4xx.h"

void SystemInit()
{
    RCC->AHB1ENR |= 0x00000008;    // GPIOD donanımının clock sinyalini uygulayalım
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

int main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
   }
}

// Programın sonudur.

Yukarıdaki programda;

#include "STM32F4xx.h" satırını kaldırıp atalım. Programımızda header dosya vs kalmasın.

Programda aşağıda adıgeçen registerleri structure pointer yapısından kurtarıp structure yapısına dönüştürelim.
Sözkonusu register adreslerini STM32F4xx.h dosyasından öğrenebilirsiniz.

RCC->AHB1ENR
GPIOD->MODER
GPIOD->OSPEEDR
GPIOD->ODR
GPIOD->ODR

Sorumuz budur.

Yukarıdaki soruyu çözdünüzmü C de kod yazmayla ilgili hiç bir sıkıntınız kalmaz ve C de ilerlemeye başlarsınız.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Hocam şu satıra dikkat etmemişsin.

Programda aşağıda adıgeçen registerleri structure pointer yapısından kurtarıp structure yapısına dönüştürelim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Alıntı yapılan: gambit1244 - 25 Ekim 2011, 17:21:39
arkadaşlar degerli bilgiler için cok teşekkür ederim
sormak istedigim bişey daha var
mesela
RCC->AHB1ENR
boyle bir register kayıt işlemi var

buradaki ->  işlemini c kitabında hiç gormedim
gordüysemde hatırlayamadım

bu işlem asm komutumu yoksa sadece register için kullanılan bi komutmu
eğer oyleyse  bunun gibi c de olmayan komutlar nelerdir  yada bilmemize gerek varmı sizce

Eğer struct ya da Union; pointer ise , yapının elemanlarına ulaşmak için bu "->" işaret kullanılır.
Örneğin.
typedef struct{
   char hasan;
   int mehmet;
   float ali;
} structtest;
// fonksiyona geçilen parametre  struct
void struct_param_normal ( structtest prm_normal){
    prm_normal.ali = prm_normal.mehmet * prm_normal.hasan;
}  

// fonksiyona geçilen parametre struct pointer
void struct_param_ptr( structtest *prm_ptr){
    prm_ptr->ali = prm_ptr->mehmet * prm_ptr->hasan;
} 


z

#63
Açıklamayı unuttugumuz bazı C komut / terimlerini şimdi ele alalım.

#define  Tanım yapmak için kullanırız.

Ornekleri inceleyin.

#define  AlarmLediniYak 0x10


    GPIO.PORTA.ODR |=AlarmLediniYak;

Yukarıdaki ifade GPIO.PORTA.ODR |=0x10; komut satırına eştir.

Ancak GPIO.PORTA.ODR |=AlarmLediniYak;  okunaklığı ve anlaşılırlığı yüksektir.

Yada aşağıdaki örneğe bakın

#define Yan GPIOD->ODR= 0x0000F000
#define Son GPIOD->ODR= 0x00000000


    if (LedFlag) Yan;     // Ledler yansin
      else Son;                  // Ledler sonsun


Yukarıdaki iki satır aşağıdaki satırlarla aynı anlama gelir.

     if (LedFlag) GPIOD->ODR= 0x0000F000;     // Ledler yansin
       else GPIOD->ODR= 0x00000000;                  // Ledler sonsun

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

z

#64
volatile

Bazı ARM registerlerinin özelliği gereği, okunduğunda register içeriğinde bazı bitler silinir.

RegX böyle bir register olsun.

void Sifirla()
{
int A;

     A=RegX
}

gibi bir fonksiyon derleyici tarafından optimize edilip çağrılmayabilir. Çünkü RegX okunmuş ve A içine yazılmış fakat A hiç bir yerde kullanılmamıştır.
Dolayısı ile derleyici bu fonksiyonu işe yaramaz olarak görecektir.

Fakat bu durumda biz Sıfırla fonksiyonunu çağırmakla, RegX registerinin okuyup içeriğini silmek istediğimizden, derleyici de bu fonksiyonu es geçtiğinden, RegX de bazı bitler silinmeyeceğinden  programımız düzgün çalışmaz.

Bu duruma engel olmak için A değişkeninin tanımını aşağıdaki gibi yaparız.

void Sifirla()
{
volatile int A;

     A=RegX
}

Sonuç olarak volatile, derleyiciye kardeşim volatile tanımlı değişkenlerimi kaldırıp atma ben ne diyorsam sen onu yap emri vermeye yarar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#65
Global alanda tanımlı değişkenler

Ramın Global alanında tanımlı değişkenler RAMda sürekli olarak yer kaplarlar.

Global bir değişken tanımlamak için değişkenin fonksiyon dışında tanımlanması yeterlidir.

Örnegin int A değişkenini global alanda tanımlayalım.

int A;

void Say()
{
   ......
   ......
}

Bir değişken fonksiyon içinde tanımlanırsa o değişken local değişken olur.

void Say()
{
int A;
   ......
   ......
}

Local değişken fonksiyon çağrıldığında oluşan, fonksiyon içi işlemler bittiğinde kendisi dolayısı ile içeriği yok edilen değişkendir.

static

Local değişkeni statik değişkene çevirir.Yani fonksiyon içi işlemler bitse de var olmaya devam eden değişkenlerdir.

void Say()
{
static int A;   
......   
......
} 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Bu açıdan Global Tanımlama ile Statik aynı anlama gelebilir mi ?

z

Aynı şey değil.

Global değişkene her fonksiyondan erişilebilir. Fakat static tanımlı değişkene sadece tanımlı olduğu fonksiyondan erişilir.

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

z

Kritik bir soru

int a;

void main()
{
    static int a;

    a=1;
//  Global a değişkeninin içeriğini nasıl öğrenirsiniz?
    ....
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Fonksiyonun dışından Başka bir fonksiyonda sorarım

z

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

M_B

Alıntı yapılan: bunalmis - 25 Ekim 2011, 22:34:32
Başka yolu?
Evet hocam cok guzel bir soru sordunuz?
az once piclede denedim global tanımda a  olarak gozukuyor.
static tanımda ıse main@a gozukuyor.

Bende soruyorum hocam baska cozumu var mı?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

hocam aslında buna pc programlamadan cevap vereceğim ama yanlış olacak korkusu çeken öğrenci gibim hissediyorum kendimi

Form_Mk
   Global A
    
   function zzz
       int A
       ......
       Static A
   end Function
En Form


gibi bir yapıdan bahsediyoruz aslında.
Burada Global A ya
Form_Mk.A
statik değişkene (buda nasıl bir çeviriyse)
Form_Mk.zzz.A olarak erişilir

fatihinanc

Alıntı yapılan: bunalmis - 25 Ekim 2011, 22:25:27
Kritik bir soru

int a;

void main()
{
    static int a;

    a=1;
//  Global a değişkeninin içeriğini nasıl öğrenirsiniz?
    ....
}

Galiba static değişkenin ilk değerlerine bakmak gerekiyor.Yanlış hatırlamıyorsam eğer static olarak tanımladığımız değişkene ilk değer ataması yapmışsak bu data segmentte, yapmamışsak bss segmentte tutuluyor.
Bu örnekte static değişkene ilk değer ataması yapılmadığı için bss segment içerisine erişerek static a değişkenin, data segmente erişerek de global a değişkenin içeriğini öğrenebiliriz diye düşünüyorum.
Ama denemedim, olmayabilir...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

papsukkal

Alıntı yapılan: GreeN - 25 Ekim 2011, 11:57:29
1.Cevap : Soruyu sorarken yaptığın yorumun kısmen yanlış olduğunu görebilirsin.
a=1<<4;
a =00000001 ; //a=1
a =00010000 ; //a=16

a=3<<1;
a=00000011; //a=3
a=00000110;//a=6

edit: Sağa kaydırma
a=3>>1;
a=00000011; //a=3
a=00000001;//a=1

kaydırma işlemini anladım
aslında sorduğum şuydu...

registerin 0. bitinde 1 değeri var ve biz bunu korumak istiyoruz

a=1<<4;  ile değer yüklersek anladığım kadarı ile işler karışır


Alıntı yapılan: GreeN - 25 Ekim 2011, 11:57:29
3.cevap : bunu sayıların binary gösterimi için mi sordunuz anlamadım? Yoksa kaydırma işlemi için mi anlamadım ?

bu sorumun cevabını buldum.

en soldaki bit 1 ise değer " - " dir.