C de degiskenlerin ezilmesi

Başlatan bunalmis, 21 Ağustos 2011, 12:19:28

z

Kadlarimi bolum bolum yaziyorum her bir bolumu iyice test edip yeni bolumun yazimina basliyorum.
Aylardir sorunsuz calisan bolumler yeni bolumu yazmam ardindan sapitmaya basladi.

Uzun ugraslar sonunda degiskenlerin birbirini ezdigini farkettim.

bmRequestType degiskeni 0x20000102 ye yerlesmis. Bu ve takip eden 7 byte veri C ve asm fonksiyonlarca kullaniliyor.
XInc,YInc,ZInc,WInc degiskenlerinde XInc ise 0x20000107 ye yerlesmis durumda.

Zaten terslik de burada.

XInc in 0x20000107 ye yerlesmis olmasi wIndex ile ayni adresi kullandigi anlamina geliyor. EDIT: MALESEF AYNI ADRESI KULLANMIYORLAR Ikinci yazidaki adres yerlesimine bakin !!!!

Global degiskenlerimin asagida.

char  bmRequestType;
char  bmRequest;
char  wValueL;
char  wValueH;
unsigned short wLength;   
unsigned short wIndex;

char Result_RxBuf[64];
char Result_TxBuf[64];
char RxBuf[64];

unsigned int PaketNo;

unsigned int XPos;
unsigned int YPos;
unsigned int ZPos;

char Flag=0;
char Status=0;
char ConfigValue;

signed char XInc,YInc,ZInc,WInc;

Xinc degiskenine deger atadigimda wIndex degerim eziliyor.

Bu sorun icin ne dusunuyorsunuz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

arslan74

Merhaba,

Karşılaştığın bu sorun, iki farklı C dosyalarında mi tantılmış. Yoksa Biri C dosyası diğeride ASM dosyası mı? Taminimce Birini C de tanıtmışsın birinide ASM de tanıtmış gibisin ve sorun buradan kaynaklanıyor. C ve ASM birbirinlerine tam uyum sağlayamadılar.

Sorunun kısa bir şekilde basid çözümü için önerim. Ayrı bir Global değişkenler dosyası yap bütün global değişkenleri orada tanımla, bu sayede böyle bir sorunla karşılaşmassın.


Kolay gelsin.

z

Sorunu buldum. Degiskenler asagidaki sekilde siralanmis olmasina ragmen derleyici bunlara yanda gorulen adresleri atamis.

Bu yazidaki sorun kulaga kupe olacak turden.

Asagidaki ilk 6 degiskenin pespese olacagi varsayimiyla ilk adresden itibaren 8 adrese sirayla deger atamistim. Sorun da burada. Bu 6 degiskeni programin o parcasini yazarken structure yapmak isime gelmemisti. Bu 6 degisken asm fonksiyonca dolduruluyor C fonksiyonlarca da okunup degerlendiriliyordu. (Asm gozuyle bakinca structure degiskenlerine erisirken normal erisime kiyasla iki ilave asm kod geliyor ve bu kodlarimi sisiriyordu.)

Sorun belli olduguna gore cozumu de var artik.

char  bmRequestType                0x102
char  bmRequest                        0x103
char  wValueL;                           0x104
char  wValueH;                          0x105
unsigned short wLength;          0x10A
unsigned short wIndex;            0x10C

char Result_RxBuf[64];              0x148
char Result_TxBuf[64];              0x1c8
char RxBuf[64];                         

unsigned int PaketNo;               0x138

unsigned int XPos;                    0x13c
unsigned int YPos;                     0x140
unsigned int ZPos;                     0x144

char Flag=0;                               0x100
char Status=0;                          0x101
char ConfigValue;                      0x106

signed char XInc,YInc,ZInc,WInc; 0x107
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#3
@arslan74

Tum degiskenler, tum kodlar C dosyasi icinde.

Goruldugu gibi varsayim uzerine yazdigim kodla Keil'in davranisi farkli cikti.

Structure yapisindan sasmamak lazim. Bu zaten bilinen bir sey de ben gozardi ettim.

Bu C ve ASM karisik yazmanin olusturdugu bir sorun degil. Yukarida acikladigim hatali dusunceyle C ile de yazilsa gene ayni sorun ortaya cikacakti.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

İlginç ve bir o kadar da bulunması zor , tehlikeli bir hata.
Sanki derleme esnasında aynı tip değişkenleri bir araya toplama için yapılmış , ama gereken boşluğu hesaplarken yanlış hesap yapmış.

z

Degiskenler pespese tanimlanmis olsalar bile bu, degiskenlerin pespese adreslere yerlesecegi garantisini vermiyor.

Bunun Arm Cortex islemciler icin ozel nedeni var.

Islemcinin mimarisi gereki, Byte degiskenler herhangi bir adrese, short degiskenler cift degerli adreslere, int degiskenler de 0 ve 4 un kati adreslere yerlesmek zorunda.

Fakat benim ornegimde ilk 8 degisken zaten bu sarti gerceklestiriyor. Gene de Keil sebebini anlamadigim bir nedenden dolayi adres atamasini farkli yapmis.

Keilin degisken yerlestirme stratejisi hakkinda bilginiz varmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

arslan74

Alıntı yapılan: bunalmis - 21 Ağustos 2011, 12:58:00
@arslan74

Tum degiskenler, tum kodlar C dosyasi icinde.

Goruldugu gibi varsayim uzerine yazdigim kodla Keil'in davranisi farkli cikti.

Structure yapisindan sasmamak lazim. Bu zaten bilinen bir sey de ben gozardi ettim.

Merhaba,

Sizin söylediğiniz doğru mu anlamışım diye yaziyorum. Aslında Keil'de değişken tanımlamada bir sorun yok, siz sadece atama yaparken değişken isimleri kullanmak yerine, adresle atama yaptınız ve bu adreslere kendinize göre bir varsayımla verdiniz ve Keil'in varsayımı ile uyuşmadığı için hata verdi. Doğrumu anlamışım?

Eğer öyle ise cok büyük öngörülemez ölümcül sonuclar (Fatal Error) oluşturacak bir hata dır bu. C'de mümkün olduğunca doğrudan adres vermekten kacınmak gerekir. Cünkü bunun sonucu öngörülemez bir hataya sebep verir. Sonucları öngörülmez olduğu için bulunması en zor Buglardan birisidir.

"ANSI C nin kurallarından cıkmaz iseniz Buglar en asgariye iner"

olay gelsin.