Home » Programmer » Pemrograman Efisien

Pemrograman Efisien

Tips dan trik untuk pemrograman efisien

Serta hal-hal yang biasa seorang programmer yang baik akan lakukan, ada beberapa masalah khusus untuk MSPGCC yang Anda harus sadar.

1.Jika Anda yakin rutin utama Anda tidak akan pernah keluar, Anda dapat menggunakan “-mendup-at = utama” bendera saat kompilasi. Ini akan menghemat 6 byte ROM.

2.Hindari melewati daftar argumen panjang untuk fungsi. Hindari kembali nilai-nilai lama dari fungsi. Jenis fungsi yang paling efisien untuk digunakan adalah batal, int, atau pointer.

3. Hindari menginisialisasi variabel global dalam fungsi kecil. Sebaliknya, menetapkan nilai selama definisi variabel.

4. Hindari mengkonversi karakter ke jenis lain. variabel arang bisa ditemukan di mana saja di RAM, sedangkan variabel kata hanya bisa berada di bahkan alamat. Karena ini, kode berikut:

const char * a = “1234”;
int k;
k = * ((int *) ((char * a) + 3));

akan menghasilkan perilaku CPU tak terduga.

5. Gunakan int bukannya char atau unsigned char jika Anda ingin bilangan bulat kecil dalam fungsi. Kode yang dihasilkan akan lebih efisien, dan dalam kebanyakan kasus penyimpanan tidak benar-benar sia-sia.

6. Memeriksa kode assembler (S compiler bendera). compiler tidak dapat menghilangkan kode mati dalam beberapa kasus. Jangan menulis kode mati 🙂

7. Tidak menyatakan SFRs Anda sendiri. Mereka semua menyatakan dalam menyertakan file dengan cara yang benar untuk mencapai kinerja kode maksimal.

8. Cobalah untuk meminimalkan penggunaan penjumlahan dan pengurangan dengan angka floating point. Ini adalah operasi lambat.

9. Gunakan pergeseran bukannya perkalian dengan konstanta yang 2 ^ N (sebenarnya, compiler dapat melakukan ini untuk Anda ketika optimasi diaktifkan).

10. Gunakan int unsigned untuk indeks – compiler akan snip _lots_ kode.

11. Gunakan ‘switch / kasus’ membangun daripada rantai konstruksi ‘jika / lain’.

12. Gunakan logis atau ( ‘|’) daripada ‘+’ untuk bitmasks.

13. Ketika mendefinisikan sedikit bidang, cobalah untuk menggunakan bilangan bulat ditandatangani. Ini menghasilkan lebih kode kompak yang sedikit bidang unsigned integer.

14. Gunakan ‘alloca’ bukan ‘malloc’ bagi penduduk setempat. Dalam aplikasi embedded mencoba untuk menghindari alokasi memori dinamis biasanya lebih baik;).

15. C ++ recomendations samping :-), dapat lebih efisien untuk menggunakan:

#define SMTS 1234567890l

bukannya menyatakan

SMTS panjang const = 1234567890l;

16. loop delay adalah rutinitas yang sangat canggih 🙂 Pengembang sering melakukan sesuatu seperti.:

int i = 1234;

ketika saya–);

atau

int i;

untuk (i = 0; i <1234; i ++);

TIDAK AKAN BEKERJA SEBAGAI ANDA HARAPKAN ketika optimasi diaktifkan !!! optimizer akan mendeteksi kode mati di kedua contoh dan akan menghilangkannya. Bahkan mungkin menghilangkan lingkaran sepenuhnya. Menambahkan atribut volatile definisi 'i' mungkin bisa membantu, tetapi tidak mengandalkan itu jika 'i' adalah variabel lokal. compiler masih dapat mendeteksi perhitungan boros, dan menghilangkan mereka.

Terlepas dari masalah optimasi ini, jenis delay loop gaya pemrograman miskin – Anda tidak tahu berapa lama atau pendek penundaan mungkin menghasilkan (meskipun ada minimum jelas terikat!). Akan lebih baik, dan lebih dapat diandalkan untuk menentukan sesuatu seperti:

static void __inline__ brief_pause (daftar unsigned int n)
{
__asm__ __volatile__ (
"1: \ n"
"Desember% [n] \ n"
"Jne 1b \ n"
: [N] "+ r" (n));
}

dan memanggil rutin ini di mana diperlukan. Ini sederhana, kompak, dan dapat diprediksi.

17. Menggunakan atribut volatile untuk variabel yang dapat diubah atau diperiksa oleh lebih dari satu thread pengolahan (mis kode utama dan rutin interupsi). Jika Anda digunakan untuk compiler kurang efisien, Anda dapat digunakan untuk menulis kode seperti:

int i;

interrupt (TIMERA0_VECTOR) irq_routine (void)
{
i = 42;
}

kekosongan func (void)
{

i = 0;
sementara (i == 0);
}

Jika kita asumsikan interupsi bekerja, dan "func" disebut, Anda mungkin berharap "func" untuk kembali setelah timer A interrupt terjadi. Optimizer akan menghasilkan kode yang benar-benar memegang "i" dalam daftar dalam "func", dan loop di "func" tidak akan pernah menanggapi perubahan ke lokasi memori untuk "i", disebabkan dalam rutin interupsi. compiler bahkan mungkin menghilangkan uji "i" sepenuhnya, meninggalkan loop tak terbatas benar.

Untuk memberitahu compiler bahwa itu harus melihat lokasi memori yang sebenarnya dari "i" setiap kali memeriksa atau memanipulasi "i", yang "volatile" atribut harus ditambahkan definisi "i".

18. Hindari menggunakan "volatile" atribut, kecuali hal ini sebenarnya diperlukan. Karena memaksa compiler untuk menghasilkan kode tambahan untuk memuat, menyimpan dan menguji lokasi memori variabel ini dalam semua keadaan, secara signifikan mengurangi efektivitas Optimizer compiler. godaan untuk membuat banyak definisi global "volatile", hanya untuk berbuat salah di sisi yang aman, datang pada harga.

Cobalah untuk menghindari melakukan hal-hal rumit dalam kode Anda, kecuali Anda benar-benar yakin Anda mengerti konsekuensinya. 🙂


Leave a comment

December 2016
M T W T F S S
« May   Feb »
 1234
567891011
12131415161718
19202122232425
262728293031  

Categories