Eclipse İle Cross-Compile ve Ethernet Üzerinden Dosya Transferi

 

Bugünkü yazımızda Eclipse üzerinde ARM tabanlı işlemciler için cross-compile uygulamasını gerçekleştireceğiz. Uygulamada hedef cihaz olarak BeagleBone Rev A3 kullanacağız. Bu uygulama ile birlikte bilgisayarımızda bir IDE yardımıyla ARM tabanlı işlemciler için derleme yapabilecek duruma geleceğiz. Bize bir çok avantaj sağlayacaktır. İlk uygulamalarımızda bir ide kullanmadan manuel olarak cross-compile işlemlerini gerçekleştiriyorduk. Bu sefer bir adım ileri gideceğiz. Ayrıca bu uygulamamızda ethernet yardımı ile beaglebone üzerine dosya transferini gerçekleştireceğiz. Bu işlemlerin aynısı beagleboard serisi içinde geçerlidir.

Cross-compile ile ilgili ilk yazımızda, ne olduğu ve nerelerde kullanıldığı hakkında bilgiler vermiştik. Aynı zamanda ARM tabanlı işlemciler için bir derleyici indirip bu işlemi o derleyici üzerinden terminal yardımıyla gerçekleştirmiştik. (referans) Bu yazımızda ise yine aynı derleyiciyi kullanacağız. Fakat buradaki fark terminal üzerinden değil de eclipse adlı IDE üzerinden kodumuzu derlemek olacaktır. Eclipse bize rahatça kod yazma, syntax hatalarımızı görme gibi avantajlar sağlayacaktır. Host bilgisayar olarak ubuntu 10.04 kullanacağız.

 

Eclipse Üzerinde Proje Oluşturma

Eclipse üzerinde bir C projesi oluşturacağız ve derleyici ayarlarını yapacağız. Eclipse default olarak x86 sistemimiz için olan C derleyicisini görecektir. Yeni derleyici ayarlarımızı bu bölümde sisteme entegre edeceğiz. Öncelikle bir C projesi oluşturuyoruz.

 

Projemizi oluşturduktan sonra kendi derleyicimizin özelliklerini sisteme tanıtmak için sol tarafta projenin adına sağ tıklayıp build configurations bölümünü seçiyoruz ve manage seçeneğini tıklıyoruz. Karşımıza ufak bir pencere açılacaktır. Debug ve rRelease anlarında kullanılacak derleyiciler listelenmiştir. Bu bölümde new seçeneğini seçerek kendi derleyicimizi oluşturuyoruz. İsimlendirdikten sonra set active seçeneğini seçiyoruz. Bu seçenekle birlikte aktif olarak derleme işlemleri isimlendirdiğimiz ayarlara göre olacaktır.

 

Eclipse’in üst kısmında bulunan project seçeneğine tıklıyoruz ve properties seçeneğini seçiyoruz. Bu kısımda ARM derleyicimizin PATH yollarını göstereceğiz. Properties seçeneğine tıkladığımızda sağ taraftaki C/C44 Build seçeneğine tıklıyoruz ve Settings sekmesini seçiyoruz. Burada dikkat edilmesi gereken durum configuration kısmında oluşturduğumuz ayarın olmasına dikkat etmeliyiz. Bu aşamadan sonra sırayla derleyici yollarımızı eclipse üzerinde tanıtıyoruz. İlk uygulamızda kullandığımız derleyici ile bu aşamaları yaptığım için derleyici yükleme kısmını burada anlatmayacağım.

[codesyntax lang=”c”]


/home/tess/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc //C compiler kısmı için
/*include kısmı için (directories olarakta geçebilir) */
/home/tess/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/include
/home/tess/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/include/c++/4.3.3
/home/tess/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc/usr/include
/* */
/home/tess/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc //linker kısmı
/*Kutuphaneler*/
/home/tess/CodeSourcery/Sourcery_G++_Lite/lib
/home/tess/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/lib
/* */
/home/tess/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as//Assembler kısmı

[/codesyntax] 

Daha sonra sağ alt taraftan apply seçeneği ile ayarlarımızı bitiriyoruz. Böylelikle ARM tabanlı bir sistem için arm tabanlı derleyici entegresini yapmış oluyoruz. Bu aşamadan sonra C kodumuzu yazacağız ve derleyeceğiz.

