dizi boyutu çok büyük hatası

Başlatan berkay_91, 15 Kasım 2016, 00:21:40

berkay_91

49152 byte yani 48 kbyte lık data içeren bir dizi oluşturdum dizi elemanlarından TFT ekranda her zamanki gibi resim basıcaktım ama bu sefer derleyince dizi boyutu çok büyük hatası aldım anladığım kadarıyla diziyi bölüp arka arkaya iki farklı dizi çağırmam gerekiyor bunun başka bir çözüm yolu yok mudur?

yamak

Hocam dizi const degilse const yapmayi deneyin

berkay_91

hocam dizi şu şekilde static const PROGMEM unsigned char[128*128*3]={0xfc, 0xfa,...}

JOKERAS

"static const PROGMEM unsigned char[128*128*3]={0xfc, 0xfa,...};"
Bu PROGMEM ne oluyor?

Diziyi bölmek,2 boyutlu dizi yapmak hepsi aynı anlamı ifade ediyor.
Çok boyutlu diziler tek boyutlu diziler gibi belleğe yerleştirilir.

const unsigned char Matrix[100][200];

Dizisinin bellek yerleşimi ile ,
const unsigned char Matrix[300];
dizisinin bellek yerleşimi arasında bir fark yoktur.
İki boyutlu dizi, "Satırın" sonuna "Sutunun" başlangıcını gösteren bir "Çentik" Atar.
Bu sayede Sutunun başlangıç adresi bir çırpıda bilinmiş olur.
8. Satırın, 10. Sutunu gibi.

Birde Derleyicinin Memory model ayarlarına bakın,limit sınırlandırılmış olabilir.

#define MAX 49152U

static const unsigned char[MAX] = {......};

Şu şekilde bir deneyin derim.

bocek

Kullandığınız işlemcinin (AVR ama hangisi?) belleği yetmiyor hocam
(PROGMEM atmel işlemcilerde o dizinin program belleğine yazılacağını belirtiyor).
1 ya da 0. işte 'bit'ün mesele..

JOKERAS

Alıntı yapılan: bocek - 15 Kasım 2016, 12:42:01
Kullandığınız işlemcinin (AVR ama hangisi?) belleği yetmiyor hocam
(PROGMEM atmel işlemcilerde o dizinin program belleğine yazılacağını belirtiyor).
Doğrudur @bocek  , AVR derleyicisini bilmiyorum.
Peki  "const" ne işe yarıyor?

bocek

const o değişkenin aslında bir değişken değil de sabit olduğunu belirtiyor. Yani o değişkene bir atama yaparak değerini değiştiremezsiniz demek. Bellekte nereye yerleştiğiyle ilgili bilgim yok.
Arkadaş kullandığı mcu'nun özelliklerini yazsaydı kahinlik yapmazdık ama muhtemelen arduino kullanıyor. 48 KB'lık bir diziye yetecek atmel mcu Atmega64'ten aşağısı olmamalı. Arduino ise Mega2560 filan olmalı.
1 ya da 0. işte 'bit'ün mesele..

JOKERAS

#7
Tamam işte.İçeriği değiştirilemeyen veri türü Pgm'ye yerleştirilmiş demek olmuyormu?
XC derleyicisin de  bir diziyi const anahtarı ile tanımlamışsak o dizi direkt olarak Pgm memoriye yerleşiyor.
Bu farklı demek. Ne ilginç!

Avar örneği buldum.Tanımlama şeklini böyle yapmışlar,
bu sorun teşkil etmeiş olmasın.

unsigned char mydata[11][10] PROGMEM =
{
    {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09},
    {0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13},
    {0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D},
    {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27},
    {0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31},
    {0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B},
    {0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45},
    {0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F},
    {0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59},
    {0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63},
    {0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D}
};



bocek

PROGMEM'in başa ya da sona yazılması farketmiyor. XC ile atmel'in derleyicilerinin 'const' ı farklı yorumlaması normaldir.
Konuyu uzatmanın manası yok aslında "Dizi boyutu çok büyük" demek, "Dizi boyutu çok büyük" demek. Yerim dar demek.
Ya diziyi küçült ya ek bellek çipi kullan ya da ana mcu'yu (ya da arduino herneyse) yükselt demek.
1 ya da 0. işte 'bit'ün mesele..

berkay_91

#9
elektrikler kesik olduğu için dün cevap veremedim kusura bakmayın, kullandığım işlemci Atmeg1284, 128 kbyte lık flash memorye sahip
derleyici olarak Atmel Studio 6.0 kullanıyorum

bocek

Konuyu araştırınca bu hatanın mcu'nun bellek yetersizliği ile alakası olmadığını öğrendim.
Avr-gcc'de dizi eleman sayısı maksimum 32768 olarak verilebiliyormuş.
Yani en fazla char[32767] olarak tanımlayabiliyormuşuz.
Ama mesela int[32767] bellek olarak 2 katı yer tutmasına rağmen kabul görüyormuş (denemek lazım).
Bu durumda diziyi (berkay_91'in başta söylediği gibi) ikiye bölmekten başka çare yok gibi.

Konuyla ilgili:
http://www.avrfreaks.net/forum/compile-error-size-array-too-large?name=PNphpBB2&file=viewtopic&t=58517
1 ya da 0. işte 'bit'ün mesele..