arm microcontroller reset sorusu

Başlatan Karamel, 13 Nisan 2015, 11:05:53

yamak

#15
Main metoduna gelmeden önce run time library bss segment i sıfırlar data segmente de initial değerleri yükler.Yani global ve ilk değer atanmamış değişkenler run time library tarafında soft reset de dahi 0 a initialize edilir.İlk değer atanan global değişkenler ise ilk değerine initialize edilir.Eğer soft resette RAM'deki bazı değişkenlerinizin değişmemesini istiyosanız,o değişkeni RAM in kullanılmayan bil bölgesine(bss segment,data segment,stack ve heap in dışında bir yer) bir pointer vasıtasıyla yükleyebilir ya da daha kolayı aşağıdaki gibi bi tanımlama ile bu durumdan kurtulabilirsiniz.
Keil için:
#pragma NOINIT
unsigned char noInitData[20];

IAR için:
__no_init unsigned char noInitData[20];


Bu durumda noInitData adlı dizi runtime library tarafından init edilmez.Yani bu dizi bss segmente atılmaz.

X-Fi

register olarak tanımlamayıp direk adrese yüklediğiniz veri de reset sonrası silinmez.

örnek;
*(uint32_t *)0x2000BFF0= 0xDEADBEEF;


Tabi bu durumda adresi başka bir registerin doldurma ihtimali de var :)

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

JOKERAS

Selam,

Gereksiz diye hor görülen,tü sana denilen goto komutunun tam yeri.
Donanım denetlemeleri,bu komutla hata denetlenebilinir donanımın çalışıp çalışmadığı,
çalışmıyorsa Pc'u hata rutinine zıplatabilir.

Bir clock strech oldu veya data hattı tamda datanın ortasında donanım static eletrik yedi,
bu ölümcül bir hataya sebep olabilir,eğer data düzgün gitmediyse datanın hatalı olduğunu 
denetleyip ya olması gereken duruma hata rutinine veya hatayı doğru alana kadar devam etmesine karar verilebilinir.

Global değişkenler resetten etkilenmiyor halihazırdaki değerlerini muhafaza ediyor,
bu sebeple global değişkenlere ilke değerler ne olması isteniyorsa o değer mutlaka veriliyor.
Global bir değişken...

unsigned int g_val;        // Power on resette rastgele bir değer alıyor.
unsigned int g_val = 0; // Hangi değer ile başlayacaksa o değer verilmeli.


Yerel değişkenler...
unsigned int val; //Her reset veya power on resette 0 ile başlayacağı garanti.
yerel değişkenler sıfırdan başlıyor.

yamak

Alıntı yapılan: JOKERAS - 15 Nisan 2015, 15:00:45
Selam,

Gereksiz diye hor görülen,tü sana denilen goto komutunun tam yeri.
Donanım denetlemeleri,bu komutla hata denetlenebilinir donanımın çalışıp çalışmadığı,
çalışmıyorsa Pc'u hata rutinine zıplatabilir.

Bir clock strech oldu veya data hattı tamda datanın ortasında donanım static eletrik yedi,
bu ölümcül bir hataya sebep olabilir,eğer data düzgün gitmediyse datanın hatalı olduğunu 
denetleyip ya olması gereken duruma hata rutinine veya hatayı doğru alana kadar devam etmesine karar verilebilinir.

Global değişkenler resetten etkilenmiyor halihazırdaki değerlerini muhafaza ediyor,
bu sebeple global değişkenlere ilke değerler ne olması isteniyorsa o değer mutlaka veriliyor.
Global bir değişken...

unsigned int g_val;        // Power on resette rastgele bir değer alıyor.
unsigned int g_val = 0; // Hangi değer ile başlayacaksa o değer verilmeli.


Yerel değişkenler...
unsigned int val; //Her reset veya power on resette 0 ile başlayacağı garanti.
yerel değişkenler sıfırdan başlıyor.
Hocam ilk değer atanmamış global değişkenler her zaman 0 a initialize edilir.İlk değer atanmamış yerel değişkenlerin ise ne olacağı belli olmaz.Tersini söylemişsiniz.

JOKERAS

#19
Yamak usta şöyle değilmi?

initialize kodu derleme aşamasında ilk değerleri yüklemiyormu?
Mesela bir gösterici bir adres bölgesini gösteren bir gösterici olsun.

unsigned int  *g_point; //Nereyi gösteriyor bu?Belirsiz,NULL değil!