C kodumuzun Derlenmesi

Bu yazımızda C uygulaması olarak beaglebone üzerinde bir led yak-söndür uygulaması gerçekleştireceğiz. Beagle Bone üzerinde 3 adet kullanıcı ledi bulunmaktadır. Bu ledleri kontrol eden bir uygulama yazacağız. Bu uygulamada ayrıca shell komutlarını .c programlama ile nasıl kullanabileceğimizi de öğreneceğiz.

Dosya aç fonksiyonu ile birlikte öncelikle GPIO pinini aktif hale getiriyoruz.

[codesyntax lang=”c”]

void DosyaAc()
{

///Shell üzerinde export dosyasını yazmak için açmamız gerekiyor
if ((fp = fopen(“/sys/class/gpio/export”, “ab”)) == NULL)
{
printf(“Dosya acilamiyor(export)\n”);
exit(1);
}

rewind(fp);//Açtiğımız dosyanın ilk satırına gidiyoruz
strcpy(set_value,”38″);//38. gpio portu GPIO1_6 = 1 * 32 + 6 = 38
fwrite(&set_value, sizeof(char), 2, fp);//dosyaya yaz
fclose(fp);

}

 

[/codesyntax]

Daha sonra Modunu belirtmemiz gerekiyor. Input ya da output olduğunu tanımlıyoruz. Led yak ve söndür kısmında ise yazılacak değerin 0 ya da 1 olmasını belirliyoruz.

[codesyntax lang=”c”]

void Set_Direction()
{
//Binary olarak yazmak için aç
if ((fp = fopen(“/sys/class/gpio/gpio38/direction”, “rb+”)) == NULL)
{
printf(“Dosya acilamiyor(direction)\n”);
exit(1);
}

rewind(fp);
strcpy(set_value,”out”);
fwrite(&set_value, sizeof(char), 3, fp);
fclose(fp);

}
void Led_Yak()
{
rewind(fp);
strcpy(set_value,”1″);
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf(“1\n”);

}
void Led_Sondur()
{

rewind(fp);
strcpy(set_value,”0″);
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf(“0\n”);
}

 

[/codesyntax]

 

[codesyntax lang=”c”]

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

FILE *fp;

char set_value[4];

void DosyaAc()
{

///Shell üzerinde export dosyasını yazmak için açmamız gerekiyor
if ((fp = fopen(“/sys/class/gpio/export”, “ab”)) == NULL)
{
printf(“Dosya acilamiyor(export)\n”);
exit(1);
}

rewind(fp);//Açtiğımız dosyanın ilk satırına gidiyoruz
strcpy(set_value,”38″);//38. gpio portu GPIO1_6 = 1 * 32 + 6 = 38
fwrite(&set_value, sizeof(char), 2, fp);//dosyaya yaz
fclose(fp);

}
void Set_Direction()
{
//Binary olarak yazmak için aç
if ((fp = fopen(“/sys/class/gpio/gpio38/direction”, “rb+”)) == NULL)
{
printf(“Dosya acilamiyor(direction)\n”);
exit(1);
}

rewind(fp);
strcpy(set_value,”out”);
fwrite(&set_value, sizeof(char), 3, fp);
fclose(fp);

}
void Led_Yak()
{
rewind(fp);
strcpy(set_value,”1″);
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf(“1\n”);

}
void Led_Sondur()
{

rewind(fp);
strcpy(set_value,”0″);
fwrite(&set_value, sizeof(char), 1, fp);
fclose(fp);
printf(“0\n”);
}
int main(int argc, char** argv)
{
printf(“Program Basliyor..\n”);

int toggle = 0;

DosyaAc();
Set_Direction();//output olarak tanımla

while(1)
{
strcpy(set_value,”1″);

if ((fp = fopen(“/sys/class/gpio/gpio38/value”, “rb+”)) == NULL)
{
printf(“Dosya acilamiyor(deger)\n”);
exit(1);
}

toggle = !toggle;

if(toggle)
Led_Yak();
else
Led_Sondur();

//2 saniye gecikme
sleep(2);
}
return 0;
}

[/codesyntax]

 

BeagleBone Üzerine Dosya Aktarımı

