lpc1769 da çok boyutlu diziye deger atınca kitleniyor !!!

Başlatan burakoz1989, 31 Ağustos 2012, 13:04:43

burakoz1989

Merhaba arkadaşlar lpc 1769da çok boyutlu bidizi tanımladım  sonra buna değer atadım keil error vermemesine rağmen işlemciye yüklediğim zaman çalışmıyor debugda denedim herşey gayet düzgün çalışıyor fakat  işlemcide çalışmıyor ayrıca aynı kodları devc derleyip çalıştırdığımda istediğim gibi sonucları  aldım.Hatayı bulabilmek için kod da blok şeklinde bazı kodları silip denedim işlemcinin çok boyutlu diziye değer atamaya kalktığımda çalışmadığını gördüm
t[c][b]=s[i];    ,     t[c][b] = '\0';
  bu kodlarda kitleniyo acaba nerde yanlış yapıyorum başka nasıl değer atabilirim  acil yardımlarınızı bekliyorum kaç gündür çözemedim :(
kodlar;
#include <stdlib.h>
#include <stdio.h>
#include <LPC17xx.H>
#include <LPC17xx.H>
#include <string.h>
#include "delay.h"
#include "ks0108.h"



  
 
 void koddzlt(char t[][50], char*s, char k, char l )  
   {
          
      int c=0;
      int i;
      for(i=0;i<50;i++)
       {
          
          if(s[i]==k)
           {
               int b=0 ;     
               while(s[i]!=l)
               {  
                 
                            
               t[c][b]=s[i];
               
               b++;
               i++;
                  
               }
              t[c][b] = '\0';
                                                             // i=strlen(s);
              c++;
           }
       }
   
                     
   }
// 




int main (void)
{
	
char cnc1[]="cnc1% N05 G00 X0.0 Y0.0;N10 F400;N15 G01 Z-10.0;N20 F600;N25 G01 X50.0 Y50.0;N30 G01 Z0.0;N31 G02 Z-10 R25;N35 M30;  %";          //const char
char genel[7][50];
char satirbir[50];

    SystemInit ();
	SysTick_Config(12000000/1000);
	
	LPC_PINCON->PINSEL4=0;   // Pinsel4() GPIO olarak ayarlaniyor
	LPC_GPIO4->FIODIR = 0xFFFFFFFF;  // GPIO 4'lerin hepsi çıkış oluyor
	
    ks0108_init();

	koddzlt(genel,cnc1,'N',';');







    for(;;)
    {


    LPC_GPIO4->FIOSET |= (1<<28);				//port4'ın 	28. bitini high yapıyoruz
	LPC_GPIO4->FIOSET |= (1<<29);					//port4'ın 	29. bitini high yapıyoruz
	DelayMs(250);
	LPC_GPIO4->FIOCLR |= (1<<28);					//port4'ın 	28. bitini low yapıyoruz
	LPC_GPIO4->FIOCLR |= (1<<29);			//port4'ın 	29. bitini low yapıyoruz



		sprintf(satirbir,"satirbir= %4s ",genel[0]);

        DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
        ks0108_fill(0);

        ks0108_text(10,10,satirbir,1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);
        ks0108_fill(0);

        ks0108_rect(10,10,40,40,0,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);
        ks0108_fill(0);

        ks0108_rect(10,10,50,50,1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);
        ks0108_fill(0);

        ks0108_circle(64,32,30,1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);
        ks0108_fill(0);

        ks0108_circle(64,32,30,0,1);

        DelayMs(250);
		
		DelayMs(250);
		DelayMs(250);
        ks0108_fill(0);
    }
}

burakoz1989

Gerbay hocam çok teşekkür ederim büyük bi sıkıntıdan kurtardınız bu ram rom stak konularında bayağı  bi eksiğim onlara çalışsam  çok iyi olacak  sanırım hocam bide bu konularda bildiğiniz türkçe yazılmış kaynak varmı acaba.hocam hazır sizi bulmuşken bir kaç soru daha sormak istiyorum :) keilde neden iki boyutlu bir diziyi
char dizi[][40];
şeklinde tanımyamıyorum böyle tanımladığımda dizi parametreleri birer sabit olması gerikiyor diye uyarı veriyor neden böyle tanımlayamıyoruz acaba.

burakoz1989


burakoz1989

Alıntı yapılan: gerbay - 31 Ağustos 2012, 14:41:14
Estagfurullah, rica ederim..


hocam bu stack olayı yine sıkıntı oluşturdu kodun içine   yeni birkaç fonksiyon daha tanımlamam gerekti yine aynı problem oluştu dediğiniz işlemleri yaptım ama sonuç değişmedi stack olayına nasıl kalıcı bir çözüb bulabilirim çünkü daha kodlarımın dörtte birini anca yazdım yardımlarınız için şimdiden teşekkür ederim

