Misc

Optimasi Kode di Mikrokontroler

Pengarang: Laura McKinney
Tanggal Pembuatan: 4 April 2021
Tanggal Pembaruan: 16 Boleh 2024
Anonim
Microcontroller in FPGA? This is how to do it ... | Step by Step Tutorial | Adam Taylor
Video: Microcontroller in FPGA? This is how to do it ... | Step by Step Tutorial | Adam Taylor

Isi

Penulis menyelesaikan proyek rekayasa tahun terakhirnya dengan pengontrol mikro dsPic, mendapatkan wawasan luas tentang perangkat ini.

Kode bahasa C mikrokontroler mungkin memerlukan pengoptimalan dalam aplikasi tingkat lanjut tertentu. Pengoptimalan kode ini dilakukan untuk mengurangi dua hal penting:

  1. Ukuran Kode: Mikrokontroler dapat menyimpan data dan instruksi terbatas karena ukuran RAM mereka terbatas. Oleh karena itu kode tersebut perlu dioptimalkan, sehingga instruksi dan memori data yang tersedia dapat dimanfaatkan dengan cara yang paling efisien.
  2. Waktu Eksekusi Kode: Mikrokontroler adalah perangkat sekuensial yang menjalankan satu instruksi dalam satu waktu. Setiap instruksi perakitan menggunakan sejumlah siklus clock untuk dieksekusi sendiri. Oleh karena itu kode harus dioptimalkan untuk memastikan bahwa ia melakukan tugas yang diperlukan dalam jumlah paling sedikit dari siklus jam atau instruksi perakitan. Semakin sedikit siklus jam yang digunakan kode, semakin cepat kode berjalan. Artinya, aplikasi dapat berjalan lebih cepat karena waktu pemrosesan dapat diminimalkan.

Artikel ini menyajikan tip dan trik yang dapat digunakan untuk mengurangi ukuran dan waktu eksekusi kode pengontrol mikro.


IDE pengembangan MplabX Microchip akan digunakan untuk mendemonstrasikan contoh jika sesuai.

Bagaimana Mengukur Waktu Eksekusi Kode Secara Eksperimen

Untuk mendapatkan gambaran tentang berapa banyak waktu yang sebenarnya diperlukan untuk mengeksekusi kode secara real-time, Anda perlu mengukurnya secara eksperimental. Penganalisis logika dapat dengan mudah digunakan untuk mengukur waktu eksekusi kode dan mereka yang tertarik dapat menanyakan tentang prosesnya dari saya di email. Selain ini:

  • Beberapa kompiler memiliki kemampuan untuk menghitung siklus jam yang akan dikonsumsi oleh sebuah kode.
  • Beberapa debugger misalnya ICD 3 dari microchip dapat langsung mengukur waktu eksekusi melalui stopwatch.

1. Ketahui Daya Pemrosesan dan Ukuran Memori Mikrokontroler Anda

Tidak selalu frekuensi clock (Mhz) yang memberikan gambaran sebenarnya tentang kecepatan pemrosesan mikrokontroler, ukuran yang lebih realistis adalah MIPS (mega instruksi per detik) atau jumlah instruksi yang dapat dijalankan MCU dalam satu detik.

MCU biasanya berkisar dari 60-70 MIPS dalam kategori high-end hingga 20 MIPS 8-bit AVR. Pengontrol mikro MIPS tinggi kemungkinan besar lebih mahal daripada perangkat kelas bawah jadi di sini Anda memiliki trade-off antara biaya dan kecepatan pemrosesan.


Pengontrol mikro memiliki memori terpisah untuk menyimpan data dan kode program. Ukuran keduanya dapat ditemukan dari lembar data. Anda mungkin memerlukan MCU dengan ukuran memori yang lebih besar jika kode Anda sangat besar.

2. Pilihan Variabel untuk Optimasi dalam Ukuran Kode

Pengontrol mikro memiliki memori data yang terbatas, biasanya berkisar dari 1 hingga 4 Kbytes. Dalam hal ini, sebaiknya pilih jenis variabel yang paling sesuai dengan rentang tanggal yang diharapkan disimpan. Tabel di bawah ini merangkum variabel-variabel ini:

Ringkasan variabel yang digunakan dalam bahasa C.

Jenis VariabelUkuran dalam BytesJarak

bool

1

0 atau 1 saja

arang

1


-128 hingga 127

int

2

-32.768 hingga 32.767

unsigned int

2

0 hingga 65.535

panjang

4

-2.147.483.648 hingga 2.147.483.647

mengapung

4

Tepat hingga 6 tempat desimal

dua kali lipat

8

