December 5, 2021

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

ARM Cortex-M3: Kendali Interupsi

13 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Keluarga ARM Cortex mempunyai sistem kendali interupsi yang dinamakan dengan NVIC (Nested Vectored Interrupt Controller). NVIC ini merupakan bagian dari core Cortex-M3, sehingga semua prosesor dengan core Cortex-M3 akan mempunyai struktur interupsi yang sama. NVIC dirancang untuk bisa menangani sampai 240 interupsi eksternal dari periperal (IRQ), selain itu NVIC juga terhubung dengan eksepsi-eksepsi yang dibangkitkan oleh core ARM Cortex sendiri, seperti yang telah dijelaskan di artikel sebelumnya.

Struktur Interupsi ARM Cortex-M3

Sesuai dengan namanya, NVIC mendukung interupsi bersarang (nested interrupt). Dalam interupsi bersarang, prosesor memungkinkan untuk melayani interupsi yang baru walaupun pada saat itu sedang melayani interupsi lain, tentunya dengan melihat level prioritas dari masing-masing interupsi. Sehingga ketika terjadi sebuah interupsi, kendali interupsi (NVIC) akan melihat dan membandingkan dengan level prioritas dari interupsi yang sedang dilayani. Jika prioritas interupsi yang baru lebih tinggi dari prioritas interupsi yang sedang dikerjakan, maka interupsi yang sedang dilayani akan ditunda terlebih dahulu, dan prosesor akan melayani interupsi yang baru tersebut. Interupsi yang ditunda tersebut akan berstatus aktif dan tertunda (active and pending). Sebaliknya jika prioritas interupsi baru tersebut lebih rendah dari pada prioritas dari interupsi yang sedang dikerjakan, interupsi baru tersebut akan ditunda dan berstatus tertunda (pending).

Dengan skenario interupsi bersarang seperti di atas, sebuah interupsi akan mempunyai salah satu dari status di bawah ini:

  1. Interupsi tidak aktif (inactive), jika interupsi atau eksepsi tidak aktif dan tidak ditunda
  2. Interupsi ditunda (pending), jika interupsi pelayanannya ditunda karena prosesor sedang melayani interupsi dengan prioritas yang lebih tinggi.
  3. Interupsi sedang aktif, jika interupsi masih dilayani oleh prosesor
  4. Interupsi aktif dan tertunda, jika interupsi dengan dilayani tetapi kemudian ditunda karena ada interupsi dengan prioritas yang lebih tinggi.

NVIC juga dirancang agar ARM Cortex-M3 mempunyai waktu latency yang rendah. Waktu latency adalah waktu yang diperlukan oleh prosesor untuk mengeksekusi instruksi pertama dari fungsi layanan interupsi (ISR) atau fungsi penangan eksepsi. ARM Cortex-M3 mempunyai waktu latency sebesar 12 siklus, sehingga sesuai untuk dipakai di aplikasi-aplikasi real time.

REGISTER-REGISTER NVIC

NVIC dikendalikan oleh beberapa register:

  1. Register untuk mengaktifkan dan mamatikan interupsi (ISER dan ICER)
  2. Register penundaan interupsi (ISPR dan ICPR)
  3. Register yang menyimpan status aktif tidaknya interupsi (IABR)
  4. Register untuk mengatur prioritas interupsi (IPR)

Register ISER (Interrupt Set Enable Register) dan ICER (Interrupt Clear Enable Register) digunakan untuk mengaktifkan atau mematikan interupsi sebuah periperal. Interupsi diaktifkan dengan menset bit SETENA di register ISER, sedangkan untuk mematikannya dilakukan dengan men-set bit CLRENA di register ICER. Kedua register ini merupakan register 32 bit, masing-masing bit mewakili satu sumber interupsi. Jika sebuah chip prosesor ARM Cortex-M3 memiliki lebih dari 32 interupsi eksternal, maka prosesor tersebut akan mempunyai register ISER dan ICER lebih dari satu. ARM Cortex-M3 maksimal akan mempunyai 8 buah register ISER dan ICER karena ARM Cortex-M3 bisa menangani IRQ sampai 240 IRQ. Hasil pembacaan register ini akan menunjukan interupsi mana saja yang diaktifkan dan mana yang tidak.

