Fonksiyona string gönderme

Başlatan strom, 14 Kasım 2010, 01:07:25

strom

Öncelikle herkese kolay gelsin.
Yeni yeni ARM için program yazmaya başladım.Bazı e-book'lar inceliyorum ama henüz yolun başında olduğum için bazı şeyler tam manasıyla oturmuyor.Bunlardan bir tanesinde geçen program yazarken başıma gelen bi problem.Sorun şu; Varsıyorum printf diye bir fonskiyon var ve programımızın herhangi bir yerinde;
printf("Deneme");
şeklinde çağrılıyor.Printf fonksiyonunu PIC için yazıyor olsak
C18 için;
void printf(rom unsigned char *lp);
HI-TECH
void printf(const unsigned char *lp);
şeklinde tanımlarız.Bunun sebebide "Deneme" katarı program hafızasında yer alıyor ve program hafızasındaki bir veriyi okumakla ramdeki veriyi okumak, hafızaların ayrı olması sebebiyle çok farklı.Birisi INDF gibi göstericilerle diğeri TBLREAD gibi göstericilerle okunur.
Gelelim asıl soruna.Benim takıldığım nokta Keil'de bu işlemi nasıl yapıyoruz?Daha doğrusu ARM mimarisinde bu işlemler nasıl yürüyor?Şimdiye kadar okuduğum bilgilerimle şunu edindim;
-Program hafızası olsun Ram hafızası olsun hepsi ayrı olsada doğrusal bir yapıya sahip.Yani işlemci bu belleği tek bellek olarak geörüyor.
-İşlemci için program hafızası, ram hafızası farketmez.Hepsinden temel taşıma komutlarıyla veri alır (mesela LDR)
Ancak program yazarken ("Deneme") katarı const olarak tanımlamız gerekiyor.En azından Keil bunu söylüyor (eğer "Deneme" gibi bir stringi unsigned char *lp gibi bir değişkene atarsak, tür dönüşümünden kaynaklı hata veriyor).Ancak fonksiyonu çağırırken tür dönüşümünü yaparsak hatasız bir şekilde derliyor.Ancak her iki durumda da stringin içeriğini değiştiremiyorum.Bu anlattığımı örnekle açıklamaya çalışayım.
void Printf(unsigned char *Send){
   int i = 0;

   Send[1] = '1';

   while(Send != 0){
      U1THR = Send;
      i++;
   }
}
Printf((unsigned char *) "Deneme");

bu şekilde yazdığımda hatasız derleme yapıyor ama D1neme göstermesi gerekirken Send[1] = '1'; satırı işlemiyor ve "Deneme" gösterliyor terminal ekranında.

void Printf(const unsigned char *Send){
   int i = 0;

   Send[1] = '1';

   while(Send != 0){
      U1THR = Send;
      i++;
   }
}
Printf("Deneme");
Bu şekilde yaptığımda ise ztn derleyici "const'un içeriği değişemez" diyor ve hata veriyor.

Peki benim
-Program hafızası olsun Ram hafızası olsun hepsi ayrı olsada doğrusal bir yapıya sahip.Yani işlemci bu belleği tek bellek olarak geörüyor.
-İşlemci için program hafızası, ram hafızası farketmez.Hepsinden temel taşıma komutlarıyla veri alır (mesela LDR)
bu çıkarımlarım doğruysa neden Send[1] = '1'; satırı geçersiz oluyor?

Bütün bu anlattıklarımda yanlış olan nedir?Nereyi anlamamışım?Kafam karışık olduğu için tam olarak ne soracağımı bile bilemedim.Kusura bakmayın.Umarım anlaşılabilirim.

justice_for_all

*Send[1] = '1' boyle yaparak denermisiniz bide...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

strom

Olmadı malesef hocam ya.
main.cpp(73): error:  #75: operand of "*" must be a pointer
bu hatayı veriyor.Zaten sorun göstericide değil sanırım.Yani deyim doğru.

iyildirim

Const tanımlı bir değişken olmaz deklarasyonda ifade ettiğimiz gibi bu bir sabittir ve içeriği değişmez.
Keil kullanmıyoruım ama send string inin indisini döngü içerisinde gönderilecek karakterde kullanmadan terminal ekranında mesajın görünmesi de bana garip geldi. Keil kaynaklı sanırım .
Hoşçakalın


justice_for_all

void Printf(unsigned char *Send){
   int i = 0;

   while(*Send)
   {
       *Send='1';
          Send++;
    }

   while(Send != 0){
      U1THR = Send;
      i++;
   }
}



bide boyle denermisiniz bi degisiklik olacakmi...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

arslan74

