[STM32 L1 Discovery Board] [Semaphore] Idle task creation fails

sunnyazoi wrote on Monday, February 15, 2016:

Hi,

I am using the STM32 L1 Discovery Board (256KB).

I am trying to create two semaphores using the below code:

  osSemaphoreDef(SEM1);
  osSemaphoreDef(SEM2);

  /* Create the semaphore used by the two threads */
//  osSemaphore = osSemaphoreCreate(osSemaphore(SEM) , 1);
  osSemaphoreProducer = osSemaphoreCreate(osSemaphore(SEM1) , 1);
  osSemaphoreConsumer = osSemaphoreCreate(osSemaphore(SEM2) , 1);

  osThreadDef(SEM1_Thread1, Sem_Thread1, osPriorityLow, 0, semtstSTACK_SIZE);
  osThreadDef(SEM2_Thread2, Sem_Thread2, osPriorityIdle, 0, semtstSTACK_SIZE);

  /* Start thread */
  semThreadHandle1 = osThreadCreate(osThread(SEM1_Thread1), NULL);
  semThreadHandle2 = osThreadCreate(osThread(SEM2_Thread2), NULL);

  /* Start scheduler */
  osKernelStart();
  
  /* We should never get here as control is now taken by the scheduler */
  for (;;);

But I am reaching the infinite for (;:wink: loop.

I debugged and found that the code is not able to create the IDLE Thread.

Below is the trace for the failure:

osKernelStart()
    vTaskStartScheduler()
        xTaskCreate( prvIdleTask, "IDLE", ...)
            xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;

Then I created just one semaphore and the code works perfectly fine.

So is there any stack / heap limitation for creating 2 or more semaphores ?

If there is any solution, then please do let me know.

Awaiting your reply.

Thanks,
Sunny

rtel wrote on Monday, February 15, 2016:

You need to increase the configTOTAL_HEAP_SIZE value. See http://www.freertos.org/a00111.html