Register ISER dan ICER

Register ISPR (Interrupt Set Pending Register) dan ICPR (Interrupt Clear Pending Register) digunakan untuk menunda sebuh interupsi, misalnya karena ada interupsi lain dengan prioritas interupsi yang lebih tinggi. Men-set bit SETPEND di register ISPR akan membuat interupsi yang diwakilinya menjadi tertunda (pending) dan men-set bit CLRPEND di register ICPR akan membatalkan status penundaan sebuah interupsi. Kedua register ini juga merupakan register 32 bit, dan setiap bit mewakili sebuah interupsi. Prosesor Cortex-M3 bisa mempunyai lebih dari satu registe ISPR dan ICPR sesuai dengan jumlah interupsi eksternal yang dimilikinya. ARM Cortex-M3 maksimal akan mempunyai 8 buah register ISPR dan ICPR karena ARM Cortex-M3 bisa menangani IRQ sampai 240 IRQ. Hasil pembacaan register ini juga akan menunjukan interupsi mana saja yang sedang ditunda.

Register ISPR dan ICPR

Register ISPR dan ICPR bisa dimodifikasi secara software, sehingga bisa digunakan untuk membatalkan sebuah interupsi atau membangkitkan interupsi secara software. Interupsi yang ditunda karena ada interupsi lain dengan prioritas lebih tinggi, bisa dibatalkan dengan men-set bit CLRPEND di register ICPR. Begitu juga ketika software men-set bit SETPEND di register ISPR, walaupun sumber interupsinya tidak benar-benar terjadi, maka prosesor ARM Cortex akan tetap mengkondisikan interupsi tersebut sedang ditunda, sehingga ketika selesai melayani interupsi dengan prioritas lebih tinggi, prosesor akan mengerjakan fungsi layanan dari interupsi yang ditunda tersebut.

Register IABR (Interrupt Active Bit Register) menyimpan bit-bit status apakah interupsi sedang dieksekusi atau tidak. Saat terjadi interupsi, prosesor akan men-set bit ACTIVE dari register IABR sesuai dengan interupsi yang dilayani dan akan me-reset bit ACTIVE setelah fungsi layanan interupsi (ISR) yang bersangkutan selesai dieksekusi. Selama mengeksekusi ISR, ada kemungkinan terjadi interupsi dengan prioritas yang lebih tinggi, sehingga harus dilayani terlebih dahulu. Pada kondisi ini bit ACTIVE akan tetap di-set, tetapi untuk menandakan bahwa interupsinya sedang ditunda, prosesor akan men-set bit SETPEND di register ISPR. Sama dengan register sebelumnya, sebuah prosesor ARM Cortex-M3 bisa mempunyai register IABR lebih dari satu. ARM Cortex-M3 maksimal akan mempunyai 8 buah register IABR karena ARM Cortex-M3 bisa menangani IRQ sampai 240 IRQ. Register IABR bersifat hanya bisa dibaca.

Register IABR

Register IPR (Interrupt Priority Register) merupakan register yang digunakan untuk mengatur prioritas sebuah interupsi. Register ini bisa diakses secara byte sebagai register IP, sehingga dalam 1 register IPR akan ada 4 register IP. Register IP ini menyimpan prioritas 4 bit untuk setiap interupsi, seperti yang akan dijelaskan.

Register IPR

Register STIR (Software Trigger Interrupt Register), sesuai dengan namanya digunakan untuk membangkitkan interupsi secara software. Interupsi software dibangkitkan dengan menuliskan identitas (ID) interupsi ke bit-bit NTID (8 bit) di register STIR (0 – 239). Misalnya ketika 0x03 dimasukan ke register STIR, maka akan dibangkitkan interupsi dari IRQ3.

Register STIR

Register STIR hanya bisa diakses secara privileged, jika mode user (unprivileged) ingin mengakses register STIR, maka bit USERSETMPEND di register SCR (System Control Register) harus di-set terlebih dahulu. Tetapi untuk men-set bit ini dibutuhkan juga akses privileged.