Alıntı yapılan: strom - 14 Kasım 2010, 01:07:25
Öncelikle herkese kolay gelsin.
Yeni yeni ARM için program yazmaya başladım.Bazı e-book'lar inceliyorum ama henüz yolun başında olduğum için bazı şeyler tam manasıyla oturmuyor.Bunlardan bir tanesinde geçen program yazarken başıma gelen bi problem.Sorun şu; Varsıyorum printf diye bir fonskiyon var ve programımızın herhangi bir yerinde;
printf("Deneme");
şeklinde çağrılıyor.Printf fonksiyonunu PIC için yazıyor olsak
C18 için;
void printf(rom unsigned char *lp);
HI-TECH
void printf(const unsigned char *lp);
şeklinde tanımlarız.Bunun sebebide "Deneme" katarı program hafızasında yer alıyor ve program hafızasındaki bir veriyi okumakla ramdeki veriyi okumak, hafızaların ayrı olması sebebiyle çok farklı.Birisi INDF gibi göstericilerle diğeri TBLREAD gibi göstericilerle okunur.
Gelelim asıl soruna.Benim takıldığım nokta Keil'de bu işlemi nasıl yapıyoruz?Daha doğrusu ARM mimarisinde bu işlemler nasıl yürüyor?Şimdiye kadar okuduğum bilgilerimle şunu edindim;
-Program hafızası olsun Ram hafızası olsun hepsi ayrı olsada doğrusal bir yapıya sahip.Yani işlemci bu belleği tek bellek olarak geörüyor.
-İşlemci için program hafızası, ram hafızası farketmez.Hepsinden temel taşıma komutlarıyla veri alır (mesela LDR)
Ancak program yazarken ("Deneme") katarı const olarak tanımlamız gerekiyor.En azından Keil bunu söylüyor (eğer "Deneme" gibi bir stringi unsigned char *lp gibi bir değişkene atarsak, tür dönüşümünden kaynaklı hata veriyor).Ancak fonksiyonu çağırırken tür dönüşümünü yaparsak hatasız bir şekilde derliyor.Ancak her iki durumda da stringin içeriğini değiştiremiyorum.Bu anlattığımı örnekle açıklamaya çalışayım.
void Printf(unsigned char *Send){
   int i = 0;

   Send[1] = '1';

   while(Send != 0){
      U1THR = Send;
      i++;
   }
}
Printf((unsigned char *) "Deneme");

bu şekilde yazdığımda hatasız derleme yapıyor ama D1neme göstermesi gerekirken Send[1] = '1'; satırı işlemiyor ve "Deneme" gösterliyor terminal ekranında.

void Printf(const unsigned char *Send){
   int i = 0;

   Send[1] = '1';

   while(Send != 0){
      U1THR = Send;
      i++;
   }
}
Printf("Deneme");
Bu şekilde yaptığımda ise ztn derleyici "const'un içeriği değişemez" diyor ve hata veriyor.

Peki benim
-Program hafızası olsun Ram hafızası olsun hepsi ayrı olsada doğrusal bir yapıya sahip.Yani işlemci bu belleği tek bellek olarak geörüyor.
-İşlemci için program hafızası, ram hafızası farketmez.Hepsinden temel taşıma komutlarıyla veri alır (mesela LDR)
bu çıkarımlarım doğruysa neden Send[1] = '1'; satırı geçersiz oluyor?

Bütün bu anlattıklarımda yanlış olan nedir?Nereyi anlamamışım?Kafam karışık olduğu için tam olarak ne soracağımı bile bilemedim.Kusura bakmayın.Umarım anlaşılabilirim.

Merhaba,
printf fonksiyonun temel amacı ekrana veya belirtilen başka bir terminale iletmek için kullanılır. Dolaysıyla fonksiyona gönderdiğim içeriğin değişmesi mantık acısından doğru değil. Zaten içeriği değişmemesi geretiğini const parametresiyle belirtiyor. Eğer değişebilme ihtimalı olsaydı const parametresi olmaması gerekirdi. Onun yerine printf fonskiyonun string değişeni göndermeden önce stringi değiştirdiğinizde bu sorun kalkar. Ama eğer bilgi RAM değişkenin de ise olur. Flasha doğrudan tek bir byte yazılmaz. Onun yerine belirli bir blok yazılır.

Selamlar

iyildirim

Her iki prosedürde  de keil değil ama C30 da sağlıklı çalışıyor.. Örnek olması açısından umarım işinize yarar.


void send_String2(unsigned char *sTmp)
{

   while ((*sTmp) != 0)
   {
      if (txBufferNdx2 == 0)
         tx_buf2A[tx_bufCount2] = (*sTmp);
      else
         tx_buf2B[tx_bufCount2] = (*sTmp);
         
      tx_bufCount2++;
      if (tx_bufCount2 == TX_BUFFERSIZE){
         tx_bufCount2 = 0;
      }
      *sTmp++;
   }
   if (tx_InProcess2 == 0)
      putCharToTX2_FIFO();
   
}

void outString(const char* sTmp)
{
   while ((*sTmp) != 0)
   {
      if (txBufferNdx1 == 0)
         tx_buf1A[tx_bufCount1] = (*sTmp);
      else
         tx_buf1B[tx_bufCount1] = (*sTmp);

      tx_bufCount1++;
      if (tx_bufCount1 == TX_BUFFERSIZE){
         tx_bufCount1 = 0;
      }
      *sTmp++;
   }
   
   if (tx_InProcess1 == 0)
      putCharToTX1_FIFO();
   
}


strom

@justice_for_all
bir değişiklik oldu ama bu sefer terminalde hiçbirşey görülmedi :S
@arslan74
Printf'i sadece örnek olması açısından verdim.Sonuçta o fonksiyonu yazanda benim.Sadece meraktan deniyorum.Yanlış, eksik bilgilerimi görmeye çalışıyorum.
Printf dışında ztn değiştirme işlemi yapamam.Öle olması için stringi bir değişkene atayıp, ondan sonra parametre olarak vermem lazım.Buda amaca ters.
Send[] = "Deneme"
printf(Send);
olsaydı ztn gönderilecek veri ram'a yazılmış olurdu.Böyle bi durumda hiçbir problem çıkmazdı.
@iyildirim
C30 da çalışmas ilginç.C18'de böyle bir fark sorun yaratırdı.

justice_for_all

   while(*Send){
      U1THR = *Send;
      i++;
   }

boyle degistirin altkismida isarecinin gosterdigi adresteki degerler alinmasi gerek...

ayrica i degiskeni ne icin kullaniliyo...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

strom

Pardon ya.
   while(Send != 0){
      U1THR = Send [i;
      i++;
   }
olacak.