Dosya aktarımını ethernet haberleşmesi yardımı ile yapacağız. Bu işlemleri cross kablo ile  yapabileceğimiz gibi wireless üzerinden aynı modeme bağlayarak ta yapabiliriz. Tek amaç aynı ağda olmalarını sağlamak. Bu uygulamamızda bilgisayarımız ile beaglebone arasında cross kablo ile bağlantı kuracağız. Öncelikle bilgisayarımıza indirmemiz gereken bir kaç paket mevcut. Terminal üzerinden bu paketleri indirebiliriz.

Bilgisayar tarafı:

[codesyntax lang=”c”]

sudo apt-get install ssh

sudo apt-get install gdbserver

 

[/codesyntax]

Aynı dosyaların beagleBone tarafında da olması gerekiyor. Eğer TI tarafından gönderilen MMC kartı kullanıyorsanız üzerinde yüklü halde geldiği için ihtiyacımız olmayacaktır. Ama yüklemek isteyenler için(beagle bone tarafı);

[codesyntax lang=”c”]

opkg install ssh

opkg install gdbserver

[/codesyntax]

Paketleri kurduktan sonra artık işlemlerimize başlayabiliriz. Öncelikle bilgisayarımızda bir ağ kurmamız gerekiyor. Bunun için  ağ bağlantılarından kablolu ağ bağlantılarına gelerek bir kablolu ağ oluşturuyoruz. Burada ip atamalarını statik yapacağız ki birbirlerini görebilsinler. Ip atamalarında maskeye uygun atama yapmaya dikkat ediniz. Diğer türlü birbirlerini bulamayabilirler.

 

 

Daha sonra bir cross kablo ile beaglebone’u bilgisayarımıza bağlıyoruz ve çalıştırıyoruz. Bilgisayar tarafında bağlantımız hemen gözükmeyecektir. Beaglebone açıldığında bağlantılar seçeneğinden manuel olarak bağlan seçeneğini seçmeliyiz. Bilgisayar tarafımız bağlandıktan sonra RS232 üzerinden beagleBone’u açıyoruz. ve ifconfig kodunu terminale yazıyoruz. Default değerler almış olarak karşımıza çıkacaktır. Fakat maskeleme farklı olduğu için bilgisayarımızı görmeyecektir. Onun için beaglebone kısmında terminale örnek olarak ifconfig eth0 192.168.1.4 yazıyoruz. Böylelikle ip sini kendimiz verdik. Fakat bu tarz yazım kendisini bir dahaki yazıma kaydetmeyecektir. daha sonra tekrar ifconfig konutu ile ipyi aldığını görebiliriz. Ardından bilgisayarımıza ping atarak haberleşip haberleşmediğini test edebiliriz. BeagleBone kısmından bilgisayara ping atmak için ping 192.168.1.5 tam tersi için ping 192.168.1.4 yazmamız gerekiyor.

 

 

Böylelikle haberleşmemizi sağlamış olduk artık işimiz derlediğimiz dosyaları göndermeye kaldı. Eclipse projesinin kayıtlı olduğu yere gidiyoruz. Derlenen dosyayı orada bulabiliriz.

scp komutu ile var olan bir dosyayı aynı ağa bağlı başka bir cihaza göndermemiz mümkün. scp dosyanın_ismi hedef_kullanıcı@hedef_ip:/hedef_yol düzeni ile dosyayı göndermemiz gerekiyor.

Dosyamız gönderildikten sonra beaglebone kısmından kontrol edebiliriz.

Projenin Çalıştırılması

Obje dosyamızı beaglebone üzerine attık. Bu aşamadan sonra ./<objenin ismi> ile programımızı çalıştırabiliriz.

Böylelikle projemizi tamamlamış oluyoruz.

You May Also Like

About the Author: tunayan

1 Comment

  1. Çok teşekkürler verdiğiniz bilgiler için, bende yeni başladım c programlama biliyorum fakat beaglebone için nasıl yazacağımı hangi komut ve fonksiyonları kullnacağımı bilmiyorum, nerden öğrenebilrim hangi komutun ne işe yaradığını? Mesela strcpy ve fwind komutlarını şimdi sizden öğrendim bu gibi komutların ne olduğunu ne işe yaradıklarını nereden öğrenebilirim.
    Teşekkürler

Leave a Reply

Your email address will not be published. Required fields are marked *