Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

ROM Pointer Problemi

Başlatan PhD, 29 Ocak 2008, 16:44:20

PhD

Merhaba arkadaşlar,

Program memorideki büyük bir karakter tablosundan pointer ile ROM'dan RAM'e veri almaya çalışıyorum. Aşagıdaki kodu CCS nin web sitesinden aldım ve çalıştırdım.

/*
A simple example showing the assignment of a pointer to a constant with the address of a constant string:
*/
char rom version[] = "PRODUCT ID V1.01";
char rom *ptr;

ptr = &version[0];


Buraya kadar bir sorun yok ve verileri alabiliyorum. Ama ikinci bir pointer tanımlarsam ve ilk pointerı yeni tanımladığım pointera atamak istersem çalışmıyor. Aşağıdaki gibi;

/*
A simple example showing the assignment of a pointer to a constant with the address of a constant string:
*/
char rom version[] = "PRODUCT ID V1.01";
char rom *ptr,*yeni;

ptr = &version[0];
yeni = ptr; //Burada hata veriyor.


Kısacası bir türlü pointerdan pointera atama yapamıyorum. Tabiki pointerdan pointera derken ilk pointerdaki ROM adresini "yeni" diye tanımladığım pointera atamaya çalışıyorum.

Bilen arkadaşlar bu konuda yardımcı olabilirseniz çok sevinirim.

Şimdiden çok teşekkürler.
...hiç...

arslan74

char rom version[] = "PRODUCT ID V1.01"; 
char rom *ptr,*yeni; 

ptr = &version[0]; 
yeni = ptr; //Burada hata veriyor.


Yerine şöyle dene.

char rom version[] = "PRODUCT ID V1.01"; 
char rom *ptr,*yeni; 

ptr = &version[0]; 
yeni = *ptr; //


Ansi-C stanardtında yazmak istiyorsan o zaman söyle yapman gerek.

char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = *ptr; // şimdi tutuğu adresi kopyalamış olursun.



Selamlar

titanium

Alıntı yapılan: "arslan74"
char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = *ptr; // şimdi tutuğu adresi kopyalamış olursun.


Bu şekilde ptr pointerının gösterdiği veriyi yani version dizisinin ilk elemanının değerini, yeni adlı değişkene atamaya çalışmış olursunuz. Yanılıyormuyum?

arslan74

Alıntı yapılan: "titanium"
Alıntı yapılan: "arslan74"
char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = *ptr; // şimdi tutuğu adresi kopyalamış olursun.


Bu şekilde ptr pointerının gösterdiği veriyi yani version dizisinin ilk elemanının değerini, yeni adlı değişkene atamaya çalışmış olursunuz. Yanılıyormuyum?

Evet aynen sizin dediğiniz gibi. ptr pointerin içinde tuttuğu adresi yeni pointer elemanına atar.

arslan74

Merhaba,

Bir konuyu yanlış atlatmışım kusura bakmayın. Şimdi konuyu düzeltiyorum.

char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = *ptr; // şimdi tutuğu adresi kopyalamış olursun.


Bu kod hatalı, pointere değişken atandığı için derleyicide zaten hata uyarısı veriyor.

Doğru bu şeklide olmalı.

char const version[] = "PRODUCT ID V1.01"; 
char const *ptr,*yeni; 

ptr = &version[0]; 

yeni = ptr; // şimdi tutuğu adresi kopyalamış olursun.


yada

char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = &*ptr; // şimdi tutuğu adresi kopyalamış olursun.


Bu iki şekilde yazılabilir.

Selamlar

PhD

Alıntı yapılan: "arslan74"
char const version[] = "PRODUCT ID V1.01"; 
char const *ptr,*yeni; 

ptr = &version[0]; 

yeni = ptr; // şimdi tutuğu adresi kopyalamış olursun.


yada

char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = &*ptr; // şimdi tutuğu adresi kopyalamış olursun.


Selam @arslan74 arkadaşım,

Malesef dediklerinin hepsini ben daha önce denemiştim, olmamıştı ve acaba bir şey gözden kaçmıştır diye tekrar tekrar denedim yine olmadı. Neredeyse bütün ihtimalleri denedim yani "char const", "const char", "rom char", "char rom" gibi bütün ihtimaller... Ama olmuyor bir türlü "yeni" pointera eski pointerdaki adres değerini almıyor. Bazı denemelerde pointerin içindeki adresi yeni pointera alıyor ama o zaman "yeni" pointer eski pointerın gösterdiği değişkeni değil eski pointerın içindeki adres verisini kendine veri olarak alıyor yani diyelim;

