Blog Archive

Arduino Indonesia. Gambar tema oleh Storman. Diberdayakan oleh Blogger.

Supported by Electronics 3 in 1

1. Jasa pencetakan PCB single layer dengan harga paling murah.

(Metode Pembuatan dengan Transfer Toner)
>PCB design sendiri (siap cetak) : Rp.150,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

(Metode Sablon Full Masking dan Silk Screen minimal pemesanan 100 Pcs)
>PCB design sendiri (siap cetak) : Rp.200,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

2. Jasa perancangan, perakitan, dan pembuatan trainer pembelajaran elektronika untuk SMK dan Mahasiswa.

3. Jasa perancangan, perakitan, dan pembuatan berbagai macam kontroller, sensor, aktuator, dan tranduser.
>Design Rangkaian / Sistem Elektronika
>Design Rangkaian / Sistem Instrumentasi
>Design Rangkaian / Sistem Kendali
>Kerjasama Riset (data atau peralatan)
>Kerjasama Produksi Produk-Produk KIT Elektronika
>Produksi Instrumentasi Elektronika

4. Jasa Pembuatan Proyek, Tugas Akhir, Tugas Laboratorium, PKM, Karya Ilmiah, SKRIPSI, dll

Like My Facebook

Popular Posts

Senin, 18 Agustus 2025

Konsep Penyimpanan Data Sementara di RAM Raspberry Pi Pico

Raspberry Pi Pico adalah mikrokontroler berbasis RP2040 yang dilengkapi dengan ARM Cortex-M0+ dual-core, memori flash 2MB, dan RAM sebesar 264KB. Salah satu aspek penting dalam pengembangan proyek berbasis Pico adalah manajemen penyimpanan data sementara di RAM.  

RAM (Random Access Memory) berperan sebagai tempat penyimpanan data yang cepat dan bersifat volatile, artinya data akan hilang ketika daya dimatikan. Artikel ini akan membahas secara mendalam tentang konsep penyimpanan data sementara di RAM Raspberry Pi Pico, termasuk struktur memori, alokasi variabel, manajemen heap dan stack, serta teknik optimasi untuk penggunaan RAM yang efisien.  



Struktur Memori pada Raspberry Pi Pico

 

1. Flash Memory (2 MB)

- Berfungsi sebagai penyimpanan non-volatile, artinya data tetap tersimpan meskipun daya dimatikan.

- Di sinilah firmware (seperti MicroPython atau program C/C++) dan kode utama pengguna disimpan.

- Flash tidak cocok untuk operasi tulis-hapus terus-menerus karena umur siklusnya terbatas, sehingga biasanya digunakan hanya untuk program dan data statis.

2. SRAM (264 KB)

SRAM adalah memori volatile yang hilang saat perangkat dimatikan. Terbagi menjadi beberapa bagian:

- Bank 0 (128 KB)

    - Umumnya digunakan untuk eksekusi kode dan penyimpanan variabel data.

    - Karena langsung dapat diakses CPU, maka kecepatan aksesnya tinggi.

    - Cocok untuk menyimpan fungsi-fungsi utama program yang sering dipanggil.

- Bank 1 (128 KB)

    - Bisa digunakan untuk penyimpanan data tambahan, misalnya buffer besar, array, atau data sementara.

    - Membantu mencegah kelebihan beban di Bank 0.

    - Developer dapat mengatur alokasi manual agar distribusi memori lebih seimbang.

Catatan: Secara default, alokasi antara Bank 0 dan Bank 1 ditentukan oleh toolchain/linker, jadi pengaturan manual butuh pemahaman lebih lanjut tentang linker script.

- Scratch RAM (4 KB)

    - Memori kecil dengan akses super cepat.

    - Digunakan untuk operasi kritis, misalnya perhitungan intensif, penyimpanan variabel penting, atau data sementara yang butuh kecepatan tinggi.

    - Biasanya dipakai oleh hardware controller internal, tapi bisa dimanfaatkan programmer untuk optimasi.

3. Pentingnya Manajemen Memori

Karena Pico hanya punya 264 KB RAM, maka:

- Penggunaan variabel harus hemat.

- Hindari buffer besar yang tidak perlu.

- Waspadai stack overflow (jika fungsi terlalu banyak memakan variabel lokal besar).

- Hindari heap fragmentation dengan alokasi dinamis yang berlebihan.


Alokasi Variabel di RAM

 

Dalam pemrograman Raspberry Pi Pico menggunakan C/C++ atau MicroPython, variabel dapat disimpan di RAM dengan beberapa cara:  

1. Variabel Statis

Variabel yang dideklarasikan di luar fungsi atau dengan keyword static disimpan di RAM secara permanen selama program berjalan.  

Contoh (C/C++):

 

#include "pico/stdlib.h"


int global_var = 10; // Disimpan di RAM


int main() {

    static int local_static = 20; // Juga disimpan di RAM

    while (1) {

        // Program utama

    }

}

 

2. Variabel Dinamis (Heap Allocation)

Menggunakan fungsi seperti malloc() dan free() untuk alokasi memori dinamis. Namun, penggunaan berlebihan dapat menyebabkan fragmentasi heap.  

Contoh:

 

#include <stdlib.h>


int main() {

    int *dynamic_var = (int*)malloc(sizeof(int) * 10); // Alokasi di heap

    if (dynamic_var != NULL) {

        // Gunakan memori

        free(dynamic_var); // Bebaskan memori

    }

    return 0;

}

 

3. Variabel Otomatis (Stack Allocation)

