C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

eowe

gömülü tarafta string fonksiyonları kullanılmaz.Bu fonksiyonlarda memset ve free oldugundan islemci çakılır.Dolayısılya memset ile bellekten dinamik yer alıp free ile sürekli verirseniz gene hardfaulta düsebilirsiniz.Bunun dısında NULL bellek adresine değer yazmak ve arrayin dısına çıkmak da hardfault sebebidir.Memcpy dısında fonksiyon kullanmasını onermem.

kantirici

Addr=strtol(substr,NULL,16);

Yukarıdaki kullanım hatalı. Null değil substr'ın kendisini veya bir başka char pointer vermelisin fonksiyona.

Diyelim ki elinde şöyle bir data var; char * aaa= "123 456 252". Burada sayıları teker teker sıralı olarak int e dönüştürmek için fonksiyon 123'ü dönüştürdükten sonra kaldığı yer için 2. pointerı kullanıyor. Senin durumunda 0x00 a yazmaya çalışıyor ve mcu ve hard faulta düşüyor.

Addr=strtol(substr,substr,16); şeklinde kullanmalısın.

Mucit23

Alıntı yapılan: kantirici - 11 Mart 2018, 16:49:16
Addr=strtol(substr,NULL,16);

Yukarıdaki kullanım hatalı. Null değil substr'ın kendisini veya bir başka char pointer vermelisin fonksiyona.

Diyelim ki elinde şöyle bir data var; char * aaa= "123 456 252". Burada sayıları teker teker sıralı olarak int e dönüştürmek için fonksiyon 123'ü dönüştürdükten sonra kaldığı yer için 2. pointerı kullanıyor. Senin durumunda 0x00 a yazmaya çalışıyor ve mcu ve hard faulta düşüyor.

Addr=strtol(substr,substr,16); şeklinde kullanmalısın.

Normal olarak neden çalışıyor peki? kesme olarak Timer kesmesi kullanılıyor sadece, birde uart rx kesmesi var ama bu fonksiyon çalışıyorken kesme gelmiyor uarttan.

OptimusPrime

Derleyicin iar sa kullanma klavuzunda yazanlara bakildiginda null vermemen gerekiyormus gibi duruyor. @kantirici nin dedigi sekilde yaparsan sorun cozulecek gibi.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

controller

strtol un ikinci paramaetresinin null olmasında bir problem yok. ikinci parametre birden fazla değer içeren bir char array'in sırayla tek tek çevrilmesi için kullanılıyor.


Dolayısıyla çevrilecek sadece 1 değer var ise bu parametre null olabilir. Buraya null koymayıp bir pointer'da koysanız o pointer'da sonunda null olacak zaten.


@eowe


memset yerine malloc demek istedin sanırım. memset bir array'e istenilen ilk değeri vermek için kullanılır, genelde array sıfırlanır.
c++ daki string ile c'deki karakter dizisi (char array) farklı şeylerdir. gömülü tarafta karakter dizisi kullanmanın hiçbir sakıncası yoktur. Başka alternatif de yok zaten.
karakter dizisinin boyutunu baştan verirseniz dinamik hafızaya gerek kalmaz.

Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

mufitsozen

#1085
Alıntı yapılan: controller - 12 Mart 2018, 09:27:01
strtol un ikinci paramaetresinin null olmasında bir problem yok. ikinci parametre birden fazla değer içeren bir char array'in sırayla tek tek çevrilmesi için kullanılıyor.

Dolayısıyla çevrilecek sadece 1 değer var ise bu parametre null olabilir. Buraya null koymayıp bir pointer'da koysanız o pointer'da sonunda null olacak zaten.


@controller  Yanlisiniz var! pointerin NULL olmasi ile pointer degerinin NULL olmasi ayni sey degil. Kullanilan derleyicide NULL nasil implement olduguna bagli olarak buyuk ihtimalle 00000 konumuna bir sonraki dizini yazacaktir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

controller

Doğru pointer null adresi gösterebilir ancak strtol özelinde bu ikisinin farkı yok çünkü endptr null ise zaten pas geçiyor.

Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

eowe

Alıntı yapılan: controller - 12 Mart 2018, 09:27:01
strtol un ikinci paramaetresinin null olmasında bir problem yok. ikinci parametre birden fazla değer içeren bir char array'in sırayla tek tek çevrilmesi için kullanılıyor.


Dolayısıyla çevrilecek sadece 1 değer var ise bu parametre null olabilir. Buraya null koymayıp bir pointer'da koysanız o pointer'da sonunda null olacak zaten.


@eowe