ptr = 0x7A06 //ROM adresi olsun
*ptr = "A" //ROM adresindeki değerde A harfi olsun.

"yeni" pointerina bi şekilde ptr'nin tuttuğu ROM adresini attığımızı farzedelim. Çünkü bazı denemelerde aldığını görüyorum. (DEBUG yapabiliyorum ve register değerlerini görebiliyorum)

yeni = 0x7A06 //ptr içindeki ROM adresi alınsın.
*yeni = 0x06 //*yeni'nin gösterdiği değer ptr'nin içindeki 16 bitlik 0x7A06 değerinin ilk 8 bitini yani 0x06 yı gösteriyor.

Bu denemelerimde çıkardığım sonuç "yeni" pointer içindeki değerin adres değil bir veri olduğunu sanıyor. Bence CCS de ROM pointerla ilgili ciddi bir problem var ve elimdeki versiyonu 4.058 eski versiyonlarını kurdum yine olmuyor.

Sizce başka bir yöntem var mı? Veya HITECH C veya MicroC de de bu şekilde bir problem var mı? Deneme şansı olan arkadaşlar varsa deneyebilirlerse çok sevinirim.

Tekrar teşekkürler.
...hiç...

arslan74

Alıntı yapılan: "comlekciler"
Alıntı yapılan: "arslan74"
char const version[] = "PRODUCT ID V1.01"; 
char const *ptr,*yeni; 

ptr = &version[0]; 

yeni = ptr; // şimdi tutuğu adresi kopyalamış olursun.


yada

char const version[] = "PRODUCT ID V1.01"; 
char *ptr,*yeni; 

ptr = &version[0]; 

yeni = &*ptr; // şimdi tutuğu adresi kopyalamış olursun.


Selam @arslan74 arkadaşım,

Malesef dediklerinin hepsini ben daha önce denemiştim, olmamıştı ve acaba bir şey gözden kaçmıştır diye tekrar tekrar denedim yine olmadı. Neredeyse bütün ihtimalleri denedim yani "char const", "const char", "rom char", "char rom" gibi bütün ihtimaller... Ama olmuyor bir türlü "yeni" pointera eski pointerdaki adres değerini almıyor. Bazı denemelerde pointerin içindeki adresi yeni pointera alıyor ama o zaman "yeni" pointer eski pointerın gösterdiği değişkeni değil eski pointerın içindeki adres verisini kendine veri olarak alıyor yani diyelim;

ptr = 0x7A06 //ROM adresi olsun
*ptr = "A" //ROM adresindeki değerde A harfi olsun.

"yeni" pointerina bi şekilde ptr'nin tuttuğu ROM adresini attığımızı farzedelim. Çünkü bazı denemelerde aldığını görüyorum. (DEBUG yapabiliyorum ve register değerlerini görebiliyorum)

yeni = 0x7A06 //ptr içindeki ROM adresi alınsın.
*yeni = 0x06 //*yeni'nin gösterdiği değer ptr'nin içindeki 16 bitlik 0x7A06 değerinin ilk 8 bitini yani 0x06 yı gösteriyor.

Bu denemelerimde çıkardığım sonuç "yeni" pointer içindeki değerin adres değil bir veri olduğunu sanıyor. Bence CCS de ROM pointerla ilgili ciddi bir problem var ve elimdeki versiyonu 4.058 eski versiyonlarını kurdum yine olmuyor.

Sizce başka bir yöntem var mı? Veya HITECH C veya MicroC de de bu şekilde bir problem var mı? Deneme şansı olan arkadaşlar varsa deneyebilirlerse çok sevinirim.

Tekrar teşekkürler.

Merhaba,

Emin olmak için Hi-Tech derleyicisinde örnek kod yazdım sorunsuz çalıştı.

Selamlar

PhD

Çabalarınız için teşekkürler @arslan74 arkadaşım,

Bir sorun daha farkettim. Ben ROMa veri yazabilmek için "char rom" tanımlamam gerekiyor. Eğer "char const" yazdığım zaman verileri ROMa yazmıyor. "char const" veriler integer olursa yerleştiriyor ama karakteri yerleştirmiyor.

Bu sorun hakkında fikriniz var mı acaba? Tekrar teşekkürler.
...hiç...