Bu Ram'de rastgele değer ne ise o yüklenmiş olmayacakmı?
Bu göstericinin bir adresi göstermesi gerekmiyormu?
Mesela.
unsigned int *g_point = NULL; //ilk değer yüklüyoruz,Null adresi gösteriyor

unsigned int *g_point = (unsigned int) 0x55AA;

bu gösterici her halukarda 0x55AA adresini göstereceği kesin.
Değer yüklemesyedik ne olacağı belli olmayan rastgele bir adres bölgesini göstermiş olmayacakmıydı?

Pgm run time main'den başlamıyormu?
Diyelimki bir Reset geldi,kod main'den başladığına göre
yerel olan değişkenlerin başlangıç değerlerinin bir önemi yokki!
Hepsi 0'dan başlayacağı için istediğimiz değerleri biz vermiyormuyuz,eğer ilk değer istemiyorsak zaten sıfırdan başlıyor.

static yerel değişken ile global değişkenler arasında bir fark yoktur,
static değişkenler yerel tanımlanmışsa çağrıldığında yaratılıp işi bitince çöp olur.
static yerel değişkenlere çağrıldığında ilk değer ne ise onu yüklüyoruz,çünkü rastgele bir değer ile başlamasını istemiyoruz.
Bu aynı şey değilmidir?

Şu ana kadar yerel değişkenlere ilk değer vermeden baktığımda hepsi 0'dan başlıyor,
ama globaller rastgele değer ne ise onunla başlıyor.

Ya siz tersini söylüyorsunuz ya ben:)
Debug edip bakmak lazım.

yamak

#20
Hocam herhangi bir değere initialize edilmemiş global değişkenler linker tarafından bss segmente atılır.Run time library tarafından da bss segmentin tamamı startup ta 0 a initialize edilir.Yerel değişkenler ise stack'te tutulur.Stack'de karalama alanı olarak kullanıldığı için stack'te tutulacak initialize edilmemiş değişkenlerin ilk değerlerinin ne olacağı belli olmaz.Mesela aşağıdaki programı GCC ile derleyip sonucu gözlemleyebilirsiniz.
#include<stdlib.h>
#include<stdio.h>

unsigned char globalVar;

void fonk1(void)
{
    unsigned char localVar;
    printf("Local Variable:%d\n",localVar);
}

int main(){
    printf("Global Variable:%d\n",globalVar);
    fonk1();
}

Ben Qt'de çalıştırdım ve çıktısı aşağıdaki gibi:
Alıntı Yap
Global Variable:0
Local Variable:119
Press <RETURN> to close this window...
Ayrıca Global değişkenlere uygulanan kuralın aynısı static yerel değişkenlere de uygulanır.Bazı derleyiceler yerel değişkenlere ilk değer olarak 0 verebilir.Zaten yerel değişkenler için belli bi kural yok yukarıda söylediğim gibi.Fakat initialize edilmemiş global değişkenler kesinlikle 0 a initialize edilmek zorunda(Linker'a özel bi direktif verilmediği sürece).

JOKERAS

Yamak usta ben öyle biliyorum,yanlış biliyor olabilirim.
Belki sizin dediğiniz gibi tersi aklımda kalmış diyeceğim ama kafamda uyuşmayan şeyler var.
Neyse bir ara fırsat bulduğumda incelerim.
Aslında bu konularda profesör sayılabilecek ustalar bizi bu konuda aydınlatabilir,bilgimizi arttırmış oluruz.
Nerde nerde z,nerde gerbay,Fxdev,OG hepsi arazi,vay arkadaş:)

X-Fi

#22
Konu öyle biryere geldiki senaryolar havada uçuyor hayali koşullar yaratılıp durum değerlendirmesi yapılıyor.

Bu beyin fırtınasını severek takip ediyorum C dilinin bug ını bulmanıza az kaldı :)

Ayrıca:

Alıntı yapılan: JOKERAS - 16 Nisan 2015, 13:09:25
static değişkenler yerel tanımlanmışsa çağrıldığında yaratılıp işi bitince çöp olur.

Bu cümle yanlış. Static değişken yerel tanımlıysa içeriği hiçbirzaman çöp olmaz tanımlandığı yerel fonksiyon tekrar çalıştırılıncaya kadar içerisindeki bilgi korunur.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yamak

