cancel
Showing results for 
Search instead for 
Did you mean: 

xQueueSendFromISR hangs out application [SOLVED]

ZZida.1
Associate II

Hi All,

I use FreeRTOS and I try to use USART by interrupt. When I call xQueueSendFromISR my application hangs out. I've set full assert but it never reaches assert_failed or Error_Handler functions.

I use NUCLEO-64 STM32F411RE board with 1.25.0 firmware package and STM32 CubeIDE 1.4.0. from Linux.

Here is the interrupt code :

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart == &huart2) {
                sh_receive_complete(huart);
                return;
        }
}
 
/**
 * receive completed interrupt function
 */
void sh_receive_complete(UART_HandleTypeDef *huart) {
	BaseType_t hptw = pdFALSE;
 
	if (!(huart && huart == configuration->uart))
		return;
 
	xQueueSendFromISR(receive_queue, &receive_buffer, &hptw);
	HAL_UART_Receive_IT(configuration->uart, &receive_buffer, 1U);
}

when this code reached xQueueSendFromISR never come back.

My FreeRTOS config params:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
 
 
/* Ensure definitions are only used by the compiler, and not by the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
  #include <stdint.h>
  extern uint32_t SystemCoreClock;
#endif
#define configENABLE_FPU                         0
#define configENABLE_MPU                         0
 
#define configUSE_PREEMPTION                     1
#define configSUPPORT_STATIC_ALLOCATION          1
#define configSUPPORT_DYNAMIC_ALLOCATION         1
#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                     ( 56 )
#define configMINIMAL_STACK_SIZE                 ((uint16_t)128)
#define configTOTAL_HEAP_SIZE                    ((size_t)15360)
#define configMAX_TASK_NAME_LEN                  ( 16 )
#define configUSE_TRACE_FACILITY                 1
#define configUSE_16_BIT_TICKS                   0
#define configUSE_MUTEXES                        1
#define configQUEUE_REGISTRY_SIZE                8
#define configUSE_RECURSIVE_MUTEXES              1
#define configUSE_COUNTING_SEMAPHORES            1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION  0
 
#define configMESSAGE_BUFFER_LENGTH_TYPE         size_t
 
/* 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             256
 
/* 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        0
#define INCLUDE_vTaskSuspend                 1
#define INCLUDE_vTaskDelayUntil              1
#define INCLUDE_vTaskDelay                   1
#define INCLUDE_xTaskGetSchedulerState       1
#define INCLUDE_xEventGroupSetBitFromISR     1
#define INCLUDE_xTimerPendFunctionCall       1
#define INCLUDE_xQueueGetMutexHolder         1
#define INCLUDE_uxTaskGetStackHighWaterMark  1
#define INCLUDE_eTaskGetState                1
 
#define USE_FreeRTOS_HEAP_4
 
/* 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
#endif
 
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15
 
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
 
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
 
 
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );}
 
#define vPortSVCHandler    SVC_Handler
#define xPortPendSVHandler PendSV_Handler
 
 
#define xPortSysTickHandler SysTick_Handler
 
#endif /* FREERTOS_CONFIG_H */

thx,

Zamek

1 ACCEPTED SOLUTION

Accepted Solutions
ZZida.1
Associate II

I found the solution:

need to set preemption priority of USART to 15

View solution in original post

1 REPLY 1
ZZida.1
Associate II

I found the solution:

need to set preemption priority of USART to 15