Freertos kernal

hi all,
I am working on first time on freertos and stm32G series mcu.

so first i run two task which sends string on serial terminal the bellow are my code.

status =  xTaskCreate(Task1_handler, "task-1", 200, "hello from task 1", 2, &task1_handle);

configASSERT(status == pdPASS);

status =  xTaskCreate(Task2_handler, "task-2", 200, "hello from task 2", 2, &task2_handle);

 configASSERT(status == pdPASS);

 vTaskStartScheduler();

bellow are my freertos config file

/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined (__ICCARM__) || defined(__GNUC__) || defined(__CC_ARM)
	#include <stdint.h>
	extern uint32_t SystemCoreClock;
#endif

#define configUSE_PREEMPTION			1
#define	configUSE_TIME_SLICING			0
#define configUSE_IDLE_HOOK				0
#define configUSE_TICK_HOOK				0
#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 ) ( 30 * 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
#define configUSE_RECURSIVE_MUTEXES		1
#define configUSE_MALLOC_FAILED_HOOK	0
#define configUSE_APPLICATION_TASK_TAG	0
#define configUSE_COUNTING_SEMAPHORES	1
#define configGENERATE_RUN_TIME_STATS	0
#define	configSUPPORT_DYNAMIC_ALLOCATION  1


/* 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 */

my code is run only first task on serial monitor

Try changing this to 1:

define	configUSE_TIME_SLICING			1

hi Gaurav ,
I tried with your suggestion but it still execute only one task.

if i my code in debug then it stuck in following function on
configASSERT( uxCriticalNesting == ~0UL ); function.

static void prvTaskExitError( void )
{
volatile uint32_t ulDummy = 0;

/* A function that implements a task must not exit or attempt to return to
 * its caller as there is nothing to return to.  If a task wants to exit it
 * should instead call vTaskDelete( NULL ).
 *
 * Artificially force an assert() to be triggered if configASSERT() is
 * defined, then stop here so application writers can catch the error. */
configASSERT( uxCriticalNesting == ~0UL );
portDISABLE_INTERRUPTS();

while( ulDummy == 0 )
{
    /* This file calls prvTaskExitError() after the scheduler has been
     * started to remove a compiler warning about the function being defined
     * but never called.  ulDummy is used purely to quieten other warnings
     * about code appearing after this function is called - making ulDummy
     * volatile makes the compiler think the function could return and
     * therefore not output an 'unreachable code' warning for code that appears
     * after it. */
}

}

Which says, if you read the comment, that some task returned to its caller, which isn’t what they are supposed to do. They should instead, just delete themselves and thus die, or loop forever.

if i delete it task using vtaskdelete the task is run but it didn’t run continuously i.e one after another it only runs ones and agin goes into prvTaskExitError.

i though the scheduler not run the task continuously.is that some missing from my side ?? just like timer configuration which done switching of task.

Publish your task code. I suspect that it does not run an infinite loop as a task normally does.

static void Task1_handler(void *parameters)
{
	
	HAL_UART_Transmit(D_UART,(uint8_t*)"i am task1",strlen("i am task1"),10);
	vTaskDelay(200);

}

static void Task2_handler(void *parameters)
{
	
	HAL_UART_Transmit(D_UART,(uint8_t*) "i am task2",strlen("i am task2"),10);
	vTaskDelay(200);


}

Above is my task code
I didnt understand that why task not run infinite loop
above code only runs one mens
that only print
i am task 1
i am task 2

both above task not run continuously.

Update your task definitions to the following -

static void Task1_handler(void *parameters)
{
	for( ;; )
	{
		HAL_UART_Transmit(D_UART,(uint8_t*)"i am task1",strlen("i am task1"),10);
		vTaskDelay(pdMS_TO_TICKS(200));
	}
}

static void Task2_handler(void *parameters)
{
	for( ;; )
	{
		HAL_UART_Transmit(D_UART,(uint8_t*) "i am task2",strlen("i am task2"),10);
		vTaskDelay(pdMS_TO_TICKS(200));
	}
}

thanks Gaurav,

Its working for me
but I didn’t understand why we put for( ; ; ) loop inside task handler ??
In many videos i have seen they didn’t put for( ; ; ) loop. But its task working

thank all for your support.

This page provides a good description - Writing RTOS tasks in FreeRTOS - implementing tasks as forever loops

Hi Gaurav,

thank you so much your support