Pertemuan 7 Optimasi Pemrograman C Matakuliah : <<Kode>>/<<Nama mtkul>> Tahun : <<Tahun Pembuatan>> Versi : <<versi/revisi>> Pertemuan 7 Optimasi Pemrograman C
Learning Outcomes Pada akhir pertemuan ini, diharapkan mahasiswa akan mampu : Melakukan optimasi pemrograman C pada target micro-kontroler atau embedded systems
Prosessor Arsitektur Const Volatile Array & Static Integer & Register Outline Materi Prosessor Arsitektur Const Volatile Array & Static Integer & Register
Prosessor Arsitektur
Prosessor Arsitektur 8051
Prosessor Arsitektur 68HC11/12 ROM/ RAM CPU EEPROM EPROM 68HC11/12 TIMER A/D PARALLEL SPI SCI I/O
The 68HC12(11) Registers
Hirarki Bahasa Pemrograman Komputer Bahasa Mesin merupakan kombinasi angka-angka yang dieksekusi langsung oleh komputer. Sehingga bahasa mesin bersifat unik antar satu prosessor dengan prosessor jenis lainnya.
Sistem Pemrograman
Istilah-istilah yang digunakan: Bahasa Mesin Bahasa Assembly Assembler: Bahasa Assembly ke bahasa mesin Compiler: Bahasa Tingkat Tinggi ke bahasa mesin atau assembly. (<- hal ini yang akan di-optimalisasi pada bahasa C) Linker/Loader
Hardware Software Firmware: Software dalam memori (hardware) Catatan: Kegiatan pemrograman adalah kegiatan mempersiapkan daftar instruksi-instruksi yang akan dieksekusi. Program disimpan pada memori program. Data disimpan pada memori data dan dimanipulasi oleh program. Memori Data dan Program dapat disimpan pada lokasi ic-memori yang sama ataupun berbeda, misalnya ROM untuk memori Program dan RAM untuk memori Data.
Const – Volatile Qualifiers Const dan Volatile tidak saling berhubungan (Const != !Volatile) Const dan Volatile digolongkan sbg Tipe Qualifier, apa maksudnya? Qualifier: Memenuhi persyaratan atau standard tertentu, contoh: volatile int k; //volatile adalah sebuah qualifier Specifiers: Menyatakan tipe data suatu variable, contoh: int k; //int adalah sebuah specifiers
Contoh Const + Volatile volatile i; volatile int j; const long q; const volatile unsigned long int rt_clk; struct { const long int li; signed char sc; }volatile vs;
Const Const(anta): tidak dapat diubah! Lalu kapan const var dapat diisi? Saat inisialisasi atau jika const var tersebut mengacu pada port hardware yang berada pada alokasi alamat memori yang tetap. Const &Objek -> *pointer const OK Const &Objek -> *pointer non-const NOT_OK
char c; char *const cp = &c; cp c const char *cp; cp c Const Const pointer Non Const Variable const char *cp; cp c Non Const pointer Const Variable
Volatile Volatile digunakan pada pemrograman C untuk real-time atau sistem embedded. Mengapa? Bayangkan suatu alat memiliki 2 buah register dengan panjang 16-bit/register pada alamat yang berurutan. Register pertama adalah register kontrol-status (csr-control status register) dan register kedua adalah register data. Maka cara mengakses kedua register tersebut adl:
volatile /* Standard C example but without const or volatile */ /* * Declare the device registers * Whether to use int or short * is implementation dependent */ struct devregs{ unsigned short csr; /* control & status */ unsigned short data; /* data port */ }; /* bit patterns in the csr */ #define ERROR 0x1 #define READY 0x2 #define RESET 0x4 /* absolute address of the device */ #define DEVADDR ((struct devregs *)0xffff0004) /* number of such devices in system */ #define NDEVS 4 /* * Busy-wait function to read a byte from device n. check range of device number. Wait until READY or ERROR * if no error, read byte, return it * otherwise reset error, return 0xffff */ unsigned int read_dev(unsigned devno){ struct devregs *dvp = DEVADDR + devno; if(devno >= NDEVS) return(0xffff); while((dvp->csr & (READY | ERROR)) == 0) ; /* NULL - wait till done */ if(dvp->csr & ERROR){ dvp->csr = RESET; return(0xffff); } return((dvp->data) & 0xff); }
Sehingga perlu ditambahkan kata “volatile” sebagai berikut: Volatile digunakan untuk memberi-tahu kompiler bahwa hardware port yang digunakan bersifat volatile: artinya meskipun alamat hardware port tersebut sama, tetapi kompiler C tidak BOLEH melakukan optimasi pada perulangan while() dengan mengkopi hanya satu kali data pada hardware port tersebut. Sehingga perlu ditambahkan kata “volatile” sebagai berikut:
volatile /* Standard C example but without const or volatile */ /* * Declare the device registers * Whether to use int or short * is implementation dependent */ struct devregs{ unsigned short volatile csr; /* control & status */ unsigned short const volatile data; /* data port */ }; /* bit patterns in the csr */ #define ERROR 0x1 #define READY 0x2 #define RESET 0x4 /* absolute address of the device */ #define DEVADDR ((struct devregs *)0xffff0004) /* number of such devices in system */ #define NDEVS 4 /* * Busy-wait function to read a byte from device n. check range of device number. Wait until READY or ERROR * if no error, read byte, return it * otherwise reset error, return 0xffff */ unsigned int read_dev(unsigned devno){ struct devregs *dvp = DEVADDR + devno; if(devno >= NDEVS) return(0xffff); while((dvp->csr & (READY | ERROR)) == 0) ; /* NULL - wait till done */ if(dvp->csr & ERROR){ dvp->csr = RESET; return(0xffff); } return((dvp->data) & 0xff); }
register unsigned int var_name; Integer & Register register unsigned int var_name; Gunakan unsigned int jika diketahui bahwa nilai variabel integer tersebut tidak akan pernah negatif. Karena prosessor menangani variabel unsigned integers lebih cepat daripada variabel integers. Register berfungsi untuk memastikan bahwa var_name ditempatkan sedekat mungkin dengan prosessor (yaitu: berada pada register).
Array & Static Switch: switch ( queue ) { case 0 : letter = 'W'; break; case 1 : letter = 'S'; break; case 2 : letter = 'U'; break; } atau IF: if ( queue == 0 ) letter = 'W'; else if ( queue == 1 ) letter = 'S'; else letter = 'U'; static char *classes="WSU"; letter = classes[queue];
Lingkup / Scope lokal variabel, tetapi Static Static: Lingkup / Scope lokal variabel, tetapi nilai variabel bersifat Tetap (preserved) pada saat program keluar dari lingkup fungsi tersebut.
Concurrent Versions System 1 Topik Minggu Depan Concurrent Versions System 1 Tugas: Mahasiswa mencoba fungsi debugger pada bahasa C untuk Studi Kasus: Konversi data Analog ke data Digital – buku pustaka no:2 halaman 93) Tugas: Baca buku elektronik berjudul: “Open Source Development with CVS”