Keil ve ARM de struct tanımlaması (önemli ipucu)

Başlatan mp3dragon, 27 Ekim 2006, 11:13:21

mp3dragon

Aylardır bir konu üzerinde uğraşıp duruyorum. Zannedersem çözümü buldum. Sorun şu idi,

Diğer C derleyicilerinde (8 bit - pic, 8051 vs) tanımladığım struct ve union larda sorunsuz bellek erişimi sağlarken, aynı tanımlamalarda ARM ramda farklı bölgelere erişmeye çalışıyordu. Bir türlü işin içinden çıkamadım.

Bugün arama yaparken şunu buldum,

#pragma pack(1)     /* byte alignment */

struct s1  {
  int  i1;     // i1 has offset 0
  char c1;     // c1 has offset 4
  int  i2;     // i2 has offset 5
  char c2;     // c2 has offset 9
  int  i3;     // i3 has offset 10
  char z1;     // z1 has offset 14
};

#pragma pack()    /* reset to default alignment */

struct s2  {
  int  i1;     // i1 has offset 0
  char c1;     // c1 has offset 4
  int  i2;     // i2 has offset 8
  char c2;     // c2 has offset 12
  int  i3;     // i3 has offset 16
  char z1;     // z1 has offset 20
};


8 bit ile 16/32 bit mimarisi arasında ne fark var diyenlere duyurulur. ARM (Keil - CARM için) ramda ofset default olarak 4 bayt olarak gruplanıyor. Yani eğer bayt-bayt gruplamak isterseniz önce  #pragma pack(1) direktifini yazmanız gerekiyor. Daha sonra  #pragma pack() ile default değere isterseniz geri dönebilirsiniz.

haftalardır bunun için tırmalıyormuşum ARM üzerinde çalışan arkadaşlara duyurulur.

Not: daha devre üzerinde denemedim ama sorun büyük ihtimal ile ondan kaynaklanıyor.
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

yasinbirol

Bunun için zamanında bende tırmalamıştım arm için bir projede ugrasırken  :) buna hizalama(aligned) deniyor derleyici direktifiyle düzeltiliyor.Bildigim kadarıyla yanlışsam düzeltin işlemcinin ram e daha hızlı ulassındiye yapiliyor. Yani işlemci mimarisine göre oluyor işlemci 8 bit ise byte aligned 16 bit ise word aligned 32 bit ise dword aligned oluyor.
Yaşasin Cortex-M3 :D