HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME

Başlatan F493, 23 Temmuz 2016, 13:18:23

F493

Selam,
   
    Başlıkta da yazdığım gibi projeyi daha güvenli bir hale getirmek adına bu konuda neler yapılır.  Örneğin STM32F429 da işlemci HARD FAULT'a düştü burada ne yapmak gerekli. Başka EXCEPTION durumlarıda olabilir. Genel olarak ne yapılır.

FreeRTOS gibi işletim sistemleri bu durumları nasıl işliyor acaba?. 

Ayrıca DMA da okuma hatası olduğunda yani bir overrite vs olduğunda DMA (ör ADC) hata işlenmediği için( hata flagleri tespit edilip temizlenmeden) kitlecek.

Bu tip durumlarda tecrübeli arkadaşların fikir, öneri, not, döküman varsa  öğrenmek isterim.


Esen kalın.

yldzelektronik

Özelikle HARDFAULT da, debug ile baktığımda gördüm ki, pc falan hiç olmaması gereken değerler alıyor. Bu da herhangi bir işlem yapılmasını imkansız kılıyor.

HardFault Handler a düştüğünde ilk iş pc ın son değeri alınabilirse ve stack verisi kurtarılabilirse belki oradan çıkılabilir.Tabii bu yorum yalnızca debug dan gördüklerimden çıkardıklarım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

z

Exceptiion durumunda stack'da fault rutinine nereden gelindiği bilgisi bulunmaktadır.

Exceptiona neden olan durumu videodaki anlatıma göre bulup hatayı yok etmek gerekir.

https://youtu.be/kpVMID65ajc



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erhan YILMAZ

Hocam ayrı ayrı asm dosylarını nasıl tek projede kullanıyorsunuz? Amacım kütüphane gibi fonksiyonları yada register adreslerini ilgli .s dosyalarında saklayıp projedeki main.s dosyasından çağırmak.

z

Kodlarını hiyerarşik olarak farklı dosyalara serpiştirdin diyelim. (S uzantılı yazmanda fayda var)

Startup içinde

                INCLUDE DOSYA_ADI.S


şeklinde include edersin.

Olası veri havuzlarına ulaşım hatasına şimdiden engel olmak için de

Include satırını üstüne aşağıdaki iki satırı eklemende fayda var.

                ALIGN
                LTORG


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erhan YILMAZ

Alıntı yapılan: z - 23 Temmuz 2016, 16:56:56
Kodlarını hiyerarşik olarak farklı dosyalara serpiştirdin diyelim. (S uzantılı yazmanda fayda var)

Startup içinde

                INCLUDE DOSYA_ADI.S


şeklinde include edersin.

Olası veri havuzlarına ulaşım hatasına şimdiden engel olmak için de

Include satırını üstüne aşağıdaki iki satırı eklemende fayda var.

                ALIGN
                LTORG




Sağolun hocam oldu ama o iki satırı ekleyince hata verdi. Altına ekleyince oldu. Anlamadım.

z

Ne hatası aldığına bakmak lazım. Neyse o iki satır veri havuzuna uzaklaşma durumlarında yeni havuzlar oluşturur.

Align komutu,  include ettğin satırın üstünde veri havuzu varsa kodların başlangıcı 4 byte"a hizalı olacak şekilde ayarlama yapar.

LTORG ile de havuz oluşturursun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erhan YILMAZ

Alıntı yapılan: z - 23 Temmuz 2016, 17:19:42
Ne hatası aldığına bakmak lazım. Neyse o iki satır veri havuzuna uzaklaşma durumlarında yeni havuzlar oluşturur.

Align komutu,  include ettğin satırın üstünde veri havuzu varsa kodların başlangıcı 4 byte"a hizalı olacak şekilde ayarlama yapar.

LTORG ile de havuz oluşturursun.

Anladım hocam şimdilik işimi gördü dedikleriniz. Diğer konuların üstüne gideyim müsait bir zamanda tekrar sağolun. Bu arada benim işlemci M0.

RaMu

" .S " yani büyük S yazınca C derleyicisini mi kullanıyor?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

S ya da s uzantısı keil tarafından asm dosyası olarak tanınıyor. Open dialog da ASM uzantılı dosyaları görmek istersen doğrudan S uzantılılar geliyor. Farklı bir uzantı olursa gözle araması zorlaşır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#10
Kendi HardFault handle rutinlerini yazabilirsin. Ben tüm projelerde kendi geliştirdiğim rutinler ile bu işi hallediyorum. Ayrıca bu konuda internette çok güzel makaleler var. Failsafe protokoller için olmazsa olmazlardan biri zaten hardfault handling. Birde watchdog mevzusu var.
Örnek;
http://www.keil.com/appnotes/files/apnt209.pdf
http://www.hitex.co.uk/fileadmin/uk-files/pdf/ARM%20Seminar%20Presentations%202013/Feabhas%20Developing%20a%20Generic%20Hard%20Fault%20handler%20for%20ARM.pdf

Sonuç:
In Hard Fault Handler
SCB->HFSR = 0x40000000
Forced Hard Fault
SCB->CFSR = 0x00000400
Bus fault: 
r0  = 0x00000000
r1  = 0xdba30400
r2  = 0x00a30400
r3  = 0x00000004
r12 = 0x00000000
lr  = 0x08018ed1
pc  = 0x08018f22 <-- Hardfault' a sebep olan adres. 
psr = 0x41000000



Ayrıca RTOS kullanan sistemler için StackOverflow, MallocFail v.b. gibi durumlarında kontrol edilmesi gerekiyor.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

F493

