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

Dalam contoh program blink dengan FreeRTOS terdapat 4 buah task yang masing-masing task hanya membuat LED berkedip dengan durasi berbeda-beda. Pengaturan FreeRTOS menggunakan pengaturan default dari STM32CubeMX, menggunakan alokasi stack secara dinamik dengan alokasi heap sebesar 15360 byte dengan skema heap_4 dan masing-masing task diberi stack 128 Word. Ketika di-compile terlihat ada pemakaian RAM sebesar 16.97 KB (13.26%). Sesuai dengan manajemen memori di FreeRTOS, ketika menggunakan alokasi dinamik dengan heap_4 maka ketika alokasi heap itu akan diperlakukan sebagai penggunaan memori oleh compiler, walaupun memori heap tersebut tidak semuanya dipakai.

Pemakaian Memori di Program Blink FreeRTOS
pemakaian Heap

Perhatikan build analyzer dari STM32CubeIDE, STM32F407 (MCU yang dipakai di contoh program) mempunyai 2 region RAM: RAM (128 KB) dan CCMRAM (64 KB). Secara default, compiler akan menempatkan semua penggunaan variable heap/stack, termasuk heap FreeRTOS, di area RAM. Dengan mengubah file linker dan menambah atribut region RAM di deklarasi variabel, maka kita bisa menggunakan region CCMRAM untuk menempatkan alokasi memori heap untuk proyek FreeRTOS kita.

Buat Seksi CCMRAM di File Linker

Region CCMRAM sudah didefinisikan di fle linker, makanya bisa keluar di build analyzernya IDE, namun belum ada section yang bisa mengarahkan agar bisa menggunakan region ini. Oleh karena itu, langkah pertama yang harus dilakukan adalah membuat seksi untuk region CCMRAM.

/* Memories definition */
MEMORY
{
  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 1024K
}

File linker adalah file yang ber-ekstensi .ld (STM32F407VGTX_FLASH.ld). Buka file tersebut, kemudian tambahkan deklarasi berikut, misal di akghhir file atau bisa di mana saja

 _siccmram = LOADADDR(.ccmram);

  /* CCM-RAM section
  *
  * IMPORTANT NOTE!
  * If initialized variables will be placed in this section,
  * the startup code needs to be modified to copy the init-values.
  */
  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;       /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)

    . = ALIGN(4);
    _eccmram = .;       /* create a global symbol at ccmram end */
  } >CCMRAM AT> FLASH

Sekarang kita punya seksi dengan nama .ccmram untuk menempatkan memori heap kita ke region CCMRAM.

Ubah Konfigurasi FreeRTOS

Selanjutnya adalah mengubah konfigurasi FreeRTOS. Deklarasi memori tergantung dari alokasi dan skema memori heap yang digunakan, dalam contoh program ini kita menggunakan skema heap_4, sehingga deklarasi heap ada di file heap_4.c. Memori heap dideklarasikan sebagai aray 8 bit dengan nama uheap dan ukurannya sesuai dengan variabel configTOTAL_HEAP_SIZE, dalam hal ini 15KB. Dekalarasi variabel ini bisa sebagai extern atau sebagai statik, tergantung dari configAPPLICATION_ALLOCATED_HEAP. Extern artinya kita harus mendeklarasikan variabel ucHeap sebagai variabel global, jadi kita harus mendeklarasikan kembali variabel tersebut.

/* Allocate the memory for the heap. */
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
	/* The application writer has already defined the array used for the RTOS
	heap - probably so it can be placed in a special segment or address. */
	extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
	static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif /* configAPPLICATION_ALLOCATED_HEAP */

Pertama tentu saja kita harus kita harus mendefinsikan agar configAPPLICATION_ALLOCATED_HEAP bernilai 1. STM32CubeMX tidak menyediakan opsi untuk mengubah parameter ini, maka kita harus mendefinisikannya secara manual dengan menambahkan deklarasi ini di file FreeRTOSConfig.h

/* USER CODE BEGIN Defines */
/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
#define configAPPLICATION_ALLOCATED_HEAP        1
/* USER CODE END Defines */

Kemudian kita tambahkan untuk deklarasi ucHeap dengan tambahan atribut. Ini bisa dilakukan di file mana saja, misal di file FreeRTOS.c

 __attribute__((section(".ccmram"))) uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] ;

Sekarang compile kembali proyek tersebut, maka alokasi memori heap sekarang sudah menggunakan region CCMRAM (15 KB)

Alokasi Memori Heap di CCMRAM

Sebenarnya bisa juga kita secara langsung mengubah secara langsung deklarasi static di file heap4.c dengan tambahan atribut region. Namun direkomendasikan untuk tidak mengubah file-file tertentu yang dibuat oleh STM32CubeMX.

Selamat mencoba, semoga bermanfaat.

Leave a Reply

Your email address will not be published.