Penempatan heap FreeRTOS di bagian CCMRAM untuk STM32

Saat mengembangkan satu perangkat berdasarkan STM32F407, saya menghadapi masalah kekurangan RAM. Tujuan dari perangkat itu sendiri tidak penting, tetapi penting bahwa kode asli ditulis untuk sistem desktop dan hanya perlu di-porting ke mikrokontroler yang menjalankan FreeRTOS. Dan karena kode sumber ditulis dalam C ++ dan pertanyaan tentang menghemat RAM bahkan tidak diangkat, masalah terkait muncul.



Saya benar-benar tidak ingin terlibat dalam pengoptimalan kode, pada saat yang sama menambah masalah dalam menemukan bug baru. Oleh karena itu, perlu diingat bahwa versi mikrokontroler ini memiliki segmen RAM 64K tambahan (CCM SRAM) di papan, yang belum digunakan dengan cara apa pun sekarang. Eureka - ini dia, solusinya!



Namun sayangnya, semuanya ternyata tidak sesederhana itu.





Hasil pencarian untuk solusi siap pakai



Dokumentasi resmi untuk CCMRAM memberikan contoh untuk menempatkan kode yang dapat dieksekusi, tumpukan, atau variabel individu di dalamnya.



Pencarian di forum menghasilkan beberapa link ke berbagai cara untuk menggunakan CCMRAM, tetapi sayangnya, semuanya adalah variasi yang berbeda dari cara-cara yang dijelaskan dalam dokumentasi resmi. Dan semuanya perlu menyekop kode sumber untuk menambahkan atribut saat mendeklarasikan setiap fungsi atau variabel.



Untuk GCC, dalam kasus saya, sesuatu seperti ini:



__attribute__((section(".ccmram")));
      
      





Selain itu, beberapa variabel memiliki nilai default, yang memerlukan modifikasi bootloader sehingga saat firmware dimulai, variabel tersebut disalin ke area terpisah untuk variabel yang diinisialisasi atau nol.



Nah, kesulitan terakhir adalah keterbatasan CCMRAM itu sendiri. Itu tergantung pada bus terpisah yang tidak memiliki akses DMA, dan direncanakan untuk menggunakan akses memori langsung dengan sangat aktif.



Dengan kata lain, memecahkan satu masalah, seseorang dapat secara tidak sengaja menambahkan banyak masalah lainnya, dan menggali debugging untuk menemukan bug yang diperkenalkan.



Untungnya, kami berhasil menemukan solusi sederhana dari pihak FreeRTOS.



Ukuran heap kurang dari ukuran segmen RAM CCM dan keputusannya jelas - untuk memindahkan heap ke partisi ini.



Dan kami berhasil melakukan ini dengan sedikit perubahan kode.



  1. Bagian baru ditambahkan ke file ld (dalam kasus saya STM32F407VGTX_FLASH.ld):



    .ccmram :
     {
       . = ALIGN(8);
       . = . + _Min_Heap_Size;
       . = ALIGN(8);
     } >CCMRAM
          
          



  2. Di bagian "._user_heap_stack" sebuah baris dikomentari atau dihapus



    /*    . = . + _Min_Heap_Size; */
          
          





    Baris dengan _Min_Heap_Size diperlukan agar linker mengeluarkan peringatan jika ukuran RAM tidak mencukupi.
  3. Variabel tunggal ditambahkan ke badan program.



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



  4. Dan saat membangun sebuah proyek, definisi preprocessor ditambahkan



    configAPPLICATION_ALLOCATED_HEAP=1
          
          





Hasilnya - sekumpulan FreeRTOS di CCM SRAM dengan jumlah pengeditan minimum di kode sumbernya!



All Articles