İlginç bir sorun.

Başlatan XX_CİHAN_XX, 09 Temmuz 2010, 19:45:08

acemi2010

Alıntı yapılan: fatihinanc - 09 Temmuz 2010, 20:47:41
az önce hi-tech de denedim. 8 byte data memory kullanıyor...
Hocam eminmisiniz? Bendeki hi-tech'de program memory'de konumlandırdı ve data memory'i kullanmadı (PIC için derleme yaptım)

    41  070F  3470               	retlw	112
    42  0710  3488               	retlw	136
    43  0711  3488               	retlw	136
    44  0712  34F8               	retlw	248
    45  0713  3488               	retlw	136
    46  0714  3488               	retlw	136
    47  0715  3488               	retlw	136
    48  0716  3400               	retlw	0


HI-TECH Manuelden alıntıdır !..
Alıntı Yap3.3.9.1 Const and Volatile Type Qualifiers
HI-TECH C supports the use of the ANSI type qualifiers const and volatile.
The const type qualifier is used to tell the compiler that an object is read only and will not
be modified. If any attempt is made to modify an object declared const, the compiler will issue a
warning. User-defined objects declared const are placed in a special psects in the program space.
Obviously, a const object must be initialised when it is declared as it cannot be assigned a value at
any point at runtime. For example:
const int version = 3;

saygılarımla
Timuçin

papylon

@XX_CİHAN_XX, sanırım diziyi tanımlarken yazdığım "PROGMEM" i fark etmediniz.  :)

XX_CİHAN_XX

@papylon kusura bakma onu kaçırmışım :)
@acemi2010
benimde aklım zaten hi tech e gitti neden const koyunca rami kullanıyor diyorum.
Sonradan anlaşıldı mevzu bu olay her derleyici de bir değilmiş...
Aslında C üniversal olması gerekir ama bazı şeyleri yanlış biliyoruz demek ki...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

fatihinanc

Yok ben o kodu PIC C 18 ile derlemiştim ondan öyle göründü. iki derleyici de son sürüm.
az önce 16f için denedim onda normal yani program belleğine gidiyor değişken.ne kadar artarsa artsın program belleği artıyor, ram sabit. ama 18 için durum biraz daha farklı. manualinde de bahsetmiş galiba.

Defining and initializing a non-const array (i.e. not a pointer definition) with a string, for example:
char ca[]= "two"; // "two" different to the above
produces an array in data space which is initialised at startup with the string "two" (copied from
program space), whereas a constant string used in other contexts represents an unnamed constqualified
array, accessed directly in program space.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

parda

Merhaba
Winavr de dizinin program hafızasına yazılıp kullanılmasına dair daha önce yazdığım bir programdan bir kesit veriyorum dikkatlice incelerseniz anahtar kelimeleri görüp ipin ucunu tutabilirsiniz


typedef struct
{
  char Text[19];
  unsigned int Level;
  unsigned char Id;
}stMenuItem;

stMenuItem stMemuI;

const stMenuItem Menus[] PROGMEM  = {
							{"Menu a"     			,1,100}, 
							{"Menu 11"     			,11,101},
							{"Menu 12"     			,11,103},
							{"Menu 121"    			,112,103},
							{"Menu 122"    			,112,103},
							{"Menu 2"     			,1,101},
							{"Menu 3z"     			,1,103},
							{"Menu 4" 			,1,104},
							{"Menu 5"			,1,104},
							{"Menu 6"			,1,104},
							{"Menu 7"			,1,104},
							{"Menu 8"			,1,104}
						   };


static unsigned char cTmp,cTmp1;
static unsigned char cCursor;
static unsigned char cMenuIndex;
static unsigned char cMenuCount=0;
static unsigned char cMc;
static unsigned int nMenuLevel=0;
static unsigned char cLine=0;	
static unsigned char cT,cFound;
static unsigned char cAllMenuCount,cTmp=0;

const char *progmem_s;

/************************************************************************************************/
unsigned char ListMenu(unsigned int nLv)
{
	cMc = 0;
	cAllMenuCount = sizeof(Menus) / 22;
	for(cT = 0; cT < cAllMenuCount; cT++)
	{
		if(pgm_read_word(&Menus[cT].Level) == nLv)	
		{
			cMc++;
		}

	}

	return cMc;
}
Bildiğim tek şey, hiç bir şey bilmediğimdir.

papylon

 @parda, program hafızaya kaydettiğimiz karakter dizisinin herhangi bir Byte'ına pointer kullanarak nasıl ulaşabiliriz.

HI-TECH C'de aşağıdaki gibi bir derleme yaptığımda gayet normal bir durumdu, fakat bu kodu AVR'de, derlediğimde, SRAM üzerinde işlem yaptığı için hatalı değer geri dönüyor.

const unsigned char MyChar[]= PROGMEM {0x10, 0x0C, 0x2A, 0x3B, 0x4D};

const unsigned char *s;
unsigned char a;
unsigned char b=1;

	s= &MyChar[0];	// MyChar[0]'ın adres değerini pointe'a yükle
	a= *(s+b);	/* pointer + b değişkeninin toplamının işaret ettiği strig değerini a değişkenine kopyala "a= 0x0C"	*/


Bunu program hafızada işlem yapacak şekilde nasıl derleyebiliriz?

parda

Bir önceki gönderdiğim koddan bir kesit daha gönderiyorum. Yukarıdaki tanımlamalar gecerli.
progmem_s dikkat et anladığım kadarı ile sorunun cevabı;

#include <avr/pgmspace.h>
eklemeyi unutma

kolay gelsin

/************************************************************************************************/
const char *progmem_s;
.
.
.
void GetMenuItem(unsigned int nLv,unsigned char cNdx,stMenuItem *stMI)
{
	
register char c;	

	cAllMenuCount = sizeof(Menus) / 22;
	cFound = 0;
	cTmp1=0;
	memset(stMI->Text,0,19);
	for(cT = 0; cT < cAllMenuCount; cT++)
	{
		if(pgm_read_word(&Menus[cT].Level) == nLv)	
		{
			cFound++;
			if(cFound == cNdx)
			{
				progmem_s = &Menus[cT].Text[0];
				while ( (c = pgm_read_byte(progmem_s++)) ) 
				{
			        stMI->Text[cTmp1] = c;
					cTmp1++;
    			}
				return;
			}
		}

	}
}
Bildiğim tek şey, hiç bir şey bilmediğimdir.

papylon

@parda, verdiğin kod parçası istediğim şeyin ta kendisi ve sorun halloldu.
Yardımın için çok Teşekkür ederim...