省流:在中断中写事件组需要调用 xEventGroupSetBitsFromISR
函数,该函数会使用 xTimerPendFunctionCallFromISR
将 vEventGroupSetBitsCallback
这一回调函数挂起到定时器队列中。vEventGroupSetBitsCallback
回调函数会在定时器队列中被调用,并执行 xEventGroupSetBits
函数来实际设置事件组的位。
具体流程:
1. xEventGroupSetBitsFromISR:
源码如下:
1 |
|
- 该函数接受事件组句柄、要设置的位以及一个指向
BaseType_t
的指针(用于指示是否需要进行上下文切换)。 - 它内部会调用
xTimerPendFunctionCallFromISR
,将vEventGroupSetBitsCallback
回调函数挂起到定时器队列中。
2. xTimerPendFunctionCallFromISR:
源码如下:
1 | BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) |
- 该函数将
vEventGroupSetBitsCallback
回调函数、事件组句柄、要设置的位以及一个标志(用于指示是否需要进行上下文切换)作为参数传递。 - 回调函数
vEventGroupSetBitsCallback
会在定时器队列中被调度执行。
3. vEventGroupSetBitsCallback:
源码如下:
1 | void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) |
- 这是一个回调函数,它会在定时器队列中被调用。
- 在这个回调函数中,会调用
xEventGroupSetBits
来实际设置事件组的位。
总结:
xEventGroupSetBitsFromISR
是用于ISR的函数,它通过xTimerPendFunctionCallFromISR
将事件组的设置操作推迟到定时器队列中执行,从而避免了在中断上下文中直接调用可能阻塞的API函数。vEventGroupSetBitsCallback
是一个回调函数,它在定时器队列中被调用,实际执行xEventGroupSetBits
来设置事件组的位。