Selain register-register di atas, register PRIMASK, FAULTMASK dan BASEPRI yang merupakan register khusus dari prosesor ARM Cortex-M3 juga bisa digunakan untuk mengendalikan interupsi. Sub-bab sebelumnya telah membahas register-register khusus ini secara singkat.

Register PRIMASK bisa digunakan untuk memblok semua interupsi dan eksepsi kecuali NMI dan Hard fault. Men-set bit PRIMASK (register PRIMASK hanya dipakai 1 bit) akan membuat prioritas interupsi menjadi 0, nilai prioritas tertinggi yang bisa diprogram. Sehingga interupsi atau eksepsi dengan prioritas 0 atau lebih akan diblok, kecuali NMI dan Hard fault yang mempunyai nilai prioritas interupsi -2 dan -1. Register PRIMASK berguna untuk memblok sementara interupsi-interupsi ketika sedang mengerjakan fungsi kritis yang tidak bisa diganggu oleh interupsi yang lain.

Register FAULTMASK pada dasarnya hampir sama dengan PRIMASK, bedanya FAULTMASK akan membuat prioritas interupsi menjadi -1, sehingga semua interupsi yang nilai prioritasnya sama atau lebih besar -1 akan diblok. Ini artinya semua interupsi, kecuali NMI akan diblok.

Register BASEPRI digunakan juga untuk memblok interupsi berdasarkan nilai prioritasnya, dengan BASEPRI nilai prioritas interupsi yang bisa diblok bisa diprogam memasukan nilai prioritas tersebut ke register BASEPRI.

PRIORITAS INTERUPSI

Dengan sistem interupsi bersarang ketika terjadi sebuah interupsi atau eksepsi, prosesor akan selalu membaca apakah prioritas interupsi bisa menunda atau mendahului (preempt) interupsi yang sedang dieksekusi. Di prosesor ARM Cortex-M3, interupsi dengan nilai prioritas lebih kecil akan mempunyai prioritas lebih tinggi dan sebaliknya. Prioritas ini ada yang dibuat tetap (fix) dan ada yang bisa diprogram. Prioritas interupsi yang tetap, adalah reset, NMI dan Hard fault. Reset adalah eksepsi tertinggi dengan nilai prioritas -3.

Prioritas interupsi ARM Cortex-M3 diatur melalui register IPR (32 bit) yang terdiri dari 4 register IP bila diakses sebagai register 8 bit, sehingga satu register IPR mengatur 4 prioritas interupsi. Dengan register prioritas 8 bit, ARM Cortex-M3 akan mempunyai 3 level prioritas interupsi (Reset, NMI dan Hard fault) dan 256 level prioritas interupsi yang dapat diprogram (8 bit). Bandingkan dengan mikrokontroler keluarga 8051 yang hanya mempunyai dua level priorotas interupsi (1 bit). Walaupun demikian setiap pabrik silikon yang memproduksi prosesor ARM Cortex-M3 akan menerapkan prioriotas interupsi yang berbeda-beda. Bisa menerapkan 8 level prioritas (3 bit), 16, 32 dan seterusnya. Level minimal adalah 8 level prioritas (3 bit). Lebih banyak level prioritas interupsi yang diterapkan, maka lebih banyak jumlah gerbang-gerbang digital yang harus dibuat di dalam core ARM Cortex-M3, artinya akan lebih banyak mengkonsumsi daya. Selain itu juga, akan berdampak ke harga jual prosesor.

ARM Cortex-M3 dengan level prioritas kurang dari 8 bit, akan menggunakan bit-bit MSB (Most Significant Bit) dari register IP dan mengabaikan bit-bit LSB (Least Significant Bit). Gambar di bawah menunjukan contoh implementasi prioritas interupsi dengan 3 bit. Oleh karena bit ke-4 sampai bit ke-0 tidak dipakai, dan akan selalu terbaca 0, maka level prioritas interupsi akan bernilai 0x00 (sebagai prioritas tertinggi), 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, dan 0xE0 (sebagai prioritas terendah).

