Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: F493 - 23 Temmuz 2016, 13:18:23

Başlık: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: F493 - 23 Temmuz 2016, 13:18:23
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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: yldzelektronik - 23 Temmuz 2016, 15:23:13
Ö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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: z - 23 Temmuz 2016, 16:28:48
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



Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: Erhan YILMAZ - 23 Temmuz 2016, 16:51:17
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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: 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


Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: Erhan YILMAZ - 23 Temmuz 2016, 17:06:18
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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: 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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: Erhan YILMAZ - 23 Temmuz 2016, 17:24:13
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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: RaMu - 23 Temmuz 2016, 21:00:10
" .S " yani büyük S yazınca C derleyicisini mi kullanıyor?
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: z - 23 Temmuz 2016, 21:24:38
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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: Burak B - 23 Temmuz 2016, 23:57:41
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.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 (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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: F493 - 24 Temmuz 2016, 12:45:52
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.

Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: RaMu - 24 Temmuz 2016, 13:14:54
@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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: F493 - 24 Temmuz 2016, 14:47:56
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?

(https://s32.postimg.cc/tof9haje9/2016_07_24_14_22_56.png) (https://postimg.cc/image/tof9haje9/)

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.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: Burak B - 24 Temmuz 2016, 21:20:01
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ı.



Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: kantirici - 21 Kasım 2016, 16:47:39
Alıntı yapılan: z - 23 Temmuz 2016, 16:28:48
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

Video için teşekkürler hocam.
Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: memo333 - 22 Kasım 2016, 21:39:08
Alıntı yapılan: F493 - 24 Temmuz 2016, 12:45:52
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.



bana da aynısı olmuştu stack ve heap artırırsanız sorun çözülebilir..

birde compiler nedir?

compiler IARmış. o zaman MAP dosyanda RAMi kontrol et, IAR MAP dosyasındaki RAM hesaplamasına STACK ve HEAP'i koymuyor. Eğer RAM'de sınıra yaklaştıysan bu durumda STACK RAM dışına taşmış vaziyette program oluşuyor. IAR'ın bugu..

Başlık: Ynt: HARD FAULT VE DİĞER EXCEPTION DURUMLARI İŞLEME
Gönderen: F493 - 23 Kasım 2016, 10:25:39
Selam Hocam,

   Sorun Dinamik alan tahsisatından çıkıyormuş.  Ekran için SRAM de 120Kb alan tahsis etmiştim ve ekrana bir şeyler basmak için bu alan kullanılıyor.  Normal şartlarda ekrana icon basmak istersek icon kadar dinamik alan elde ediliyor ekrana basılıyor ve bu alan geri veriliyor(Verilmek zorunda).  İşte bu dinamik alanı geri veremiyor du, birikerek 120Kb alanı aşıyor ve artık tahsis edecek yer olmayınca yazılım Hard Fault'a  gidiyor ve orada kalıyor du. Bu sorunu bir şekilde çözdüm. Ama tam anladığım söylenemez. Aslında alan tahsis etmeden önce yeterli alan var mı yok mu kontrol edilmesi gerekir fakat EmWin bunu kontrol etmiyor nedeni ST için free verilmesinden mi anlayamadım.

Esen kalın.