Saya memiliki isr yang memperbarui tampilan pada frekuensi tetap. Saya ingin menyesuaikan rutinitas saya untuk meminimalkan overhead dan menjaga waktu cpu sebanyak mungkin terbuka untuk pemrosesan lainnya, tetapi saya tidak memiliki cara yang baik untuk mengumpulkan metrik untuk menentukan beban cpu saya.
Saya bisa melihat perakitan dan menganalisis rutinitas, tetapi saya tidak memiliki kesabaran atau kemampuan untuk melakukan itu secara akurat. Saya tidak merasa seperti saya perlu hasil yang sangat halus juga, hanya persentase sederhana dari waktu cpu ditempati oleh isr.
Saya bisa menetapkan pin tinggi hanya ketika isr aktif dan mengukurnya secara eksternal. Itu memiliki minimum overhead dalam kode, tetapi saya tidak tahu harus mengukurnya dengan apa. Saya tidak punya osiloskop atau semacamnya. Apakah ada ic sederhana atau cara mudah untuk menggunakan mikro lain untuk mengukur siklus tugas? Saya telah mendengar tentang chip penghitung frekuensi khusus, tetapi apakah ada sesuatu untuk siklus kerja?
sumber
Tetapkan pin output saat Anda memasukkan ISR dan menghapusnya sebelum kembali dari itu. Saring output dengan filter RC. Tegangan melintasi kapasitor akan memberi Anda siklus tugas ISR.
Misalnya, jika catu daya Anda 3.3V dan Anda mengukur 33mV, maka Anda menghabiskan 1% dari waktu di ISR.
sumber
Cara termudah untuk melakukan ini adalah menjalankan kode dalam simulator dan mengukur siklus yang diambil oleh rutin interupsi. Simulator Microchip MPLAB, misalnya, memiliki fitur stopwatch praktis yang sangat berguna untuk tujuan ini.
Gagal, menaikkan pin di awal interupsi dan menurunkannya di akhir bisa membantu. Cara termudah untuk melihatnya adalah dengan osiloskop. Jika Anda melakukan proyek mikrokontroler dan elektronik, Anda tetap harus mendapatkannya.
Tanpa ruang lingkup, Anda dapat dengan mudah menyaring tegangan pin rendah, kemudian mengukurnya dengan voltmeter. Tegangan yang dibagi dengan tegangan daya prosesor akan memberi Anda fraksi waktu pin tinggi. Misalnya, jika prosesor berjalan pada 3.3V dan tegangan pin yang disaring low pass adalah 800mV, maka pin tersebut tinggi 800mV / 3.3V = 24% dari waktu.
Karena Anda tampaknya menggunakan kompiler, Anda perlu menurunkan jawaban ini. Kompiler kemungkinan menambahkan beberapa kode entri interupsi sebelum kode Anda berjalan dan interupsi kode keluar setelah kode Anda berjalan. Waktu interupsi yang sebenarnya akan memperpanjang beberapa siklus di kedua sisi pulsa. Tentu saja jika Anda peduli dengan waktu interupsi, Anda seharusnya tidak menggunakan kompiler.
sumber