cancel
Showing results for 
Search instead for 
Did you mean: 

osEventFlagsSet/Get not working in ISR? What am I doing wrong?

abeowitz
Associate

STM32F407VET6 + STM32CubeIDE + CMSIS_OS2

Latest IDE, w/ FreeRTOS 10.2.1, CMSIS-RTOS 2.00

Touch LCD IRQ on PC_5.

EXTI line[9:5] enabled, code gen enabled, and Call HAL Handler checked.

Event defined. Fails with both dynamic and static Allocation.

Include Param: xEventGroupSetBitFromISR enabled (doesn't work disabled either)

I want to set a flag when the touch interrupt is triggered, then resume a handler thread waiting with osEventFlagsWait().

Anyway, IRQ call succeeds.

but (see comments) 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 
if (GPIO_Pin == Touch_INT_Pin)
   {
     uint32_t flags = 0x00;
     extern osEventFlagsId_t touchEventHandle;
 
     flags = osEventFlagsSet(touchEventHandle, 0x01);
     // ^ returns 0x01, as expected.
 
     flags = osEventFlagsGet(touchEventHandle);
     // ^ returns 0x00, but should be 0x01
 
   }
 
. . .
 
 }

debug tracing shows touchEventHandle points to the same heap location as FreeRTOS set up.

Those Set/Get routines work fine within a thread.

I've traced through debug, but am unable to discern why it's not working as I expect. The Set routine dives deep into queue related code, so do Event bits use queues? The Get routine seems simpler and doesn't.

Thanks,

-Abe

9 REPLIES 9
kronikary
Associate III

Did you manage to solve the problem? I have the same issue with STM32l4 CMSIS v2. Setting flags works outside the interrupts.

EDIT: I guess the workaround of this problem is to use osThreadFlag (which works in ISR) that will start a thread, and in this thread you can set EventFlags.

HPope.1
Associate II

I'm having the same issue, if either of y'all figured it out, I would love an update.

kronikary thanks for your EDIT, I'll try it out as a work-around, but would love to be able to set flags.

bba.1
Associate

Bumping this thread.

I have the same problem, even though the NVIC priorities are configured seemingly properly.

If there are two tasks: A and B.

A's priority is higher than B's.

A is waiting for the eventflags and B is running. The bits in the event flag are set in an IRQ, but the xHigherPriorityTaskWoken flag is false, even though task A is blocked because of this.

If I put an osDelay() into task B, then everything works correctly, but it doesn't make sense as B's priority is already lower and preemption is enabled. 

Vikx
Associate

Hello there !

Same problem here the osEventFlagSet do not work calling from an ISR, but it worked with osThreadFlagSet.

Any advice on this ? 

the documentation say that it is possible to use it inside an ISR.

Tizio1234
Associate II

Hi there!
Same problem as everyone

mcfly7385
Associate

For me, the osEventFlagsSet was failing because the timer queue was full.

Within the IOC file's freertos config parmameters, I made the TIMER_QUEUE_LENGTH larger and it fixed the problem.

Leo4
Associate

I have the same problem. I read a post on the ARM community forum with the same problem and no solution was given. It seems CMSIS OS events do not work as expected. I will use osThreadFlags, but ST developers shall report this bug so we do not waste hours of time on a not-working library.

 

Leo

rfischer
Associate

This thread helped me and solved my problem that EventFlags sometimes have not been set.

Cheers,

Robert

Why "xEventGroupSetBitsFromISR" sometimes can not set Event? - Kernel - FreeRTOS Community Forums