arslan74

Alıntı yapılan: "comlekciler"Çabalarınız için teşekkürler @arslan74 arkadaşım,

Bir sorun daha farkettim. Ben ROMa veri yazabilmek için "char rom" tanımlamam gerekiyor. Eğer "char const" yazdığım zaman verileri ROMa yazmıyor. "char const" veriler integer olursa yerleştiriyor ama karakteri yerleştirmiyor.

Bu sorun hakkında fikriniz var mı acaba? Tekrar teşekkürler.

Merhaba size Hi-tech den cevap vermek gerekirse. Bu sölyediğiniz tamam yanlış bilgi. Eğer global bölgede bir cost dizi tanımlarsanız bunu direkt ROM'a yazıyor. Eğer costluğu kaldırırsanız o zaman bu bilgi RAM'da tutulur.

Örneğin global bölgede 50 bytelik bir dizi tanımlıyalım. Eğer bu bilgi Ram yazlımış olursa 50 bytelik fazla RAMi kullanılmış olur. Eğer ROM'a yazarsa o zaman RAM kullanımda bir artma olmaz sadece ROM kullanımı artmış olur.

#include	<pic.h>
#include	"delay.h"

// Sigorta ayarlarının yapıldığı yer
__CONFIG(PROTECT & CPD & INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTEN & BOREN );


const unsigned char ptr[50] = "hasan arslan"; 

							
void main(void){ // Ana program
	
	TRISA = 0b00000001;	// RA0 giriş olarak ayarlandı.
	TRISB = 0b00000000;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	OPTION = 0b00000000;	// PullUp dirençleri devreye sokar. 
	CMCON = 0x07;	// PORTA  analog pinlerini kapatır. Dijital prota dönüştür.

	while (1){ // program döngüsü				
		NOP();		
	}
		
}


Program derledikten sonraki ROM ve RAM kullanımı
Alıntı Yap

Program statistics:

Total ROM used       85 words (4.2%)
Total RAM used        3 bytes (1.3%)

Ama eğer onu cost luktan cıkartırsak, o zaman kod söyle olur.
#include	<pic.h>
#include	"delay.h"

// Sigorta ayarlarının yapıldığı yer
__CONFIG(PROTECT & CPD & INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTEN & BOREN );


unsigned char ptr[50] = "hasan arslan"; 

							
void main(void){ // Ana program
	
	TRISA = 0b00000001;	// RA0 giriş olarak ayarlandı.
	TRISB = 0b00000000;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	OPTION = 0b00000000;	// PullUp dirençleri devreye sokar. 
	CMCON = 0x07;	// PORTA  analog pinlerini kapatır. Dijital prota dönüştür.

	while (1){ // program döngüsü				
		NOP();		
	}
	
	
}


Kapasite kullanımı ise söyle.

Alıntı Yap

Program statistics:

Total ROM used      124 words (6.1%)
Total RAM used       56 bytes (25.0%)

Şeklide görüldüğü gibi eğer global bölgelerdeki const dizileri ROM'a yaziyor. RAM'i kullanmiyor.

Alıntı Yap
"char const" veriler integer olursa yerleştiriyor ama karakteri yerleştirmiyor.

Bu dediğinizi anlamadım. Ama char türü eleman int türü elemanı tutamaz. char dan int e döşümde hiç bie sorun yok ama int den char tür dönüşümde veri kaybı olur.


Selamlar

arslan74

Alıntı yapılan: "comlekciler"Çabalarınız için teşekkürler @arslan74 arkadaşım,

Bir sorun daha farkettim. Ben ROMa veri yazabilmek için "char rom" tanımlamam gerekiyor. Eğer "char const" yazdığım zaman verileri ROMa yazmıyor. "char const" veriler integer olursa yerleştiriyor ama karakteri yerleştirmiyor.

Bu sorun hakkında fikriniz var mı acaba? Tekrar teşekkürler.

Merhaba size Hi-tech den cevap vermek gerekirse. Bu sölyediğiniz tamam yanlış bilgi. Eğer global bölgede bir cost dizi tanımlarsanız bunu direkt ROM'a yazıyor. Eğer costluğu kaldırırsanız o zaman bu bilgi RAM'da tutulur.

Örneğin global bölgede 50 bytelik bir dizi tanımlıyalım. Eğer bu bilgi Ram yazlımış olursa 50 bytelik fazla RAMi kullanılmış olur. Eğer ROM'a yazarsa o zaman RAM kullanımda bir artma olmaz sadece ROM kullanımı artmış olur.

