I am having an issue with a project where the scheduler wont call tasks or the tasks are always in blocking state. Below is code and information. I am trying to learn RTOS and can’t figure out the issue. I am using FreeRTOS 10.1. Also if I remove all of the semaphore code the project works as desired and all the LED blink of and on. It only fails with the semaphore code added.
This project is being used on a STM32F407 Discovery board.
main.c
~~~
include “stm32f4xx_hal.h” // Keil::Device:STM32Cube HAL:Common
include “FreeRTOS.h” // ARM.FreeRTOS::RTOS:Core
include “task.h” // FreeRTOS task header
include “leds.h” // LED control header file
include “semphr.h” // ARM.FreeRTOS::RTOS:Core
xSemaphoreHandle gatekeeper = 0;
void vGreenLedControlTask(void *pvParameters);
void vRedLedControlTask(void *pvParameters);
void vBlueLedControlTask(void *pvParameters);
void vOrangeLedControlTask(void *pvParameters);
int main()
{
printf(“starting Main(0)n”);
printf(“initialize Ledsn”);
LEDs_Init();
printf(“Creante Queue Handlen”);
gatekeeper = xSemaphoreCreateMutex();
printf(“Creating Tasksn”);
xTaskCreate(vBlueLedControlTask,
"Blue LED Controller",
1024,
NULL,
1,
NULL);
xTaskCreate(vRedLedControlTask,
"Red LED Controller",
1024,
NULL,
2,
NULL);
xTaskCreate(vOrangeLedControlTask,
“Orange LED Controller”,
1024,
NULL,
3,
NULL);
xTaskCreate(vGreenLedControlTask,
“Green LED Controller”,
1024,
NULL,
4,
NULL);
printf(“Starting Task Schedulern”);
vTaskStartScheduler();
printf(“Task Scheduler startedn”);
while(1){}
}
void vGreenLedControlTask(void *pvParameters)
{
printf(“Entering Greenn”);
while(1)
{
if(xSemaphoreTake(gatekeeper, 2500))
{
GREEN_toggle();
xSemaphoreGive(gatekeeper);
vTaskDelay(500);
}
else{
printf(“Green did not get the semaphoren”);
}
}
}
void vBlueLedControlTask(void *pvParameters)
{
printf(“Entering Bluen”);
while(1)
{
if(xSemaphoreTake(gatekeeper, 2500))
{
BLUE_toggle();
xSemaphoreGive(gatekeeper);
vTaskDelay(2000);
}
else{
printf(“Blue did not receive semaphoren”);
}
}
}
void vRedLedControlTask(void *pvParameters)
{
while(1)
{
printf(“Entering Redn”);
if(xSemaphoreTake(gatekeeper, 2500))
{
RED_toggle();
xSemaphoreGive(gatekeeper);
vTaskDelay(1500);
}
else{
printf(“Red did not get the semaphoren”);
}
}
}
void vOrangeLedControlTask(void *pvParameters)
{
printf(“Entering Orangen”);
while(1)
{
if(xSemaphoreTake(gatekeeper, 2500))
{
ORANGE_toggle();
xSemaphoreGive(gatekeeper);
vTaskDelay(1000);
}
else{
printf(“Orange did not get the semaphoren”);
}
}
}
~~~
FreeRTOSConfig.h
~~~
ifndef FREERTOSCONFIGH
define FREERTOSCONFIGH
/
———————————————————–
* 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.
*———————————————————-/
include <stdint.h>
extern uint32_t SystemCoreClock;
define configCPUCLOCKHZ (SystemCoreClock)
define configTICKRATEHZ ((TickType_t)1000)
define configTOTALHEAPSIZE ((size_t)(4096))
define configMINIMALSTACKSIZE ((unsigned short)130)
define configCHECKFORSTACK_OVERFLOW 0
define configMAX_PRIORITIES (5)
define configUSE_PREEMPTION 1
define configIDLESHOULDYIELD 1
define configMAXTASKNAME_LEN (10)
/* Software timer definitions. */
define configUSE_TIMERS 1
define configTIMERTASKPRIORITY (2)
define configTIMERQUEUELENGTH 5
define configTIMERTASKSTACKDEPTH (configMINIMALSTACK_SIZE * 2)
define configUSE_MUTEXES 1
define configUSERECURSIVEMUTEXES 1
define configUSECOUNTINGSEMAPHORES 1
define configUSEQUEUESETS 1
define configUSEIDLEHOOK 0
define configUSETICKHOOK 0
define configUSEMALLOCFAILED_HOOK 0
define configUSE16BIT_TICKS 0
/* 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_vTaskSuspend 1
define INCLUDE_vTaskDelayUntil 1
define INCLUDE_vTaskDelay 1
define INCLUDE_eTaskGetState 1
/* Cortex-M specific definitions. */
ifdef __NVICPRIOBITS
/* __BVIC
PRIOBITS will be specified when CMSIS is being used. */
#define configPRIO_BITS __NVIC_PRIO_BITS
else
/* 15 priority levels */
#define configPRIO_BITS 4
endif
/* The lowest interrupt priority that can be used in a call to a “set priority”
function. */
define configLIBRARYLOWESTINTERRUPT_PRIORITY 0xff
/* 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 configLIBRARYMAXSYSCALLINTERRUPTPRIORITY 10
/* 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 configKERNELINTERRUPTPRIORITY (configLIBRARYLOWESTINTERRUPTPRIORITY << (8 – configPRIOBITS))
/* !!!! configMAX
SYSCALLINTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
define configMAXSYSCALLINTERRUPTPRIORITY (configLIBRARYMAXSYSCALLINTERRUPTPRIORITY << (8 – configPRIOBITS))
/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
/* Map the FreeRTOS port interrupt handlers to their CMSIS standard names. */
define xPortPendSVHandler PendSV_Handler
define vPortSVCHandler SVC_Handler
define xPortSysTickHandler SysTick_Handler
/* Include debug event definitions */
include “freertos_evr.h”
endif /* FREERTOSCONFIGH */
~~~
Using Keil 5.25 the printf Debug viewer shows that the scheduler is started but no tasks ever execute.
from debug window:
starting Main() initialize Leds Create Semaphore Handle Creating Tasks Starting Task Scheduler
Please let me know what I am doing wrong.