Back to Blog

STM32 - FreeRTOS Manuel Olarak Entegre Etmek: Adım Adım Rehber

STM32 ile geliştirme yapılırken en çok kullanılan STM32CubeIDE üzerinde freeRTOS ilk proje oluşturması sırasında entegre edilebiliyor ancak ek soyutlama fonksiyonları ile kullanılabiliyor. İnternette ise yeni bir projeye manuel olarak freeRTOS ekleme kaynağı pek olmadığı için kendi notlarımı çıkardım.

May 15, 2026 Updated: June 17, 2026 5 min read
STM32 - FreeRTOS Manuel Olarak Entegre Etmek: Adım Adım Rehber

FreeRTOS, STM32 gibi mikrodenetleyicilerde gerçek zamanlı görev yönetimi için en yaygın kullanılan RTOS’lardandır. Genellikle STM32CubeMX veya HAL kütüphaneleri ile entegre edilen FreeRTOS, bazı durumlarda manuel olarak projeye eklenmek istenebilir. Bende konuları yazarak daha iyi öğrendiğim için hemde başkalarına yardımcı olmak için anlatmaya karar verdim. Bu yazıda, adım adım FreeRTOS’un STM32 projene nasıl manuel olarak eklenebileceğini anlatacağım.


1. Proje Oluşturma ve Temel Ayarlar

FreeRTOS u manuel entegre etmek için önce STM32 projesinin temel ayarlarının yapılması gerekiyor. Proje STM32CubeMX ile oluşturulduktan sonra şu ayarlar yapılır;

  1. Timebase Source Ayarı: System Core > SYS menüsünden Timebase Source değerini SysTick yerine TIMx olarak seçilmesi önerilir. Sebebi ise FreeRTOS, zamanlayıcı olarak SysTick kullanır ve HAL_Delay(HAL kütüphanesi) de SysTick kullanır. TIMx seçimi ile HAL artık Timer kullanacak ve FreeRTOS ile HAL arasında olası bir çakışma yaşanması önlenecek.
  2. NVIC Priority Group: NVIC > Priorty Group altında “4 bits for pre-emption priorty, 0 bits for subpriority” seçeneğinin seçilmesi gerek. Bu ayar FreeRTOS un interrupt önceliklerini doğru şekilde anlayabilmesini sağlar.


2. FreeRTOS Yazılımının İndirilmesi

FreeRTOS un en güncel sürümünü https://www.freertos.org/ üzerinden indirilir.


3. Proje Klasör Yapısının Oluşturulması

  1. Proje ana klasörü altında ThirdParty adında bir klasör oluştur
  2. ThirdParty altında FreeRTOS adında bir klasör oluştur
  3. İndirilen FreeRTOS dosyalarından bazıları bu klasör altına kopyalanır: Bu dosyalar, indirilen FreeRTOS > FreeRTOS-Kernel altında bulunuyor(değişmiş olabilir). Buradaki tüm .c dosyaları, LISENCE dosyası, include ve portable klasörleri ThirdParty > FreeRTOS altına kopyalanır.


4. Kullanılmayan Dosyaları Temizleme

  1. Projedeki portable klasörü altındaki dosyalardan yalnızca GCC, MemMang ve README dosyaları hariç diğer dosyalar silinir
  2. GCC klasörü içindeki proje kartının mimarisini temsil etmeyen tüm klasörler silinir, geriye sadece kartın mimarinin adı geçen klasör bırakılır.
  3. MemMang klasörü altındaki heap dosyalarından yalnızca heap_4.c bırakılır. Diğer heap dosyaları silinir. Her bir heap dosyasının kullanım amacı farklıdır fakat başlangıç aşamaları için en uygun olan heap_4.c dosyasıdır.


5. Include Path ve Derleme Ayarları

  1. ThirdParty ve FreeRTOS altındaki .h dosyalarının derleme sırasında görünmesi için klasörlere sağ tıklandıktan sonra Properties > C/C++ General > Exclude resources from build seçeneği unchecked yapılması gerekir.
  2. portable > GCC altındaki ARMCM4(benim kartım stm32f411 olduğu için dosyanın ismi böyle , sende farklı olabilir) klasörü ve include klasörü , projeye sağ tıklandıktan sonra Properties > C/C++ Build > Settings > Include Paths seçilerek bu menüden bu klasörlerin path’leri listeye eklenir.


6. Hafıza Çakışmalarını Önleme

  1. Ana proje altındaki src > sysmem.c dosyasına sağ tıklanarak Properties > Exclude resources from build seçeneği checked yapılır. Bu sayede FreeRTOS un heap/memory/free mekanizması kullanılması sağlanır, ve standart HAL memory fonksiyonları devre dışı bırakılarak çakışmalar önlenir.