#include	<pic.h>
#include	"delay.h"

// Sigorta ayarlarının yapıldığı yer
__CONFIG(PROTECT & CPD & INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTEN & BOREN );


const unsigned char ptr[50] = "hasan arslan"; 

							
void main(void){ // Ana program
	
	TRISA = 0b00000001;	// RA0 giriş olarak ayarlandı.
	TRISB = 0b00000000;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	OPTION = 0b00000000;	// PullUp dirençleri devreye sokar. 
	CMCON = 0x07;	// PORTA  analog pinlerini kapatır. Dijital prota dönüştür.

	while (1){ // program döngüsü				
		NOP();		
	}
		
}


Program derledikten sonraki ROM ve RAM kullanımı
Alıntı Yap

Program statistics:

Total ROM used       85 words (4.2%)
Total RAM used        3 bytes (1.3%)

Ama eğer onu cost luktan cıkartırsak, o zaman kod söyle olur.
#include	<pic.h>
#include	"delay.h"

// Sigorta ayarlarının yapıldığı yer
__CONFIG(PROTECT & CPD & INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTEN & BOREN );


unsigned char ptr[50] = "hasan arslan"; 

							
void main(void){ // Ana program
	
	TRISA = 0b00000001;	// RA0 giriş olarak ayarlandı.
	TRISB = 0b00000000;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	OPTION = 0b00000000;	// PullUp dirençleri devreye sokar. 
	CMCON = 0x07;	// PORTA  analog pinlerini kapatır. Dijital prota dönüştür.

	while (1){ // program döngüsü				
		NOP();		
	}
	
	
}


Kapasite kullanımı ise söyle.

Alıntı Yap

Program statistics:

Total ROM used      124 words (6.1%)
Total RAM used       56 bytes (25.0%)

Şeklide görüldüğü gibi eğer global bölgelerdeki const dizileri ROM'a yaziyor. RAM'i kullanmiyor.

Alıntı Yap
"char const" veriler integer olursa yerleştiriyor ama karakteri yerleştirmiyor.

Bu dediğinizi anlamadım. Ama char türü eleman int türü elemanı tutamaz. char dan int e döşümde hiç bie sorun yok ama int den char tür dönüşümde veri kaybı olur.


Selamlar

PhD

Sizin dediklerinizi biliyorum @arslan74 arkadaşım,

Sanırım son yazdığım ile ilgili iyi bir açıklama yapamadım. Şu şekilde anlatayım.

Aşağıdaki gibi bir tanımlama yaparsam program memoryde görebiliyorum.

int const deneme[] = {1,2,3,4,5};


Ama karakter olarak bir şey tanımlarsam aşağıdaki gibi;

char const deneme[] = {"DENEME VERILERI"};


Program memoryde görünmüyordu.

Dünkü uzun uğraşlardan sonra son dediğim hatayı giderdim. Böyle bir şey için 4.050 versiyonundan sonra ROM komutu eklenmis. Yani CONST değil ROM olarak tanımlarsanız direk program memoryde görünüyor. (Bende farkında olmadan bu komut ile kullanıyormusum çünkü ilk const yazdığımda çalışmamıştı...)

char rom deneme[] = {"DENEME VERILERI"};


Uzun zaman kaybından sonra CONST'ta da karakter tanımlanınca program memoryde görünmesi için ;

#device CONST=ROM


yazmamız gerekiyormuş. Halbuki yardımında CONST'un default olarak ROM olduğu söyleniyor ama yapmıyor. Neyse sonuç olarak const ile ilgili sıkıntı giderilmiş oldu.

Ancak hala pointerdan pointara adres aktarması yapamıyorum. Daha doğrusu yapıyor ama ikinci pointer bunun ROM da bir adres olduğunu bilemiyor. Sanırım başka yöntemlerle çözmeye çalışacağız.

Tekrar yardımlarınız için teşekkürler @arslan74 arkadaşım. Bir gelişme olursa bilgilendirirseniz sevinirim.

İyi çalışmalar.

Edit:
Bu son bulduğum olaydan sonra sizin verdiğiniz işlemleri tekrar tekrar denedim ki belki CONST olunca çalışıyordur, ROM komutunda çalışmıyordur diye malesef yine aynı sorun oldu. Pointerdan pointera aktarma yapamadım.
...hiç...