Paylaşımlar çok güzel teşekkürler.  Şuan Hard Fault' a sebep olan noktayı buldum. Çözüm üretmeye çalışıyorum. Belki bu sorunu yaşayan olmuştur. STM32F429I M4 de Emwin MemoryALLock ederken HardFault'a düşüyor. Ekrana dokunduğum anda cihaz hardfault a düşüyor bazen başka bir durumda. Nedenini araştırıyorum.  Proje neredeyse bitti 1yılı aşkındır üzerinde çalışıyorum fakat son dakika böyle bir sorun çıktı, yaklaşık 25 sayfa menü oldu, tamamen dokunmatik, 4.3".
Biraz uğraştıracak sanırım.

Dökümanları inceleyeceğim teşekkürler.


RaMu

#12
@z
.s .S sormamın sebebi,
microchip Mplab da eğer asm dosyasını .s olarak kaydedersek direk asm derleyicisini,
.S olarak kaydedersek C derleyicisi üzerinden asm derleyicisini kullanıyor.
Mplab asm derleyicisinde olmayan bazı özellikler, C derleyicisinde var,
bu şekilde bazı sorunlara çözüm bulunabiliyor.

Benzer bir surum durum Keil için de geçerli mi diye merak ettim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

F493

#13
Selam,

Hata  GetDialogItem  fonksiyonu içinde oluyor.  Anladığım kadarıyla bu fonksiyonun içinde GUI_ALLOC_LockH  ile dinamik yer tahsis ediyor.  Burada hata olmasının nedeni ne olabilir acaba. Yer tahsis ederken yeterli alan bulamayınca sapıtıyor olma ihtimali yüksek, ya da daha önceki aldıklarını geri veremeden bu işlem tekrarlanırsa da bu sorun oluşmuş olabilir. Nasıl analiz edebiliriz bu sorunu acaba?



YENİ METİN EKLEME

WM_HWIN WM_GetDialogItem(WM_HWIN hDialog, int Id);

Additional information
This function is always used when creating dialog boxes, since the window Id of a
widget used in a dialog must be converted to its handle before it can be used.

Her kullanımda bir yaratma işlemi var gibi.

Örneğin bu işlemi her 100ms de bir yapmak devamlı tahsisat işlemi yapmak oluyor sanırım.
hItem = WM_GetDialogItem(hWinAna, ID_TEXT_0);
EDIT_SetText(hItem, "Deneme!");

Onun yerine
hItem = WM_GetDialogItem(hWinAna, ID_TEXT_0);  bu işlemi 1 kere yapıp

100ms içinde
sadece  EDIT_SetText(hItem, "Deneme!"); yapmak gerekiyor.

Bu konuda tecrübesi olan arkadaşların yorumunu bekliyorum.


Esen kalın.

Burak B

#14
Sanırım hafıza sorunun var. Ya hafızan sızdırıyor ve tükeniyor yada stack derinliğin ayırdığından daha büyük. calloc, malloc, v.b. fonksiyonlardan dönen değeri her zaman kontrol etmelisin. Eğer NULL veya X<0 gibi bir değer dönüyorsa buna göre önlemini alman gerek yoksa hardfaulta girer.  Yani bu fonksiyonlardan dönen değer her zaman MCU RAM bölgesinde bir değer olmalı ve NULL olmamalı diyebiliriz.

Ayrıca eğer kullandığın bellek bölgesini takip etmiyor ve işin bitince free() ile boşaltmıyorsan yine bir müddet sonra hafızada yer kalmadığı için sürekli NULL dönmeye başlayacaktır. NULL bir pointer dönerse ve bunu kontrol etmiyorsan 0x00000000 adresine veri yazılacak demektir ki buda direkt hardfaulta gider.

Diğer bir durumda stack derinliği konusu firmwarenin callgraph dökümünü çıkarabiliryorsan buradan çöken kısımdaki -worst case stack usage- değerine bak. Eğer ayırdığın stack bu değerden düşük ise eninde sonunda -catastrophic failure- ile karşılaşılacak demektir. Buna göre hadfault handler, failsafe task veya watchdog v.b. ile önlemini al.

Alıntı Yap
Her kullanımda bir yaratma işlemi var gibi.

Örneğin bu işlemi her 100ms de bir yapmak devamlı tahsisat işlemi yapmak oluyor sanırım.
hItem = WM_GetDialogItem(hWinAna, ID_TEXT_0);
EDIT_SetText(hItem, "Deneme!");

Onun yerine
hItem = WM_GetDialogItem(hWinAna, ID_TEXT_0);  bu işlemi 1 kere yapıp

100ms içinde
sadece  EDIT_SetText(hItem, "Deneme!"); yapmak gerekiyor.

Bu konuda tecrübesi olan arkadaşların yorumunu bekliyorum.


Gelelim senin örneğine sürekli olarak hItem için hafıza alanı ayırıyorsun. Buda belleği tüketiyor ve bir müddet sonra kullanacak bellek kalmıyor. Bir MCU ile ve C ile çalıştığın için unmanaged bir ortamdasın buda belleği senin kontrol etmen gerektiği anlamına geliyor. Bu durumda;

if (hItem==NULL) /** hItem static veya global scope olduğunu farzediyorum aksi halde aşağıda açıklamasını yaptım. */
{
   hItem = WM_GetDialogItem(hWinAna, ID_TEXT_0);
}
if (hItem!=NULL)
{
   EDIT_SetText(hItem, "Deneme!");
}


diye bir tanımlama yapacak olursan önlemini almış olursun ve sürekli hafıza tahsis etmediğin içinde hafızan sızdırmaz ve tükenmez. Eğer hItem static veya global bir değişken değilse. O zaman ilgili fonksiyondan ayrılırken free(), ReleaseObject(), v.b. ilgili hangi fonksiyon ile serbest bırakılıyorsa hItem serbest bırakılmalı.



"... a healthy dose of paranoia leads to better systems." Jack Ganssle