7. FreeRTOSConfig.h Dosyasının Eklenmesi

  1. ThirdParty > FreeRTOS altında yeni bir FreeRTOSConfig.h dosyası oluşturulur. Bu dosyanın içeriği ise projeye ve karta göre değişkenlik gösterebilmektedir, bu nedenle dikkat edilmesi gerekir. Dosya içeriği FreeRTOS web sitesindeki template kod örneğinden alınabilmektedir fakat ben direkt internetten kullandığım kart için başkaları tarafından düzenlenmiş kodları aratarak dosyama ekledim.
  2. Bu dosya içindeki her bir ayar FreeRTOS web sitesinde ayrıca ne için kullanıldığı da anlatılıyor.
  3. Ek olarak bu dosya içinde SystemCoreClock değişkeni kullanılıyorsa bu değişkenin tanımlandığı dosya da kodların başında include edilmelidir.
  4. Ek olarak birde bu .h dosyasının build sırasında görülebilmesi için FreeRTOS klasörü de proje ayarlarındaki path’e eklenmelidir.


8. Interrupt Handler Çakışmalarının Çözülmesi

  1. FreeRTOS kendi SCV, PendSV ve SysTick handler’larını kullanır. Bu nedenle proje oluşturulması sırasında eklenen stm32f4xx_it.c dosyası içindeki handler’lar ile aynı isimlerde olduğundan çakışma yaşanır. Bunu engellemek için stm32f4xx_it.c dosyası içindeki SVC_Handler, PendSV_Handler ve SysTick_Handler fonksiyonları yorum satırı haline getirilir.


Örnek stm32f411 Nucleo kartı için FreeRTOSConfig.h ;

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 *
 * See http://www.freertos.org/a00110.html.
 *----------------------------------------------------------*/

/* Ensure stdint is only used by the compiler, and not the assembler. */
#ifdef __ICCARM__
#include <stdint.h>
#endif

#include "system_stm32f4xx.h"

#define configSUPPORT_STATIC_ALLOCATION 1

#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK         1
#define configUSE_TICK_HOOK         0//1
#define configCPU_CLOCK_HZ         ( SystemCoreClock )
#define configTICK_RATE_HZ         ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES        ( 5 )
#define configMINIMAL_STACK_SIZE      ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE       ( ( size_t ) ( 75 * 1024 ) )
#define configMAX_TASK_NAME_LEN       ( 10 )
#define configUSE_TRACE_FACILITY      1
#define configUSE_16_BIT_TICKS       0
#define configIDLE_SHOULD_YIELD       1
#define configUSE_MUTEXES         1
#define configQUEUE_REGISTRY_SIZE      8
#define configCHECK_FOR_STACK_OVERFLOW    0//2
#define configUSE_RECURSIVE_MUTEXES     1
#define configUSE_MALLOC_FAILED_HOOK    1
#define configUSE_APPLICATION_TASK_TAG    0
#define configUSE_COUNTING_SEMAPHORES    1
#define configGENERATE_RUN_TIME_STATS    0

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES   0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Software timer definitions. */
#define configUSE_TIMERS    1
#define configTIMER_TASK_PRIORITY  ( 2 )
#define configTIMER_QUEUE_LENGTH  10
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )

/* Set the following definitions to 1 to include the API function, or zero
   to exclude the API function. */
#define INCLUDE_vTaskPrioritySet  1
#define INCLUDE_uxTaskPriorityGet  1
#define INCLUDE_vTaskDelete    1
#define INCLUDE_vTaskCleanUpResources 1
#define INCLUDE_vTaskSuspend   1
#define INCLUDE_vTaskDelayUntil   1
#define INCLUDE_vTaskDelay    1

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS         __NVIC_PRIO_BITS
#else
#define configPRIO_BITS         4        /* 15 priority levels */
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
   function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   0xf

/* The highest interrupt priority that can be used by any interrupt service
   routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
   INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
   PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
   to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY   ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
   See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY  ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/* Normal assert() semantics without relying on the provision of an assert.h
   header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
   standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */


Bu aşamadan sonra herhangi bir hata kalmaması gerekiyor. Eğer hata yinede varsa path eklenmemesi, FreeRTOSConfig.h dosyasının eksik kalması veya yanlış dosyaların eklenmesi olabilir.

Ek olarak bu anlattığım kurulum stm32 serileri ve HAL kütüphanesi olan projeler için geçerlidir. Farklı kütüphaneler veya kartlar için bu adımlar geçerli değildir fakat onlarda da buna benzer bir kurulum olacaktır.

Related Posts