Prioritas Interupsi dengan 3 Bit

Alasan kenapa menggunakan bit-bit MSB dari pada bit-bit LSB adalah untuk memudahkan mem-porting software dari satu prosesor Cortex-M3 ke prosesor Cortex-M3 yang lain. Dengan cara ini, sebuah software yang dikembangkan untuk Cortex-M3 dengan prioritas 4 bit bisa langsung dijalankan di prosesor Cortex-M3 dengan prioritas 3 bit. Jika yang digunakan bit-bit LSB, maka akan terjadi pembalikan prioritas interupsi ketika sebuah program dijalankan di prosesor yang mempunyai beda level interupsinya. Sebagai contoh prosesor dengan level interupsi 4 bit, IRQ0 mempunyai prioritas 0x09 dan IRQ1 mempunyai prioritas 0x07. Dari sini diketahui bahwa IRQ1 akan mempunyai prioritas lebih tinggi. Jika digunakan di prosesor dengan level interupsi 3 bit, dengan membuang bit ke-3, maka IRQ0 akan menjadi 0x01 dan IRQ1 akan tetap 0x07, tetapi IRQ0 sekarang menjadi lebih tinggi prioritasnya.

Level prioritas interupsi dibagi menjadi 2 bagian, yaitu level prioritas preempt  dan level subpriority. Level prioritas preempt menentukan apakah sebuah interupsi bisa mendahului atau menunda interupsi yang sekarang sedang dikerjakan oleh prosesor (interupsi bersarang), di mana level prioritas preempt yang lebih kecil akan mempunya nilai prioritas yang lebih besar. Sedangkan level subprioritas digunakan ketika ada 2 interupsi dengan level prioritas preempt yang sama terjadi secara bersamaan di mana interupsi dengan nilai sub-prioritas yang lebih kecil akan didahulukan.

Bit-bit prioritas preempt dan sub-prioritas diatur dan bisa dikelompokan ke dalam kelompok prioritas (priority grouping) melalui bit PRIGROUP di register AIRCR (Application Interrupt and Reset Control Register). Bit PRIGROUP ini terdiri dari 3 bit, bit ke-8 sampai bit ke-10, sehingga ARM Cortex-M3 mendukung sampai 8 level pengelompokan group prioritas (0 – 7). Hubungan antara level kelompok prioritas dengan level preempt dan sub-prioritas ditunjukan oleh gambar.

Register AIRCR
Kelompok Prioritas dab Register IP

Dari ganbar terlihat, walaupun ARM Cortex-M3 menggunakan level prioritas interupsi 8 bit, tetapi karena adanya kelompok prioritas, hanya bisa mendukung 128 level preempt, yaitu ketika bit kelompok prioritas (PRIGROUP) bernilai 0. Dan ketika kelompok prioritas bernilai 7, maka semua interupsi/eksepsi yang prioritasnya bisa diprogram akan berada di sub-prioritas yang sama, dan tidak ada interupsi yang bisa menunda atau mendahului interupsi yang sedang dikerjakan, karena tidak ada level preempt.

Jika sebuah prosesor ARM Cortex-M3 menggunakan level prioritas 3 bit, dan kelompok prioritas di set ke level 5, maka konfigurasi register IP akan seperti gambar 2.35. Dari tabel di atas, jika kelompok prioritas di level 5, maka prioritas preempt akan berada di bit ke-6 dan ke-7, sedangkan bit sub-prioritas akan berada di bit ke-0 sampai bit ke-5, namun karena hanya 3 bit yang dipakai, maka sub-prioritas hanya akan memakai bit ke-5. Sehingga prosesor akan mempunyai 4 level prioritas preempt (bit ke-6 dan bit ke-7) dan 2 level sub-prioritas (bit ke-5).

Kelompok Prioritas 7 dan Level Prioritas 3 bit

Contoh lain ketika sebuah prosesor menggunakan konfigurasi prioritas 8 bit dengan kelompok prioritas di level 0, maka prosesor akan bisa mendukung sampai dengan 128 level prioritas dan 2 level sub-prioritas.