fatih6761

Gerbay hocamın anlattığı gibi stack olayının farklı bir çözümü yok. Static ibaresiyle değişkenleri RAM de saklayacaksınız. Son kodlarınızı yollayabilir misiniz?

yamak

Alıntı yapılan: fatih6761 - 01 Eylül 2012, 18:24:06
Gerbay hocamın anlattığı gibi stack olayının farklı bir çözümü yok. Static ibaresiyle değişkenleri RAM de saklayacaksınız. Son kodlarınızı yollayabilir misiniz?
Ya da global tanımlayarak.

mesaj birleştirme:: 01 Eylül 2012, 18:29:41

Alıntı yapılan: burakoz1989 - 01 Eylül 2012, 18:05:42

hocam bu stack olayı yine sıkıntı oluşturdu kodun içine   yeni birkaç fonksiyon daha tanımlamam gerekti yine aynı problem oluştu dediğiniz işlemleri yaptım ama sonuç değişmedi stack olayına nasıl kalıcı bir çözüb bulabilirim çünkü daha kodlarımın dörtte birini anca yazdım yardımlarınız için şimdiden teşekkür ederim
Startup dosyasından Stack_size ı artırabilirsin. Startup dosyasında ilk satrılarında yer alıyo.

burakoz1989

#6
[quote author=fatih6761 link=topic=42164.msg304687#msg304687 date=1346513046]
Gerbay hocamın anlattığı gibi stack olayının farklı bir çözümü yok. Static ibaresiyle değişkenleri RAM de saklayacaksınız. Son kodlarınızı yollayabilir misiniz?
[/quote]
[code
#include <LPC17xx.h>
#include <LPC17xx.H>
#include <stdio.h>
#include <LPC17xx.H>
#include <LPC17xx.H>
#include <string.h>
#include "delay.h"
#include "ks0108.h"

char const  gkod[1][35][4]={"G00","G01","G02","G03","G04",
                        "G17","G18","G19","G20","G21",
                        "G28","G29","G40","G41","G42",
                        "G50","G51","G54","G70","G71",
                        "G80","G83","G90","G91","G92",
                        "M00","M01","M02","M03","M04",
                        "M05","M06","M08","M09","M30", };



 koddzlt(char t[][50],const char*s, char k, char l )  
   {
          
  static  int c=0;
  static  int i=0;
      for(i=0;i<strlen(s);i++)
       {
          
          if(s[i]==k)
           {
               int b=0 ;     
               while(s[i]!=l)
               {  
                 
                            
               t[c][b]=s[i];
               
               b++;
               i++;
                  
               }
              t[c][b] = '\0';
                                                             // i=strlen(s);
              c++;
           }
       }
   
                     
   }


int uygunkod (char s[])                          //gönderilen fonksiyonun satırında gkod dizisinin elemanı varmı 
  {                                       // yomu diğe arar varsa 1 yoksa o gönderiri
          static   int a=0;                            //kaç tane olup  olmadığına bakmaz
          static   int i;
        for(i=0; i<34; i++)
             {              
                
                if(strstr(s,gkod[0][i])!=0)
                {
                     a=i;     
                          } 
              }
    return a ; 
}





int main (void)
{	
const char cnc1[]="cnc1% N05 G00 X0.0 Y0.0;N10 F400;N15 G01 Z-10.0;N20 F600;N25 G01 X50.0 Y50.0;N30 G01 Z0.0;N31 G42 Z-10 R25;N35 M30;  %";          //const char
	static char genel[7][50]; 
	char*sira;	
	static int var;
												

    SystemInit ();
	SysTick_Config(12000000/1000);
	LPC_PINCON->PINSEL4=0;   // Pinsel4() GPIO olarak ayarlaniyor
	LPC_GPIO4->FIODIR = 0xFFFFFFFF;  // GPIO 4'lerin hepsi çıkış oluyor

    ks0108_init();
    koddzlt(genel,cnc1,'N',';');
	  var=uygunkod(genel[3]);

    for(;;)
    {
	 

    LPC_GPIO4->FIOSET |= (1<<28);				//port4'ın 	28. bitini high yapıyoruz
	LPC_GPIO4->FIOSET |= (1<<29);					//port4'ın 	29. bitini high yapıyoruz
	DelayMs(250);
	LPC_GPIO4->FIOCLR |= (1<<28);					//port4'ın 	28. bitini low yapıyoruz
	LPC_GPIO4->FIOCLR |= (1<<29);			//port4'ın 	29. bitini low yapıyoruz


	




	

        DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
        ks0108_fill(0);
		sprintf(sira,"sıra:%d",var);
        ks0108_text(1,10,genel[1],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,20,genel[2],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,30,genel[3],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,40,genel[4],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,50,genel[5],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,60,genel[6],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);
//      

    }
}
]




hocam kodlar bunlar

mesaj birleştirme:: 01 Eylül 2012, 18:40:00

Alıntı yapılan: yamak - 01 Eylül 2012, 18:27:04
Ya da global tanımlayarak.

mesaj birleştirme:: 01 Eylül 2012, 18:29:41
Startup dosyasından Stack_size ı artırabilirsin. Startup dosyasında ilk satrılarında yer alıyo.
Hocam denedim yazabildiğim en büyük sayıyı yazdım ama yine düzelmede sabaha  kadar uğraştım belki birşeyler gözümden kaçtı


burakoz1989

Alıntı yapılan: yamak - 01 Eylül 2012, 18:42:46
Hata ne peki?
hocam programı atıyorum çalışmıyorum kitlenip kalıyorum reset attıgımda 28.ve 29 binler yanıp sönüyo sonra tık yok

fatih6761

Hatayı yazmış arkadaş, büyük ihtimalle çalışma zamanında ( yani main metodunda nesneler initialize edilirken ) stack fault benzeri bir exception meydana geliyor. stack boyutunu arttırmak geçici bir çözüm olur.
Kodda ki genel değişkenini adı üstünde genel kullanın yani global yapın (main metodunun üstüne yazın). Hata ayıklama modu varsa, adım adım işletip kilitlenme durumdaki (varsa) hata rutinin adını yazın. Yani hatanın tam olarak ne olduğunu anlayalım. Şu an Keil'ın kurulu olmadığı işletim sistemindeyim kodları derleme şansım yok. Derlenmiş dosyayı atabilirseniz basit bir analizle çözebiliriz...

yamak

sira pointer ına malloc kullarak bi adres atamayı dener misin?
örnek
char* sira=malloc(sizeof(char)*7);

mesaj birleştirme:: 01 Eylül 2012, 18:54:11

Alıntı yapılan: fatih6761 - 01 Eylül 2012, 18:51:59
Hatayı yazmış arkadaş, büyük ihtimalle çalışma zamanında ( yani main metodunda nesneler initialize edilirken ) stack fault benzeri bir exception meydana geliyor. stack boyutunu arttırmak geçici bir çözüm olur.
Kodda ki genel değişkenini adı üstünde genel kullanın yani global yapın (main metodunun üstüne yazın). Hata ayıklama modu varsa, adım adım işletip kilitlenme durumdaki (varsa) hata rutinin adını yazın. Yani hatanın tam olarak ne olduğunu anlayalım. Şu an Keil'ın kurulu olmadığı işletim sistemindeyim kodları derleme şansım yok. Derlenmiş dosyayı atabilirseniz basit bir analizle çözebiliriz...
genel değikenini static tanımlamış zaten. Yani genel değişkeni stack de değil flash da saklanır.

fatih6761

Hmm evet dikkateten kaçmış sira pointer'ına adres atanmamış, malloc kullanarak geçerli bir adres verin. İlk halinde 0 değerine sahip olacağından memory exception(veya benzeri ) hatası meydana geliyor.. O kısmı yamak arkadaşımın dediği gibi ilklendirin. Eğer uzunluğu kesin olarak bilmiyorsanız alabileceği maksimum uzunluğu verin

yamak

Alıntı yapılan: fatih6761 - 01 Eylül 2012, 18:55:16
Hmm evet dikkateten kaçmış sira pointer'ına adres atanmamış, malloc kullanarak geçerli bir adres verin. İlk halinde 0 değerine sahip olacağından memory exception(veya benzeri ) hatası meydana geliyor.. O kısmı yamak arkadaşımın dediği gibi ilklendirin. Eğer uzunluğu kesin olarak bilmiyorsanız alabileceği maksimum uzunluğu verin
Yok yerel olarak tanımlandığı için derleyici kafasına göre bir değer verir yani 0 değeri verecek diye bir kaide yok. Uzunluğuda  sizeof(char)*10 belirtmelisin.Çünkü
sprintf(sira,"sıra:%d",var);
satirinda sira adresine 9 byte lık veri yükleniyo sonladırıcı karakter ile birlikte 10 byte yapıyo.

burakoz1989

Alıntı yapılan: fatih6761 - 01 Eylül 2012, 18:51:59
Hatayı yazmış arkadaş, büyük ihtimalle çalışma zamanında ( yani main metodunda nesneler initialize edilirken ) stack fault benzeri bir exception meydana geliyor. stack boyutunu arttırmak geçici bir çözüm olur.
Kodda ki genel değişkenini adı üstünde genel kullanın yani global yapın (main metodunun üstüne yazın). Hata ayıklama modu varsa, adım adım işletip kilitlenme durumdaki (varsa) hata rutinin adını yazın. Yani hatanın tam olarak ne olduğunu anlayalım. Şu an Keil'ın kurulu olmadığı işletim sistemindeyim kodları derleme şansım yok. Derlenmiş dosyayı atabilirseniz basit bir analizle çözebiliriz...
hocam sıkıntımda orada debug yapıyorum bi sıkıntı çıkmıyor bütün değişkenlerim istediğim gibi önceden warning 1122 uyarsını veriyodu şimdi onu kesti değişkenleri değiştirinca şuan ne  olduğunu anladım mainin üzerindede yapmıştım gece çalışmadıydı şimdi kodda var değişkenini kullanmadım çalışmaya başladı
kodların son hali
#include <LPC17xx.h>
#include <LPC17xx.H>
#include <stdio.h>
#include <LPC17xx.H>
#include <LPC17xx.H>
#include <string.h>
#include "delay.h"
#include "ks0108.h"

static const char   gkod[1][35][4]={"G00","G01","G02","G03","G04",
                        "G17","G18","G19","G20","G21",
                        "G28","G29","G40","G41","G42",
                        "G50","G51","G54","G70","G71",
                        "G80","G83","G90","G91","G92",
                        "M00","M01","M02","M03","M04",
                        "M05","M06","M08","M09","M30", };



 koddzlt(char t[][50],const char*s, char k, char l )  
   {
          
  static  int c=0;
  static  int i=0;
      for(i=0;i<strlen(s);i++)
       {
          
          if(s[i]==k)
           {
               int b=0 ;     
               while(s[i]!=l)
               {  
                 
                            
               t[c][b]=s[i];
               
               b++;
               i++;
                  
               }
              t[c][b] = '\0';
                                                             // i=strlen(s);
              c++;
           }
       }
   
                     
   }


int uygunkod (char s[])                          //gönderilen fonksiyonun satırında gkod dizisinin elemanı varmı 
  {                                       // yomu diğe arar varsa 1 yoksa o gönderiri
          static   int a=0;                            //kaç tane olup  olmadığına bakmaz
          static   int i;
        for(i=0; i<34; i++)
             {              
                
                if(strstr(s,gkod[0][i])!=0)
                {
                     a=i;     
                          } 
              }
    return a ; 
}



 static const char cnc1[]="cnc1% N05 G00 X0.0 Y0.0;N10 F400;N15 G01 Z-10.0;N20 F600;N25 G01 X50.0 Y50.0;N30 G01 Z0.0;N31 G42 Z-10 R25;N35 M30;  %";          //const char
	static char genel[7][50]; 
	char*sira;	
	static int var;

int main (void)
{	

												

    SystemInit ();
	SysTick_Config(12000000/1000);
	LPC_PINCON->PINSEL4=0;   // Pinsel4() GPIO olarak ayarlaniyor
	LPC_GPIO4->FIODIR = 0xFFFFFFFF;  // GPIO 4'lerin hepsi çıkış oluyor

    ks0108_init();
    koddzlt(genel,cnc1,'N',';');
	  var=uygunkod(genel[3]);

    for(;;)
    {
	 

    LPC_GPIO4->FIOSET |= (1<<28);				//port4'ın 	28. bitini high yapıyoruz
	LPC_GPIO4->FIOSET |= (1<<29);					//port4'ın 	29. bitini high yapıyoruz
	DelayMs(250);
	LPC_GPIO4->FIOCLR |= (1<<28);					//port4'ın 	28. bitini low yapıyoruz
	LPC_GPIO4->FIOCLR |= (1<<29);			//port4'ın 	29. bitini low yapıyoruz


	




	

        DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
        ks0108_fill(0);
	//	sprintf(sira,"sıra:%d",var);    problem var değişkenini kullanmak istediğimde oluşuyo sanırım
     //   ks0108_text(1,10,sira,1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,20,genel[2],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,30,genel[3],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,40,genel[4],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,50,genel[5],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);

		        ks0108_text(1,60,genel[6],1,1);

        DelayMs(250);
		DelayMs(250);
		DelayMs(250);
//      

    }
}



yamak

Hatan muhetemele söyledğim nedenden kaynaklanıyo.char* sira  yi yerel tanimladiğinda belleğin güvenliği olmayan bir bölgesinden bi adres tahsis etmiş oluyosun ve bu adrese bir değer yüklemeye çalıştığın hata oluşuyo.Ve bu tip hatalar çalışma zamanında ortaya çıkar. Şimdi global tanımlamışsın tamam güvenli bi yerden 1 byte yer tahsis ediyosun ama sen bu adrese 1 byte tan fazla veri yüklüyosun bu yüzde global de tanımlasan yerel de tanımlasan malloc ile güvenli bir şekil yer tahsis etmelisin. Hatanın ortadan kalkmasının asıl nedeni o bence var değişkenini kullanmaman değil sira değişkenin gösterdiği adrese hiç bir veri yüklememendir.