Bagaimana saya bisa membuat snipet kode hanya berjalan sekali seumur hidup suatu program? Itu bisa dimatikan dan dihidupkan berkali-kali. Satu-satunya opsi untuk menjalankan cuplikan kode lagi harus memasang ulang papan.
Kode ini adalah Bagian Kalibrasi yang tidak ingin saya jalankan lagi. Jika saya menggunakan EEPROM atau Flash, kami akan mengatur Bendera ke true atau False. Jadi, ketika kita pertama kali membaca lokasi memori apa yang akan menjadi nilai acak di area memori itu?
Apa metode terbaik untuk mengimplementasikan ini dalam embedded C?
microcontroller
c
embedded
Ganeshredcobra
sumber
sumber
Jawaban:
Mikrokontroler Anda mungkin memiliki beberapa EEPROM, memori OTP, bit sekering pengguna, tempat Anda dapat mengatur flag.
Tidak ada "metode terbaik dalam embedded C", menulis memori nonvolatile berbeda di setiap mikrokontroler.
edit:
FLASH
Isi memori flash dihapus saat memprogram perangkat. Setelah pemrograman, semua byte yang tidak ditulis mengandung 0xFF. Konsultasikan lembar data untuk menemukan area yang dapat diprogram dengan aman dari dalam firmware yang sedang berjalan.
EEPROM
Meskipun tidak dijamin dalam lembar data, semua EEPROM yang saya lihat sejauh ini mengandung 0xFF: s ketika dikirim dari pabrik (kecuali yang diprogram sebelumnya dengan alamat MAC yang unik, tapi itu didokumentasikan secara eksplisit). Beberapa perangkat / perangkat lunak pemrograman juga dapat menghapus atau memprogram konten EEPROM. Beberapa dapat dilindungi secara tertulis, secara permanen atau terbalik.
OTP
Memori One Time Programmable selalu berisi nilai awal yang terdefinisi dengan baik, didokumentasikan dalam lembar data.
Itu selalu ide yang baik untuk memasukkan checksum yang baik seperti CRC32 dengan data yang ditulis, untuk melindungi terhadap korupsi data yang disebabkan oleh bagian yang rusak, kesalahan transmisi, sinar kosmik, apa pun.
sumber
Kamu berkata:
Orang lain mengatakan untuk menggunakan EEPROM untuk menyimpan bendera untuk menunjukkan kapan fungsi run_once () telah dijalankan. Namun, ini memiliki draw back yaitu jika Anda merefleksikan mikrokontroler, bendera ran_it_once di EEPROM telah ditetapkan dan fungsi run_once () tidak akan dieksekusi. Jika mikrokontroler Anda telah menyematkan EEPROM, maka dimungkinkan untuk menghapus flag ran_it_once saat Anda merefleksikan mikrokontroler, jika programmer mendukungnya.
Cara yang lebih baik adalah memiliki nomor versi di EEPROM dan kode. Ketika kode dijalankan dari power-up, kode harus membaca nomor versi dari EEPROM dan membandingkannya dengan nomor versi yang disimpan dalam kode. Jika tidak cocok maka fungsi run_once () dipanggil, dan tindakan terakhir dari kode run_once () adalah menulis nomor versi firmware ke dalam EEPROM. Setiap kali Anda memodifikasi kode sumber firmware Anda harus menambah nomor versi yang tertanam di dalamnya.
sumber
Pilih mikrokontroler yang dapat menulis / menghapus memori programnya sendiri. Setelah mengeksekusi kode yang dimaksud, mintalah bagian terakhir dari kode tersebut menggantikan instruksi pertama dengan lompatan yang mem-bypassnya. Secara opsional, Anda juga dapat menghapus sisanya (mungkin ganti dengan nop), sehingga tidak ada peluang sama sekali untuk mengeksekusi lagi.
Pesan ini akan dihancurkan sendiri di 5..4 ...
sumber
Ketika Anda menggunakan kode ini untuk kalibrasi, saran saya adalah membuat proses ledakan yang menjalankan kode kalibrasi sebagai tahap pertama dan bahkan tidak memilikinya pada versi produksi papan yang sudah jadi. Ini mirip dengan jawaban oleh apalopohapa, kecuali berbeda dalam arti bahwa Anda akan memiliki dua beban program yang terpisah: memiliki proses ledakan yang memancarkan beban program pertama yang menjalankan semua kalibrasi dan mengeluarkan data dari itu. Kemudian ambil data itu dan gabungkan ke dalam data beban program kedua.
Salah satu manfaat dari pendekatan ini adalah Anda benar-benar meminimalkan jumlah ruang penyimpanan yang Anda butuhkan - Anda tidak perlu menyimpan kode hanya sekali Anda, hanya data yang dihasilkannya. Dengan memiliki proses ledakan yang memuat dua program terpisah, Anda juga melindungi diri Anda sedikit dari bug dalam kode inisialisasi yang bisa berlama-lama sebaliknya. Anda juga memiliki beberapa fleksibilitas tambahan jika Anda ingin menjalankan kembali kode kalibrasi Anda: alih-alih harus menulis kode tambahan untuk menghapus bit apa pun yang menunjukkan bahwa kode Anda telah dijalankan (yang secara tidak sengaja dapat dihapus sudah) Anda cukup jalankan kembali proses ledakan.
sumber