Kelompok Prioritas dan Level Prioritas 8 bit

Secara sederhana aturan prioritas ARM Cortex-M3 adalah sebagai berikut:

  1. Ketika terjadi sebuah interupsi atau eksepsi, maka level prioritas preempt dari interupsi tersebut akan dibandingkan dengan prioritas preempt dari interupsi yang sedang dieksekusi, jika prioritasnya lebih tinggi, interupsi yang sedang dieksekusi akan ditunda dan prosesor akan melayani interupsi yang baru. Jika prioritasnya lebih rendah, interupsi yang baru tersebut akan ditunda.
  2. Jika terjadi 2 atau lebih interupsi dengan level preempt yang sama, maka prosesor akan melihat level sub-prioritas. Interupsi dengan level sub-prioritas lebih tinggi (nilai sub-prioritas lebih rendah) akan didahulukan.
  3. Jika level sub-prioritasnya sama, maka prosesor akan melihat nomor eksepsi/interupsi tersebut, nomor eksepsi lebih rendah akan didahulukan. IRQ0 akan mempunyai prioritas lebih tinggi dari IRQ1.

KARAKTERISTIK INTERUPSI

Selain mendukung interupsi bersarang dengan berbagai pengaturan prioritas, interupsi ARM Cortex-M3 dirancang agar bersifat deterministik, artinya waktu latency setiap terjadi interupsi adalah tetap dan bisa ditentukan. Sistem interupsi ARM7 dan ARM9, tidak bersifat deterministik, waktu yang diperlukan untuk menghentikan sebuah instruksi yang sedang dikerjakan ketika interupsi terjadi bervariasi. Pada beberapa aplikasi mungkin hal ini tidak akan bermasalah, tapi pada sistem yang membutuhkan real time bisa jadi masalah besar. Beberapa teknik untuk memperkecil waktu latency diterapkan di prosesor ARM Cortex-M3.

Proses Saat Terjadi dan Setelah Interupsi

Ketika terjadi interupsi atau eksepsi, prosesor akan memanggil fungsi layanan interupsi sesuai dengan alamat vektor dari interupsi yang bersangkutan. Alamat program yang sedang dieksekusi secara otomatis akan disimpan ke memori stack, sehingga program bisa kembali ke alamat tersebut setelah fungsi interupsi selesai dikerjakan. Di fungsi layanan interupsi pastinya akan menggunakan register-register yang juga sedang dipakai di program utama dan hal ini akan merusak jalannya program utama ketika interupsi telah selesai dan program kembali ke program utama. Oleh karena itu register-register tersebut harus disimpan dulu datanya ke memori stack. Setelah interupsi selesai, data tersebut diambil kembali dan disimpan ke register yang sesuai sehingga data di register akan tetap seperti ketika interupsi belum terjadi.

Oleh karena itu, fungsi layanan interupsi biasanya diawali dengan proses penyimpanan ke memori stack (push) dan diakhiri dengan proses pengambilan kembali data dari memori stack (pop). Hal ini tentu akan ada tambahan waktu sebelum fungsi layanan interupsi yang sebenarnya bisa dieksekusi dan juga tambahan waktu setelah fungsi interupsi selesai dikerjakan. Prosesor ARM Cortex-M3 mengatasi hal ini dengan menggunakan microcode sehingga proses penumpukan (stacking) atau penyimpanan data dan pengambilan kembali (unstacking) register-register berlangsung secara otomatis, tidak perlu dituliskan di program layanan interupsi. Microcode bisa dikatakan sebagai program yang ditanamkan ketika prosesor dipabrikasi, dan bisa dijalankan untuk kepentingan tertentu. Register-register yang disimpan di stack ini meliputi R0 – R3, R12, LR, PC dan PSR, dinamakan sebagai stack frame. Lokasi memori stack yang digunakan bisa stack proses (PSP) maupun stack utama (MSP) tergantung saat itu program sedang menggunakan yang mana.

Register-Register yang Disimpan ke Memori Stack

