unsigned const char buffer_A[8][1] = {{0b01110000},
{0b10001000},
{0b10001000},
{0b11111000},
{0b10001000},
{0b10001000},
{0b10001000},
{0b00000000}};
Böyle bir const tipli dizi program belleği kullanması gerekirken
hem program hemde ram belleği kullanıyor.
Acaba programım bu şekilde çok fazla const data içerdiği için derleyici belli bir limitten sonra dizilerin bir kısmını ram belleğe mi taşıyor anlayamadım ???
Programımda ki bu şekilde const olarak tanımlanmış dizileri iptal ettikçe derleme sonucunda hem program hemde data belleğimin kullanım alanı azalıyor. Ekledikçe de artıyor. Normal şartlarda sadece program bellekte değişim görmemiz gerekmez mi ???
Kodu ATmega16 için yazıyorum. WinAVR de...
WinAVR'da const sabiti ile tanımladığın değişkenler program belleğinde saklanacak anlamına gelmiyor diye biliyorum.
WinAVR yi bilmiyorum ama C de kesinlikle bu anlama geliyor.
Eğer gerçekten dediğin gibiyse ki öyle gözüküyor buna gerçekten çok şaşırırım.
Peki ozaman şöyle sorayım WinAVR de C deki gibi program belleğe const dizi nasıl yerleştirebilirim? ???
Garip, gerçekten garip...
WinAVR'da program belleğine kaydedilmek üzere değişken tanımlamak için
prog_char
prog_int16_t
prog_uint8_t
prog_uint16_t
gibi başına "prog_" ön eki gelen tanımlamalar kullanılıyor. Bu tanımlamalara bir bak istersen.
Zaten const terimi tanımlanan değişkenin sabit olduğunu belirtiyor. İlla program belleğine yazılacak diye bir şart yok C'de. Ama dediğin gibi derleyicilerin çoğunda const ile tanımlanan değişkenler program belleğine yerleştiriliyor. Ama WinAVR hariç.
az önce hi-tech de denedim. 8 byte data memory kullanıyor...
Dediğim gibi çoğu PIC derleyiciler için bu böyle ama WinAVR'da değil.
Selam,
const rom ... gibi bir kullanım yokmu?. Derleyicinin user manual'ine bakın vardır belki!. O zaman kesin program memory'ye yazılır.
Esen kalın.
Alıntı yapılan: F493 - 09 Temmuz 2010, 20:50:12
Selam,
const rom ... gibi bir kullanım yokmu?. Derleyicinin user manual'ine bakın vardır belki!. O zaman kesin program memory'ye yazılır.
Esen kalın.
WinAVR'da yok diye biliyorum. prog_int16_t gibi tanımlaman gerekiyor.
peki avrstudio da nasıl bir yazım yapmalıyız.
prog_int16_t ss[2] = {1,2};
örneğin gibi bir deneme yaptım hata verdi
Alıntı yapılan: XX_CİHAN_XX - 09 Temmuz 2010, 20:53:00
peki avrstudio da nasıl bir yazım yapmalıyız.
prog_int16_t ss[2] = {1,2};
örneğin gibi bir deneme yaptım hata verdi
Programa pgmspace.h dosyasını eklemen gerekiyor.
#include <avr/pgmspace.h>
Evet birşey daha öğrenmiş olduk, teşekkürler.
AVR - lib C
pdf inde yazdığına göre unsigned char için tanımlama şöyle olacakmış
prog_uchar
Bende bilmiyorum sayılır WinAVR'ı. Ama bu olay aklımda kalmış.
Bende henüz AVR'nin çok çok acemisiyim. Bu ve bunun gibi durumları kavramaya çalışıyorum henüz.
Sabit diziyi program hafızaya aşağıdaki gibi de kaydetmen mümkün, yani hangisini daha çok benimsediysen o haliyle kullanabilirsin.
const unsigned char buffer_A[8][1] = PROGMEM {
{0b01110000},
{0b10001000},
{0b10001000},
{0b11111000},
{0b10001000},
{0b10001000},
{0b10001000},
{0b00000000}
};
@papylon
const unsigned char
unsigned const char
unsigned char const
bunların hepsi aynı şeyler ve winavr derleyicisinde ram belleği işgal ediyorlar :)
@radres arkadaşımızın dediği gibi (avr lib-c manuel de de belirtmiş) başına prog_ ifadesini
koyduğumuz da ise program belleğe yerleştiriliyor...
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
@XX_CİHAN_XX, sanırım diziyi tanımlarken yazdığım "PROGMEM" i fark etmediniz. :)
@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...
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.
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;
}
@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?
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;
}
}
}
}
@parda, verdiğin kod parçası istediğim şeyin ta kendisi ve sorun halloldu.
Yardımın için çok Teşekkür ederim...