Alıntı yapılan: JOKERAS - 16 Nisan 2015, 14:17:50
Yamak usta ben öyle biliyorum,yanlış biliyor olabilirim.
Belki sizin dediğiniz gibi tersi aklımda kalmış diyeceğim ama kafamda uyuşmayan şeyler var.
Neyse bir ara fırsat bulduğumda incelerim.
Aslında bu konularda profesör sayılabilecek ustalar bizi bu konuda aydınlatabilir,bilgimizi arttırmış oluruz.
Nerde nerde z,nerde gerbay,Fxdev,OG hepsi arazi,vay arkadaş:)
Hocam uyuşmayan şeyler nedir?Kafa karıştıracak bişey yok aslında. Çok basit bi program yazıp yukarıda yazdıklarımın doğruluğunu test edebilirsiniz.

mesaj birleştirme:: 16 Nisan 2015, 14:40:20

Alıntı yapılan: X-Fi - 16 Nisan 2015, 14:33:33
Konu öyle biryere geldiki senaryolar havada uçuyor hayali koşullar yaratılıp durum değerlendirmesi yapılıyor.

Bu beyin fırtınasını severek takip ediyorum C dilinin bug ını bulmanıza az kaldı :)
Hocam artık çok az oluyor böyle konular forumda.Görünce kaçırmamaya çalışıyorum :).

X-Fi

Yamak hocam haklısın bu aralar forumda C üstadı bulmak gerçekten zor. Burada olanlarda artık cevap vermiyorlar :)
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

JOKERAS

Yamak usta,
global bir dizimiz olsun.

char  g_dizi[10];

bu dizi elemanlarının alacağı değerler nedir diye sorsam ne dersiniz?
Ben dizi elemanlarının değerlerinin 0 olmasını istiyorum.

Çöpten kasıt içeriği değil,global bir değer olmadığı için anlam ifade etmiyor,ben sadece yerel bölgede ulaştığım bir değerin
içeriğini tutuyor olması,sadece onu çağırdığımda geçerli,işimi gördüm ve işi bitti.
Çağırdığımda içeriğini tabiki koruyacak,korumadığında static olmasının zaten anlamı yokki.
Halbuki global olmuş olsaydı kod'un her adımında içeriğinin bir önemi vardı.



yamak

Alıntı yapılan: JOKERAS - 16 Nisan 2015, 15:15:44
Yamak usta,
global bir dizimiz olsun.

char  g_dizi[10];

bu dizi elemanlarının alacağı değerler nedir diye sorsam ne dersiniz?
Ben dizi elemanlarının değerlerinin 0 olmasını istiyorum.

Çöpten kasıt içeriği değil,global bir değer olmadığı için anlam ifade etmiyor,ben sadece yerel bölgede ulaştığım bir değerin
içeriğini tutuyor olması,sadece onu çağırdığımda geçerli,işimi gördüm ve işi bitti.
Çağırdığımda içeriğini tabiki koruyacak,korumadığında static olmasının zaten anlamı yokki.
Halbuki global olmuş olsaydı kod'un her adımında içeriğinin bir önemi vardı.
Hepsi 0 olur derim.
Ayrıca static yerel değişkenler de .data segmentte tutulur.Yani program sonlanana kadar ram'de kalır.Global değişkenlerden tek farkı sadece tanımlandığı fonksiyon içerisinden erişilebiliyor olmasıdır.

JOKERAS

işte sıfır olmuyor rastgele değerler alıyor,mesele o.
onun için

char g_dizi[10] = {0};

dediğimizde her eleman 0 oluyor.

Ben bunu yeni denemedim,daha önceleri böyle bir problemle karşılaşınca biraz tırmalayıp araştırınca
global'lere ilk değer ne ise onu vermek gerektiği kanısına varmıştım.
Sonra hocama sormuştum o'da aynen ilk değer verilmesi gerektiğini söylemişti.
Bu mplab'da uğraşırken olmuştu,derleyiciye göre değişiyorsa bilmiyorum.








yamak

Hocam şöyle söyliyeyim hangi compiler ile çalışıyosunuz bilmiyorum ama kullandığınız compiler ANSI C uyumlu değil o zaman.
Aşağıdaki yazıyı okuyabilirsiniz isterseniz.Özellikle BSS kısmını.
http://en.wikipedia.org/wiki/Data_segment

JOKERAS

Yamak usta,
mplab Ansi c değilmi?
Ufak tefek farklılıkarla Ansi olduğunu sanıyorum.
İngilizcem yok onun için anlamıyorum,çeviri pgm'ıda Tarzan Ceyn Türk'çesine çeviriyor:)

Şöyle bir durum olamazmı?
Gömülü sistemler ile Ansi c standartları bu tip şeyler için değişiklik yapılmış uydurulmuş olamazmı?
Ne bileyim kafam karıştı iyice.