Ketika interupsi terjadi, microcode langsung melakukan penyimpanan register-register ke memori stack melalui bus data. Bersamaan dengan itu, alamat dari ISR yang bersangkutan dibaca melalui bus instruksi. Karena prosesor menggunakan arsitektur Harvard, maka kedua hal itu bisa dilakukan secara bersamaan. Sehingga proses penyimpanan dan pengambilan kembali data-data register hanya membutuhkan waktu 12 siklus.

Waktu Latency hanya 12 Siklus

Register-register yang disimpan oleh microcode mengacu kepada Procedure Call Standard for the ARM Architecture yang dikeluarkan oleh ARM Ltd. Menurut standar tersebut, register-register R0 – R3 adalah register-register yang digunakan untuk menyimpan parameter sebuah fungsi dalam bahasa C. Register R12 juga sering digunakan ketika sebuah fungsi dipanggil. Dengan disimpannya register-register tersebut, maka ISR aman untuk ditulis dalam bahasa C. Selain  itu, untuk kembali dari fungsi interupsi, ARM Cortex tidak memerlukan instruksi khusus. Tidak seperti mikrokontroler keluarga 8051 yang menggunakan instruksi RETI (Return from Interrupt), ARM Cortex menggunakan instruksi kembali seperti normalnya kembali dari sebuah fungsi yang dipanggil. Sehingga fungsi ISR prosesor ARM Cortex bisa selurhnya ditulis dalam bahasa C.

Tail-Chaining

Ketika sebuah interupsi terjadi sedangkan prosesor sedang melayani interupsi dengan prioritas yang sama atau lebih tinggi, maka interupsi tersebut akan ditunda. Begitu juga ketika terjadi 2 interupsi secara bersamaan, maka interupsi dengan prioritas lebih rendah akan ditunda dan prosesor akan mengerjakan interupsi dengan prioritas lebih tinggi. Setelah prosesor selesai melayani interupsi tersebut, sebelum microcode melakukan operasi pengambilan data dari memori stack (operasi pop), prosesor akan mengecek apakah saat itu ada interupsi yang tertunda atau tidak, jika ada maka prosesor tidak akan melakukan operasi pop, tetapi langsung mengambil alamat vektor interupsi tertunda tersebut dan mengerjakan fungsi ISRnya. Proses ini hanya membutuhkan 6 siklus. Teknik ini dinamakan dengan tail-chaining, suatu proses untuk mempercepat pelayanan interupsi.

Tail-Chaining

Jika terjadinya interupsi baru ketika prosesor sedang mengakhiri interupsi yang sekarang (operasi pop), maka prosesor bisa membatalkan operasi pop tersebut dan langsung mengambil alamat vektor tersebut. Tergantung sampai sejauh mana prosesor melakukan operasi pop, akan ada tambahan 1 siklus (jika operasi pop baru saja dimulai) sampai 12 siklus (jika operasi pop memang sudah selesai) ditambah 6 siklus proses pengambilan vektor interupsi, sebelum interupsi tersebut dikerjakan.

Tail-Chaining Saat Interupsi Berakhir

Late Arrival

Apabila saat ini prosesor sedang  mengeksekusi dan sedang proses penumpukan data ke memori stack kemudian terjadi interupsi dengan prioritas yang lebih tinggi, tentunya prosesor akan mendahulukan interupsi dengan prioritas lebih tinggi tersebut. Proses penumpukan tetap dilanjutkan, prosesor akan mengerjakan interupsi dengan prioritas lebih tinggi terlebih dahulu baru kemudian interupsi yang lebih rendah dengan proses tail-chaining.

IRQ1 terjadi saat proses push

SETING INTERUPSI

Interupsi dalam sistem embedded merupakan salah satu teknik agar sistem embedded mempunyai tanggapan yang lebih cepat atau real time terhadap sebuah masukan atau input agar segera bisa diproses. Cara lainnya adalah dengan polling, namun dengan cara ini prosesor harus bekerja lebih karena prosesor harus bertanya (poll) kepada semua input apakah input tersebut mempunyai data untuk diproses atau tidak. Respon pun akan lebih lambat, karena sebuah masukan yang membutuhkan pemrosesan data harus menunggu giliran untuk ditanya.