Tepat hingga 15 tempat desimal

ganda panjang

10

Tepat hingga 19 tempat desimal

Contoh:

  • Jika dua variabel X dan Y akan ditambahkan dan hasilnya disimpan di Z tetapi nilai Z diharapkan lebih tinggi dari 65.535 setelah penjumlahan maka Z dapat dinyatakan sebagai panjang dan X dan Y dapat dinyatakan sebagai unsigned int, nilai X dan Y juga tidak diharapkan menjadi negatif. Ini akan menghemat 04 byte dalam memori data yang seharusnya telah digunakan jika semua variabel dideklarasikan sebagai panjang.
  • Dua variabel X dan Y, yang nilainya diharapkan dalam bilangan bulat akan dibagi, tetapi hasil pembagian dapat menghasilkan desimal, kemudian X dan Y dapat dideklarasikan int dan hasilnya dapat dinyatakan sebagai float atau double tergantung pada ketepatan yang dibutuhkan.

Pilihan tipe data mungkin penting saat mendeklarasikan array yang mengandung banyak elemen.

3. Pilihan Variabel untuk Optimasi dalam Waktu Eksekusi Kode

  • Merupakan fakta yang mapan bahwa kalkulasi floating-point membutuhkan waktu lebih lama daripada kalkulasi fixed-point. Jangan gunakan variabel floating-point di mana nilai desimal tidak diperlukan. Bekerja dengan bilangan bulat tak bertanda tangan jika memungkinkan.
  • Variabel lokal lebih disukai daripada variabel global. Jika variabel hanya digunakan dalam suatu fungsi maka itu harus dideklarasikan dalam fungsi itu karena mengakses variabel global lebih lambat daripada variabel lokal.
  • MCU 8-bit akan menemukan variabel berukuran byte tunggal lebih cepat untuk diakses dan MCU 16-bit akan menemukan variabel 2-byte lebih mudah diakses karena panjang alamat yang dihasilkan.

4. Mengoptimalkan Operasi Aritmatika

Operasi aritmatika dapat dioptimalkan dengan cara berikut.

  1. Gunakan tabel pencarian nilai yang telah dihitung sebelumnya daripada mengevaluasi Sinus atau fungsi trigonometri lainnya atau operasi lain yang hasilnya dapat diketahui sebelumnya dalam kode.
  2. Jika tabel pencarian sinus sudah disimpan dalam memori, kosinus dapat dievaluasi dengan memajukan penunjuk array yang setara dengan 90 derajat.
  3. Di antara empat operasi aritmatika, pembagian dan perkalian memakan waktu pemrosesan paling banyak, dalam praktiknya dapat berada dalam kisaran ratusan mikro-detik atau lebih dalam kasus nilai floating-point.
  4. Gunakan instruksi pergeseran bit alih-alih pembagian dan perkalian. Instruksi shift kanan 3 berfungsi untuk membagi dengan 23 dimana instruksi shift kiri 1 akan berfungsi mengalikan dengan 21.

5. Gunakan Mikrokontroler Mampu DSP untuk Perhitungan Intensif

Beberapa pengendali mikro memiliki unit pemrosesan DSP selain ALU konvensional yang dibangun ke dalam arsitekturnya. Mesin DSP ini diarahkan untuk melakukan kalkulasi aritmatika dengan sangat cepat dalam jumlah siklus clock paling sedikit (satu dalam banyak kasus) berkali-kali lebih cepat daripada ALU.

Instruksi yang dapat dilakukan prosesor DSP lebih cepat dari ALU adalah:

  • Sedikit shift dan putar instruksi.
  • Perkalian, Divisi, dan operasi aritmatika lainnya.
  • Mengevaluasi Sinus dan fungsi trigonometri lainnya.
  • Semua operasi DSP seperti FFT, DFT, convolution, dan pemfilteran FIR.

Menggunakan mesin DSP mikrokontroler membutuhkan:

  • Perpustakaan DSP terpisah dimasukkan ke dalam proyek.
  • Nama fungsi berbeda dari pustaka matematika standar bahasa C. Dokumentasi pustaka dan fungsi ini dapat diperoleh dari situs web produsen masing-masing.
  • Mesin DSP menggunakan tipe variabel 'pecahan' yang berbeda. Pelajari cara menggunakan variabel jenis pecahan sebelum melanjutkan dengan fungsi pustaka dsp.

Perhatikan bahwa fungsi pustaka matematika standar tidak akan memanggil mesin DSP karena mereka diterjemahkan ke dalam instruksi perakitan ALU.

6. Bekerja dengan Interupsi

