Arm M0 Flash Sorusu

flowchartx

Aktif Üye
Katılım
18 Ağustos 2021
Mesajlar
219
Herkese iyi akşamlar,
Bir sıcaklık kontrol sistemi üzerinde çalışıyorum. Bu sistemde sensörler için parametre ayarı yapılıyor offset, histerisiz gibi, benim bu parametreleri sürekli flashta tutmam gerekiyor. Aç kapa yapınca bütün parametreleri aynı şekilde init etmem lazım. Hardware enerji kesintisi anlayıp bir uyarı veremiyor yani öyle tasarlanmamış hardware'i değiştirmem imkansız. M3 M4 işlemciler için enerji kesintisini anlayan registerlar var ama M0 işlemcide o registerlar yok. Ben şuanda her parametre set edildiğinde bütün parametreleri silip tekrar yazıyorum ama bu flashın ömrünü baya bir kısaltacak. Periyodik olarak kaydedersem veri kaybı riski var. Sizin önerileriniz nelerdir fikir alışverişi yapabiliriz :)
 
Benim anladığım kadarıyla senin asıl sorunun flash'ın sürekli yazılmada aşınması değil. Asıl sorun, enerjinin hangi anda kesileceğinin belli olmaması. Tam bir parametreyi flash'a kaydederken enerji kesilirse, mesela sen flash'ı sildiktan sonra, sistem tekrar açıldığında o parametre yanlış olarak okunacak. Böyle durumlarda çözüm, iki tane parametre tablosu bulundurmak. Buradaki varsayım, elektrik kesilirse sadece bir tablo bozulacak, diğeri sağlam kalacak. Böylece de yeni parametre kaydedilemezse bile eski değeri bilinecek ve eski değer ile çalışmaya devam edecek.
 
Evet bu sorunu da bir çözüm bulmam gerekiyordu. Dediğinizi deneyeceğim teşekkürler :)

Benim diğer merak ettiğim konu, cihazda 50 parametre var kullanan kişi bunları değiştirdikçe benim silme ve yazma yapmam lazım. Şuan ki durumda 50 parametre için 50 kere silme 50 kere yazma yapıyorum. Bu yöntem işlemcinin life timenı kısaltır mı? yoksa çok bir etkisi olmaz mı ?
 
Değişmeyen parametrenin saklandığı yeri neden tekrar silip yazıyorsun anlamadım ...

Benim M4 işlemcide 32 KByte lık data flash var. 512 tane 64 byte'lık block. Ben her bir 64 byte bloku ayrı bir parametrenin saklama alanı olarak kullanıyorum. İlgili parametre değişmişse sadece ilgili bloku erase edip tekrar yazıyorum.

Benim uygulamada enerji kesilmesinden dolayı bir veri kaybı sorun teşkil etmiyor. Mesela volüm değerini saklıyorum, amfinin seçilmiş olan input'unun hangisi olduğunu saklıyorum. Her 64 byte blokta 8 bit CRC checksum var. Eğer CRC hatası varsa, ilgili bloku default'a getiriyorum ve default parametreyi kullanıyorum. Yani ek kötü ihtimalde, yanlış zamanda elektrik kesildiyse, adamın amfisi default volume ve default input ile açılmış oluyor.
 
Bende toplam 32KBytelik yer var programa yer bırakmak için son pagei kullanıyorum şuanlık onunda boyutu 1KByte. Yani tek bir parametre bile değişirse benim tüm pagei silmem gerekiyor. Eğer program bittiğinde yeterli yerim kalırsa bir kaç page kullanıp sizin mantığınızda yapmaya çalışıcam.
 
Aynen, son iki 1 KByte bloku "yedekli parametre bloku" yaparsın. İkisinde de bir çeşit checksum olur. Firmware boot edince, iki bloktan hangisinin checksum'u doğru ise onu kullanır, bozuk olana da sağlam olanın içeriğini yazar. Bir tane de sequence numarası yazarsın blokun ilk byte'ına. Her yazmada bunu bir arttırırsın. Böylece en son hangi bloka yazdığını bilirsin ve blokları dönüşümlü kullanırsın, aşınmayı ikisi arasında paylaştırmış olursun.
 
1K page de 50 byte dan 20 parametre saklayabilirsin.

0 byte dan itibaren 50 byte yazdin. Diyelim ki kullanici parametre degistirdi;

1K alani silme. 100.Adrese yeni parametrelerini yaz.
Ne zaman 20 kez parametre yazildi ve 21. yazilacak, iste o zaman 1K alani temizle.

Flash silindiginde icerigi 0xFF olacagindan program ilk acilista 0'i okur bakti parametrevar, 50 yi de okur bakti parametre var, 150 yi okur bakti 0xFF.

Bu durumda 100 adresindeki parametreleri okur ve kullanir.
 
Son düzenleme:
İşlemcinin besleme voltaj regulatöründen giriş voltajının durumunu bir harici interrupt bacağını uyaracak şekilde düzenlemek mümkün mü? Eğer öyleyse regülatörün Vin kondansatörü ve ve Vout kondansatörü boşalana kadar veriler kaydedilebilir. Bunu garanti altına almak için kesinti tespit edildiğinde parametre kaydından önce display vb gibi fazla enerji çeken parçalar kapatılabilir.
 
İşlemcinin besleme voltaj regulatöründen giriş voltajının durumunu bir harici interrupt bacağını uyaracak şekilde düzenlemek mümkün mü

Bu amaç için genelde NMI (non-maskable interrupt) denen bir kesme seviyesi kullanılıyor. NMI, en yüksek önceliğe sahip kesme ve yazılımsal olarak da kapatılamıyor.
 
Voltaj seviyesini M0 işlemcide okuyamıyorum. M4 işlemciler için intetnette bir kaç kişi, power registerlarıyla girişi voltaj seviyesini okuyup ona göre bir kesme oluşturuyor. @semih_s dediğiniz gibi en güvenilir çözüm bence de o. Fakat bu registerlar M0da yok hardwarei değiştirip kendim okuyabilirim ama o da imkansız. NMI kesmesi powerda değilde, diğer kritik hatalarda (memory, clock, kitlenme hataları gibi ) kullanıldığını gördüm. Şuan karar verdiğim yöntem @taydin hocanın dediği gibi 2 table yapmak
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,951
Mesajlar
118,753
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top