memset yerine malloc demek istedin sanırım. memset bir array'e istenilen ilk değeri vermek için kullanılır, genelde array sıfırlanır.
c++ daki string ile c'deki karakter dizisi (char array) farklı şeylerdir. gömülü tarafta karakter dizisi kullanmanın hiçbir sakıncası yoktur. Başka alternatif de yok zaten.
karakter dizisinin boyutunu baştan verirseniz dinamik hafızaya gerek kalmaz.

memset bir array'e istenilen ilk değeri vermek için kullanılır, genelde array sıfırlanır. Arkadasın ne dedigini anlayan var mı?Memset bellekteki alanı set eder.gömülü tarafta karakter dizisi kullanmanın hiçbir sakıncası yoktur. Bazı fonksiyonlar hardfault sebebidir.Bilip bilmeden konusmayın.Her yoruma cevap atmak mı zorundasınız?karakter dizisinin boyutunu baştan verirseniz dinamik hafızaya gerek kalmaz.Buda zaten konuyla ne kadar alakalı oldugunuzu gosteriyor...

controller

Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

yamak

@eowe
'Memset bellekteki alanı set eder' ile kastettiğiniz nedir?
Bu cümlenin @controller ın söylediği 'memset bir array'e istenilen ilk değeri vermek için kullanılır' dan farkı nedir?

Ayrıca gömülü sistemlerde string fonksiyonları kullanmanın bir sakıncası yoktur.
Dinamik bellek kullanmaktan bahsediyosanız bir nebze haklısınız.RAM i küçük bi mikro da dinamic bellek fonksiyonun kullanmak çok doğru olmaz.
Fakat yine de illa da kullanmak gerekiyosa bazı teknikler ile sorunsuz bir şekilde kullanılabilir.

l0rd

typedef struct
{
  __IO uint32_t KR;  /*!< IWDG Key register,      Address offset: 0x00 */
  __IO uint32_t PR;  /*!< IWDG Prescaler register, Address offset: 0x04 */
  __IO uint32_t RLR;  /*!< IWDG Reload register,    Address offset: 0x08 */
  __IO uint32_t SR;  /*!< IWDG Status register,    Address offset: 0x0C */
} IWDG_TypeDef;

Böyle bir yapıda ilk elemanın adresinin bu yapı türünden tanımlanan değişkenin  adresine eşit olması , diğer elemanların ise bu adresten belirlenen tür kadar(4byte) uzak olması daima garantimidir? Bu yuzden mi offset adreslerine göre dizilim yapılmış?

what you do that defines you

brandice5

Garanti olmasını istiyorsan "packed" keywordunu kullanman lazım. Kullanımı derleyiciden derleyiciye değişebilir, nasıl kullanıldığı derleyicinin manuelinde yazar.

Zoroaster

4 degiskenin her biri integer (32) bit oldugundan her biri 4 byte yer kaplar.

Birincisi relatif 0 da oldugundan digerlerinin adresinin 4,8,12 olmasi cok dogal.

Bu 4 degisken de integer oldugu surece aralarindaki uzaklik her zaman 4 byte dir.
Seytan deliginden kacti.

l0rd

#1093
Alıntı yapılan: l0rd - 14 Mayıs 2018, 21:06:34
typedef struct
{
  __IO uint32_t KR;  /*!< IWDG Key register,      Address offset: 0x00 */
  __IO uint32_t PR;  /*!< IWDG Prescaler register, Address offset: 0x04 */
  __IO uint32_t RLR;  /*!< IWDG Reload register,    Address offset: 0x08 */
  __IO uint32_t SR;  /*!< IWDG Status register,    Address offset: 0x0C */
} IWDG_TypeDef;

Datasheet e bakıp IWDG'nin adresini buldum.




Burada başlangıç adresinin 0x40003000 olduğu yazıyor.O halde ,
IWDG_KR  0x40003000
IWDG_PR  0x40003004
IWDG_RLR 0x40003008
IWDG_SR  0x4000300C

IWDG için sınır : 0x400033FF

O halde 0x40003010 ile 0x400033FF  adresi arasında ne var ? ve Ne olduğunu nereden öğrenebilirim.

2. IWDG_SR ye 0x00000001 yazmak istiyorum.

yukardaki structure tanımlamasını kullanırsam;

IWDG_TypeDef* ptr;
ptr=(IWDG_TypeDef*)0x40003000;
ptr->SR=0x00000001;

structureyi kullanmadan

*0x4000300C =0x00000001;

böyle bir atamalar doğru olabilir mi ?


what you do that defines you

Pyrodigy

int *p; 
p = (int*)  0x400033FF; 

* p = 0x00000001; 
veya
* (int*) 0x400033FF = 0x00000001;
Persistance is the name of the game in this business....