C18'de Büyük Diziler Tanımlamak?

Başlatan Tagli, 03 Ocak 2011, 00:23:43

Tagli

Arkadaşlar, C18 öğrenmeye yeni başladım ve şu an üzerinde çalışmaya başladığım projemde [5][5][4] ebatlarında float dizisine ihtiyacım var. Ancak bu diziyi main dışında oluşturmaya çalıştığımda şu hatayı alıyorum:
Error - section '.udata_CrawlerMain.o' can not fit the section. Section '.udata_CrawlerMain.o' length=0x00000190

Diziyi main içinde oluşturmaya çalıştığımda ise bu hatayı veriyor:
C:\PIC\Crawler\CrawlerMain.c:6:Error [1300] stack frame too large


Bu diziyi hafızaya sığdırmak için ne yapmalıyım?

Ayrıca, diziyi main içinde oluşturmak ile dışında oluşturmak (yani herhangi bir fonksiyon içinde olmaksızın) arasında ne fark vardır?
Gökçe Tağlıoğlu

iyildirim

sorun belleğin 256 byte lık banklardan oluşmasından ve sizin array boyunuzun 400 byte olmasından kaynaklanıyor.
C18 derleyicisinin memory model optimizasyonlarında Data model'i large Stack modeli single yapıp denermisiniz.

Tagli

Malesef bir değişiklik olmadı. Peki ben bu diziyi kendim banklara bölemez miyim?
Gökçe Tağlıoğlu

iyildirim

C18 getting started  isimli dökümanda (\mplab\c18\doc altında)  108 sayfada bununla ilgili bazı örnekler var. Birde aynı döküman da memory model options konusunda bir bakın.
C18 le büyük dizilerle çalışma deneyimim olmadığı için bilgim bundan ibaret.
Kolay gelsin.

muuzoo

Merhaba. C18 de büyük diziler oluşturmak için ben şöyle bir şey denemiştim, belki işinize yarar.Burada bigdata herhangi bir isim olabilir.
#pragma idata bigdata
const char status[10][BUFF_SIZE]={
	{"IP INITIAL\r\n"},
	{"IP START\r\n"},
	{"IP CONFIG\r\n"},
	{"IP IND\r\n"},
	{"IP GPRSACT\r\n"},
	{"IP STATUS\r\n"},
	{"TCP CONNECTING\r\n"},
	{"IP CLOSE\r\n"},
	{"CONNECT OK\r\n"},
	{"PDP DEACT\r\n"}
};
#pragma idata



gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Tagli

Bu arada dikkat ettim de birden fazla dizi bile olsa toplamın 256 byte'ı geçmemesi gerekiyor.

muuzoo, önerin için teşekkürler ancak benim dizim sabit değerlerden oluşmuyor.
Gökçe Tağlıoğlu


muuzoo

#7
Alıntı yapılan: Tagli - 03 Ocak 2011, 07:29:12
Bu arada dikkat ettim de birden fazla dizi bile olsa toplamın 256 byte'ı geçmemesi gerekiyor.

muuzoo, önerin için teşekkürler ancak benim dizim sabit değerlerden oluşmuyor.

O sadece bir örnek içindi. sabit bir değer atamanıza gerek yok. Aslında olay şunla alakalı. 256Byte limitini de aşabilirsiniz, Mesela aşağıdaki örnekte 0x180=384 Byte uzunluğunda bir array tanımlanmış. Ve erişilirken mutlaka pointer ile erişim gerekiyor.


1. The object must be allocated into its own section using the #pragma idata or #pragma udata directive.
#pragma udata buffer_scn
static char buffer[0x180];
#pragma udata

2. Accesses to the object must be done via a pointer.
char * buf_ptr = &buffer[0];
  ...
 // examples of use
 buf_ptr[5] = 10;
 if (buf_ptr[275] > 127)
 ...

gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Tagli

Teşekkürler. Linker dosyasını da değiştirerek float q[8][8][4] dizisini hafızaya oturtmayı başardım. Peki buna nasıl pointer atayabilirim? Denemek için şöyle bir program yazdım:
#pragma udata q_data
float q[8][8][4];
#pragma udata
float * q_ptr;

void main(void){
	int m1, m2, act;
	
	//q_ptr = &q[0][0][0];
		
	for (m1 = 0; m1 < 8; m1++){
		for (m2 = 0; m2 < 8; m2++){
			for (act = 0; act < 4; act++){
				q[m1][m2][act] = 0;
			}
		}
	}			

	q[4][4][0] = 255;
	while(1);
}


Pointer atamasını ancak bu şekilde tutturabildim ancak ilginçtir ki değer atamalarda pointer'ı kullanamıyorum, zaten sanki gerekmiyor gibi çünkü normal q olarak kullanınca da derleniyor ve çalışıyor, veya bana öyle geliyor. Benim ilk aklıma gelen pointer'ı float *** q_ptr = &q[0] olarak tanımlamak oldu ama bu şekilde de kabul etmiyor. Kullanmaya kullanmaya C bilgim de paslanmış, işin içinden çıkamadım. MPLAB SIM'e göre watch penceresinden baktığımda değerler istediğim gibi görünüyor ama birkaç satır kırmızı. Bunun özel bir anlamı var mı?
Gökçe Tağlıoğlu

Tagli

Cevap gelmemiş ama ben son durumu aktarayım: Daha önce de belirttiğim üzere linker script dosyası ile oynayarak oturtma sorununu çözmüştüm. Ancak ilgili dökümanlarda bahsedildiğinin aksine herhangi bir pointer kullanımı vs. yapmam gerekmedi. Diziye doğrudan erişilebiliyor. Fiziksel ortamda da denedim, sonuç başarılı.

Yol gösteren arkadaşlara tekrar teşekkür ederim.
Gökçe Tağlıoğlu