Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: XX_CİHAN_XX - 09 Temmuz 2010, 19:45:08

Başlık: İlginç bir sorun.
Gönderen: XX_CİHAN_XX - 09 Temmuz 2010, 19:45:08

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...
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 20:39:07
WinAVR'da const sabiti ile tanımladığın değişkenler program belleğinde saklanacak anlamına gelmiyor diye biliyorum.
Başlık: Ynt: İlginç bir sorun.
Gönderen: XX_CİHAN_XX - 09 Temmuz 2010, 20:42:41
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...
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 20:43:15
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.
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 20:44:43
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ç.
Başlık: Ynt: İlginç bir sorun.
Gönderen: fatihinanc - 09 Temmuz 2010, 20:47:41
az önce hi-tech de denedim. 8 byte data memory kullanıyor...
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 20:48:33
Dediğim gibi çoğu PIC derleyiciler için bu böyle ama WinAVR'da değil.
Başlık: Ynt: İlginç bir sorun.
Gönderen: 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.
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 20:51:32
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.
Başlık: Ynt: İlginç bir sorun.
Gönderen: 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
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 20:55:13
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>
Başlık: Ynt: İlginç bir sorun.
Gönderen: XX_CİHAN_XX - 09 Temmuz 2010, 21:00:30
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
Başlık: Ynt: İlginç bir sorun.
Gönderen: radres - 09 Temmuz 2010, 21:01:52
Bende bilmiyorum sayılır WinAVR'ı. Ama bu olay aklımda kalmış.
Başlık: Ynt: İlginç bir sorun.
Gönderen: papylon - 09 Temmuz 2010, 21:40:14
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}
};
Başlık: Ynt: İlginç bir sorun.
Gönderen: XX_CİHAN_XX - 09 Temmuz 2010, 22:02:29
@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...
Başlık: Ynt: İlginç bir sorun.
Gönderen: acemi2010 - 09 Temmuz 2010, 22:13:22
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
Başlık: Ynt: İlginç bir sorun.
Gönderen: papylon - 09 Temmuz 2010, 22:18:34
@XX_CİHAN_XX, sanırım diziyi tanımlarken yazdığım "PROGMEM" i fark etmediniz.  :)
Başlık: Ynt: İlginç bir sorun.
Gönderen: XX_CİHAN_XX - 09 Temmuz 2010, 22:23:02
@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...
Başlık: Ynt: İlginç bir sorun.
Gönderen: fatihinanc - 09 Temmuz 2010, 22:43:58
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.
Başlık: Ynt: İlginç bir sorun.
Gönderen: parda - 10 Temmuz 2010, 10:23:20
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;
}
Başlık: Ynt: İlginç bir sorun.
Gönderen: papylon - 10 Temmuz 2010, 18:17:18
 @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?
Başlık: Ynt: İlginç bir sorun.
Gönderen: parda - 12 Temmuz 2010, 09:52:24
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;
}
}

}
}
Başlık: Ynt: İlginç bir sorun.
Gönderen: papylon - 12 Temmuz 2010, 21:32:38
@parda, verdiğin kod parçası istediğim şeyin ta kendisi ve sorun halloldu.
Yardımın için çok Teşekkür ederim...