Ynt: rom char* , ROM void* nedir?

Başlatan Gökhan BEKEN, 24 Haziran 2013, 11:10:00

Gökhan BEKEN

Merhaba, bu aralar sık sık karşılaştığım tam olarak ne anlama geldiğini bilmediğim bir deyim var
şu şekilde kullanılıyor:
komut((rom char*)"string ifade");


(rom char*)
kısmı ne anlama geliyor biliyor musunuz?
Örnek olarak:
putrsUART((rom char*)"sadasda");

başka bir örnek:
if(memcmppgm2ram(cFile, (ROM void*)"mpfsupload", 10) == 0)


başka bir örnek:
if(strcmppgm2ram((char *)cUser,(ROM char *)"admin") == 0


başka bir örnek:
ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led3");


ROM ile başlaması sabit bir değer olduğu belirtiyor zannımca, ancak * kısmı pointer mi oluyor, başka bir anlamı mı var?
Bu mevzu hangi konuya giriyor, ne diye aratmam lazım?

mesaj birleştirme:: 24 Haziran 2013, 11:47:40

Type casting diye geçiyormuş bu konu. Türkçe kaynak yok ingilizce araştırmaya devam ediyorum.
Özel mesaj okumuyorum, lütfen göndermeyin.

yldzelektronik

Konuyla ilgili bilgiyi bizlerle de paylaşır mısın?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

CoşkuN

Önce typecasting konusunda baktıktan sonra derleyicinin dökümanlarına bakabilirsin. Microchip'in derleyicisini kullanıyorsun anladığım kadarıyla. Stringleri ram'de tutabilirsin veya program belleğine yazabilirsin. String'ler genellikle sabit olduklarından program belleğine sabit olarak yazılıp oradan okunabiliyorlar. Rom char* ifadesi buna yarıyor. Derleyici bu stringleri program belleğine yazıtyor böylelikle.

Gökhan BEKEN

Aslında herhangi bir sorun yok. Bu deyimler sık sık karşıma çıkıyor. Bende merak ettiğimden araştırıyorum. Olayı tam anladığımda buraya yazarım elbette. Şimdilik tek bildiğim, bu işlemin adı "type casting" imiş.
a=((ROM char *)"string")
yazdığımızda string yazısını char olarak algılıyormuş.
byte yazsak byte olarak kabul edecekti.
Kısaca tip değiştirmek için kullanılıyormuş.

burda biraz örnek buldum:  http://www.cplusplus.com/doc/tutorial/typecasting/

Ha benim nerden karşıma çıktı onu da söyleyeyim.

Mesela bugün seri port uygulaması yapıyordum değişkeni normal dizi olarak tanımlayınca yazdıramıyorum.
char* string="abcde";
yazınca oluyor.

char string[]="abcde";
şeklinde yazınca olmuyordu.

Özel mesaj okumuyorum, lütfen göndermeyin.

jackal183

#4
bu ifadeler mplab c18 de daha çok karşıma çıkıyor, zamanında çok uğraştım ben bunlarla. c18 in bir versiyonunda bu gibi şeyler oluyor başka bir versiyonunda olmuyor. bunlar şu anlama geliyor:

* hepimizin bildiği gibi pointerdır. bir fonksiyona adres göndermek istediğimiz zaman bunu kullanırız. c18 de ise bunu iki türlü yapmışlar. ram pointer ve rom pointer olarak. usarta veri basmak istediğimizi düşünelim. bunun için;

putsUART(rom char *ptr, unsigned char length);

bu fonksiyona ile uarta veri basarken sadece constant stringleri basabilirsiniz ki şu şekilde;
putsUART((rom char*)"DENEME123",9);

veya da
const deneme = "deneme123";
putsUART((rom char*)deneme,9);

bu fonksiyonlar constant veri basmak içindir.

peki değişken basmak istiyorsak ne yapacağız. bunun için ben öncelikle şunu denedim(type casting) olmadı:
unsigned char deneme[9];

.....
...
...
...
putsUART((rom char*)deneme,9);


bu olmayınca da mecburen bunun için ikinci bir fonksiyon yazmak zorunda kaldım.
putsUART(ram char *ptr, unsigned char length)

unsigned char deneme[9];

memset(deneme, 'A',9);

putsUART((ram char*)deneme,9);


böyle yapmışlar mplabın bir versiyonunda type casting kabul etmiyor, başka bir versiyonunda bunlar olmamıştı. yani bir stringin ya da bir ifaden sabit bir değerse rom char* olarak pointer gösterceksin, değişkense ram'a yazılacak birşeyse ram char* olarak pointer gösterceksin. bunun bir dezavantajı var mı? sadece kodunu kirletir biraz ve kullanırken hangisi romdu hangisi ramdi diye hatırlamak zorunda kalırsın. onun için fonksiyona isim verirken, putsUSARTROM ve putsUSARTRAM diye iki fonskiyonun olur. aslında bunun avantajı var bile diyebiliriz, çünkü gömülü sistemlerde işlemci hafızası önemlidir ve bu hafızayı kullanabilmek de önemlidir. bu pointerlar sayesinde işlemcinin hangi hafızasını kullandığın daha belirgin olmuş olur.

mesaj birleştirme:: 24 Haziran 2013, 14:18:59

Alıntı yapılan: meftun - 24 Haziran 2013, 14:09:05
Mesela bugün seri port uygulaması yapıyordum değişkeni normal dizi olarak tanımlayınca yazdıramıyorum.
char* string="abcde";
yazınca oluyor.

char string[]="abcde";
şeklinde yazınca olmuyordu.

meftun aynı anda yazmışısızz, sorunun cevabı benm yazdıklarımda var. normal diziyi gönderebilmen için ram char şeklinde bir tanımlaman olmalı

Gökhan BEKEN

İlgilenenler için çok teşekkür ederim.
@jackal183 ayrıca telekkür ederim hep merak ettiğim şeyleri tek tek yazmışsınız...
Özel mesaj okumuyorum, lütfen göndermeyin.