Variabel lokal dalam fungsi disimpan di stack. Stack memiliki ukuran terbatas (~8KB default di Pico), sehingga variabel besar dapat menyebabkan stack overflow.  

Contoh:

 

void function() {

    int stack_var[1024]; // Array besar di stack (risiko overflow)

}

 

Manajemen Heap dan Stack di Raspberry Pi Pico

 

1. Pengaturan Ukuran Stack  

Ukuran stack dapat diatur melalui linker script (`pico_sdk.ld`) untuk menghindari overflow:  


/* Contoh penyesuaian ukuran stack */

_stack_size = 8192; /* 8KB stack */

 

Catatan: _stack_size = 8192; tergantung project setup. Tidak semua template Pico SDK punya variabel ini. Jadi lebih aman ditulis sebagai opsional.

2. Memantau Penggunaan RAM

Gunakan fungsi bawaan SDK untuk memeriksa penggunaan RAM:  

 

#include "pico/stdlib.h"

#include "pico/malloc.h"


void check_memory() {

    malloc_stats(); // tampilkan info heap ke stdout

}


3. Mengurangi Fragmentasi Heap

- Hindari alokasi/dealokasi memori yang terlalu sering.  

- Gunakan memory pool untuk alokasi blok tetap.  

- Pertimbangkan static allocation jika memungkinkan.  

 

Teknik Optimasi RAM di Raspberry Pi Pico

 

1. Menggunakan const

Variabel const disimpan di flash, bukan RAM. Di Raspberry Pi Pico, compiler secara otomatis mengoptimasi penyimpanan const.  

Contoh:  


const uint8_t large_data[] = {0x01, 0x02, 0x03}; // disimpan di flash, bukan RAM

 

2. Meminimalkan Penggunaan Variabel Global  

Variabel global tetap memakan RAM, gunakan hanya jika diperlukan.  

3. Menggunakan Union dan Bit Fields

Menghemat RAM dengan menyimpan data secara efisien:  


typedef union {

    struct {

        uint8_t flag1 : 1;

        uint8_t flag2 : 1;

    } bits;

    uint8_t byte;

} flags_t;

 

4. Memanfaatkan Scratch RAM

Scratch RAM (4KB) dapat digunakan untuk operasi berkecepatan tinggi:  


#include "hardware/sync.h"


void use_scratch_ram() {

    uint32_t *scratch = (uint32_t*)0x20040000; // Alamat Scratch RAM

    *scratch = 0x12345678;

}

 

Catatan: Akses langsung bisa berisiko, karena scratch RAM kadang dipakai oleh hardware tertentu. Jadi lebih baik digunakan hanya untuk eksperimen/optimasi khusus. 

 

Studi Kasus: Buffer Data Sensor di RAM

 

Misalkan Anda ingin menyimpan data sensor sementara sebelum dikirim ke PC:  

Solusi:

- Gunakan circular buffer untuk menghindari alokasi dinamis.  

- Simpan data dalam array statis.  

Implementasi:

 

int read_sensor_data() {

    static int read_index = 0;

    if (read_index < buffer_index) {

        return sensor_buffer[read_index++];

    }

    return -1; // buffer kosong

}


Kesalahan Umum dalam Pengelolaan RAM

 

1. Stack Overflow

- Stack digunakan untuk menyimpan variabel lokal, alamat fungsi, dan parameter.

- Jika variabel lokal terlalu besar (misalnya array besar di dalam fungsi), stack bisa penuh → menyebabkan stack overflow.

- Di Raspberry Pi Pico dengan RAM terbatas, hal ini bisa membuat program crash.

Contoh yang salah:


void fungsi() {

    int data[100000]; // terlalu besar di stack

}

Solusi: Gunakan heap (dinamis) atau optimalkan ukuran variabel.

2. Heap Fragmentation

- Heap dipakai untuk alokasi memori dinamis (malloc, new).

- Jika sering alokasi dan dealokasi kecil-kecilan, heap bisa terfragmentasi (terbagi-bagi, meskipun total ruang masih ada, tapi tidak cukup untuk alokasi besar).

- Program akan gagal mengalokasikan memori meski RAM belum penuh.

Solusi: Alokasikan memori dalam blok besar sekali jalan, atau gunakan memory pool.

3. Memory Leak

- Terjadi ketika memori sudah dialokasikan (malloc) tapi tidak dibebaskan (free).

- Lama-lama RAM habis meskipun program masih jalan.

Contoh:


char* buffer = malloc(100);

// lupa free(buffer);


Solusi: Selalu free() setelah selesai dipakai. Gunakan analisis tool (misalnya valgrind, jika di PC).

4. Penggunaan RAM Berlebihan

- Terjadi jika ada banyak variabel global besar yang sebenarnya tidak perlu.

- Variabel global selalu menempati memori selama program berjalan, tidak bisa dilepas.

Contoh:


int data_besar[10000]; // global, selalu ada di RAM


Solusi: Gunakan variabel lokal, alokasi dinamis, atau optimalkan ukuran data.

Catatan: MicroPython tidak memungkinkan malloc/free manual (lebih banyak diatur otomatis dengan garbage collector).   

 

Baca juga: Penjelasan Penyimpanan Permanen di Flash Memory Raspberry Pi Pico 









Siap Untuk Membuat Proyek Impianmu Menjadi Kenyataan?

Klik di sini untuk chat langsung via WhatsApp dan dapatkan dukungan langsung dari tim ahli kami! 

 

0 on: "Konsep Penyimpanan Data Sementara di RAM Raspberry Pi Pico"