Dengan menggunakan interupsi, maka pada saat tidak ada permintaan dari sebuah input, maka prosesor bisa mengerjakan fungsi yang lain, atau malah dibuat di kondisi hemat daya (power down) terutama untuk sistem embedded yang menggunakan batere.

Ada beberapa tahapan sebelum interupsi bisa digunakan:

  1. Pengaturan memori stack
  2. Pengaturan tabel vektor
  3. Pengaturan prioritas interupsi
  4. Pengaktifkan interupsi dari periperal atau sistem eksepsi dari core Cortex-M3

Pengaturan Memori Stack

Seperti telah dijelaskan di artikel sebelumnya, ARM Cortex-M3 mempunyai 2 memori stack yaitu memori stack utama (MSP) dan memori stack proses (PSP). Untuk aplikasi-aplikasi sederhana, penggunaan hanya MSP mungkin sudah cukup. Jika aplikasi menggunakan RTOS, maka MSP dan PSP perlu digunakan agar data-data penting yang digunakan oleh kernel OS bisa dilindungi dari kemungkinan diubah oleh sebuah task. Tentu saja hal ini akan mememerlukan ukuran memori stack yang cukup besar.

Operasi stack ARM Cortex-M3 adalah mengurangi alamat memori, artinya setiap selesai penyimpanan data ke memori stack (push), alamat memori stack akan dikurangi (decending stack). Oleh karena itu, alamat awal memori stack biasanya ditempatkan di ujung atau alamat akhir dari RAM sehingga tidak tumpang tindih dengan data.

Setelah menentukan alamat awal memori stack, selanjutnya adalah menentukan besarnya memori stack. Besarnya memori stack tentunya tergantung dari aplikasi, ukuran terlalu besar tentunya akan membuat aplikasi boros memori, sedangkan ukuran memori stack terlalu kecil akan menyebabkan memori stack overflow dan bisa merusak data-data penting di memori utama. Pengaturan stack biasanya sudah dilakukan oleh IDE (Integrated Development Environment) melalui kode start up. Ketika akan mengubah pengaturan stack, maka dilakukan melalui kode start up ini.

Contoh Penggunaan Memori Stack

Pengaturan Tabel Vektor

Seperti dijelaskan sebelumnya, pada dasarnya tidak perlu untuk mengubah atau merelokasi tabel vektor. Tabel vektor dikodekan ke dalam memori flash atau ROM dan diperlukan relokasi saat program berjalan.

Salah satu contoh aplikasi yang membutuhkan relokasi tabel vektor adalah IAP, di mana memori flash dibagi menjadi 2 bagian, yaitu bagian bootloader dan bagian aplikasi. Bootloader ini adalah program yang digunakan untuk menerima program yang nantinya akan ditulis ke bagian aplikasi. Program aplikasilah yang harus merelokasi tabel vektornya.

Pengaturan Prioritas Interupsi

Setelah reset, semua interupsi yang prioritasnya bisa diprogram akan bernilai 0, artinya akan mempunyai prioritas yang sama. Pengubahan prioritas interupsi juga harus disesuaikan dengan aplikainya. Misalnya ketika sebuah fungsi tunda (delay) yang menggunakan interupsi timer Systick, jika fungsi ini akan digunakan di fungsi layanan sebuah interupsi, maka prioritas interupsi timer Systick harus dibuat lebih tinggi dibandingkan dengan prioritas interupsi yang memanggil fungsi delay tersebut.

Pengaktifan Interupsi

Pengaktifan sebuah interupsi dilakukan melalui register ISER, bit mana yang harus di-set tentunya tergantung interupsi apa saja yang akan diaktifkan. Bit-bit tersebut mengacu kepada kendali interupsi untuk masing-masing periperal. Dan tentunya mengacu kepada lembaran data (datasheet) dari masing-masing prosesor.

Semoga bermanfaat.

Visits: 1 Visits: 97928

Leave a Reply

Your email address will not be published. Required fields are marked *

Copyright © All rights reserved. | Newsphere by AF themes.