Jalankan kode sekali seumur hidup dari program C yang tertanam

8

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?

Ganeshredcobra
sumber
5
Gunakan bendera dan simpan bendera ini ke eeprom (atau lampu kilat). Dalam setiap saat membaca bendera dari EEPROM. Saat pertama instan, nilai flag akan memaksa fungsi untuk mengeksekusi. Setelah itu Anda dapat mengubah nilai bendera dan menyimpannya ke EEPROM lagi. Terkadang nilai flag tidak akan memaksa fungsi dieksekusi.
hoo2
2
tidak jelas apa yang Anda tanyakan.
old_timer
2
Apa motivasi Anda di balik mencegah kode berjalan untuk kedua kalinya? Apakah penting bahwa kode tidak dapat direkayasa ulang, dalam hal ini pengaturan bendera untuk memotongnya mungkin tidak cukup aman? Apakah menjalankan kode kedua kalinya akan merusak perangkat keras? Apakah ini hal yang UX, suka menampilkan pesan tutorial saat sistem pertama kali digunakan, dalam hal ini mungkin diinginkan untuk fungsi "factory reset" (jika ada) untuk memicu kode untuk berjalan lagi?
Micheal Johnson
5
Umumnya adalah ide yang baik untuk memungkinkan kalibrasi ulang jika ada sesuatu yang kacau pada putaran pertama kalinya, atau sistem perlu dikalibrasi ulang untuk pengaturan yang berbeda atau untuk mengkompensasi penuaan perangkat keras dll. Saya, misalnya, cenderung mengacaukan kalibrasi ke atas pertama kali karena saya tidak tahu apa yang seharusnya saya lakukan.
Micheal Johnson
3
Bagaimana kalau Anda mengatur kode sehingga ada cara untuk memerintahkannya untuk dijalankan (Yaitu mengirim sesuatu melalui port serial). Dengan cara ini, tidak perlu repot dengan memori yang tidak mudah menguap dan Anda dapat memicu kalibrasi selama produksi dengan cara yang terkontrol.
alex.forencich

Jawaban:

18

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.

berendi - protes
sumber
Jika saya menggunakan EEPROM atau Flash, kami akan menetapkan Bendera ke true atau False. Jadi, ketika kami pertama kali membaca lokasi memori apa yang akan menjadi nilai acak di area memori itu.
ganeshredcobra
2
Selama pembuatan ulang EEPROM (baik dengan seorang programmer, jika mungkin, atau dengan membuat program penghapus sedikit bodoh, flash itu, nyalakan secara normal selama beberapa detik, kemudian muat dalam program produksi Anda).
Nick T
13

Kamu berkata:

Satu-satunya opsi untuk menjalankan kode itu harus mem-flash papan lagi.

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.

Steve G
sumber
1
Ini sebenarnya akan memiliki masalah yang sama dengan flag boolean jika semua yang dilakukan pengguna adalah reflash mikrokontroler dan perlu dijalankan kembali (dalam skenario itu). Ini pasti akan menyelesaikan masalah jika firmware telah diperbarui dan perlu dijalankan kembali.
Taegost
8

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 ...

apalopohapa
sumber
1
Sepintar jawaban ini, saya pikir itu tidak perlu rumit. Mungkin bisa menggunakan catatan yang menyatakan bahwa mungkin hanya boleh digunakan jika memori persisten di luar memori kode tidak tersedia?
skrrgwasme
Bahkan jika solusi lain mungkin, saya pikir ini lebih mudah dipahami daripada yang lain.
Joshua
1
Bahkan jika solusi lain mungkin, saya pikir ini akan sangat sulit untuk dipahami pada tingkat kode sumber.
CVn
Kebanyakan PIC hanya memiliki 35 instruksi ... apa yang bisa salah? ;)
rdtsc
5

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.

Michael
sumber