Gunakan interupsi untuk menjalankan fungsi tertentu seperti:

  • Membaca nilai ADC.
  • Mengirim dan menerima dari UART.
  • Memperbarui register siklus tugas PWM.
  • Komunikasi CAN atau I2C.

Interupsi akan melayani fungsi ini dengan cepat dibandingkan dengan menjalankannya di isi utama melalui panggilan fungsi atau kode sebaris.

Interupsi juga akan memicu hanya jika diperlukan, sedangkan jika dikodekan di badan utama, kode akan dieksekusi di setiap iterasi loop while (1).

7. Gunakan Penyusun Terbaik yang Tersedia

Penyusun dapat secara otomatis mengimplementasikan beberapa pengoptimalan yang dibahas di atas saat menerjemahkan kode dari bahasa C ke bahasa assembly jika dikonfigurasi dengan benar. Carilah opsi pengoptimalan dalam kompiler Anda dan jika mungkin tingkatkan ke versi kompiler profesional karena mereka adalah pengoptimal kode yang lebih kuat.

8. Gunakan Pernyataan Bersyarat secara Cerdas

  • Saat menggunakan serangkaian pernyataan if-else pertahankan kondisi yang paling memungkinkan terlebih dahulu. Dengan cara ini MCU tidak perlu memindai semua kondisi setelah menemukan kondisi sebenarnya.
  • Pernyataan switch-case biasanya lebih cepat dari if-else.
  • Gunakan pernyataan bertingkat if-else sebagai pengganti rangkaian pernyataan. Blok if-else yang memiliki banyak pernyataan dapat dibagi menjadi sub-cabang yang lebih kecil untuk mengoptimalkan kondisi kasus terburuk (terakhir).

9. Gunakan Fungsi Inline

Fungsi yang hanya digunakan sekali dalam kode dapat dideklarasikan sebagai statis. Ini akan membuat kompilator mengoptimalkan fungsi tersebut menjadi fungsi inline dan karenanya tidak ada kode assembly yang akan diterjemahkan untuk pemanggilan fungsi tersebut.

  • Sebuah fungsi dapat dideklarasikan secara inline dengan menggunakan kata kunci 'statis' dengannya.

10. Gunakan Decremented Loops

Loop yang dikurangi akan menghasilkan kode assembly yang lebih sedikit dibandingkan dengan loop yang bertambah.

Hal ini dikarenakan pada increment loop diperlukan instruksi perbandingan untuk membandingkan indeks loop dengan nilai maksimum pada setiap loop untuk memeriksa apakah indeks loop mencapai nilai maksimum. Sebaliknya pada loop decrement, perbandingan ini tidak diperlukan lagi karena hasil decrement dari indeks loop akan menetapkan flag nol pada SREG jika mencapai nol.

Mengingat bahwa loop harus melakukan iterasi ratusan kali, mengurangi satu instruksi dari loop akan mencegahnya dieksekusi ratusan kali sehingga dampaknya mungkin lebih signifikan ketika loop harus melakukan iterasi berkali-kali.

Membungkus

Kiat-kiat ini mungkin berguna tetapi aplikasi dan potensinya yang sebenarnya bergantung pada keterampilan pemrogram dan perintah yang dia miliki pada kodenya. Ingat, ukuran program tidak selalu menentukan waktu eksekusi, beberapa instruksi mungkin menghabiskan lebih banyak siklus jam daripada yang lain jadi sekali lagi keterampilan program harus memainkan peran mereka.

Artikel ini akurat dan benar sepanjang pengetahuan penulisnya. Konten hanya untuk tujuan informasi atau hiburan dan tidak menggantikan nasihat pribadi atau nasihat profesional dalam masalah bisnis, keuangan, hukum, atau teknis.

Keterangan Lebih Lanjut

Pilihan Situs

Jaga Baterai MacBook Anda untuk Memperpanjang Umurnya
Komputer

Jaga Baterai MacBook Anda untuk Memperpanjang Umurnya

aya menyukai perangkat Apple dan enang memberikan tip tentang cara menggunakan dan memeliharanya.Apple MacBook dikenal memiliki ma a pakai baterai yang lama. Ini berkat teknologi inovatif yang diguna...
Manajemen Bandwidth pfSense: Konfigurasi Pembentuk Lalu Lintas
Komputer

Manajemen Bandwidth pfSense: Konfigurasi Pembentuk Lalu Lintas

am bekerja ebagai anali jaringan untuk peru ahaan perdagangan algoritmik. Ia memperoleh gelar arjana Teknologi Informa i dari UMKC.Manajemen bandwidth yang efektif angat penting untuk kinerja jaringa...