portYIELD_FROM_ISR(xHigherPriorityTaskWoken
时间: 2023-07-22 11:26:35 浏览: 58
这也是一个 FreeRTOS 中的函数,用于在中断服务程序(ISR)中判断是否需要进行任务切换。如果 xHigherPriorityTaskWoken 参数为 pdTRUE,则该函数会立即进行任务切换,将当前任务切换为更高优先级的任务。如果 xHigherPriorityTaskWoken 参数为 pdFALSE,则该函数不会进行任务切换。这个函数必须在中断服务程序中使用,因为在中断服务程序中不能直接调用任务切换函数。
相关问题
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
`portYIELD_FROM_ISR(xHigherPriorityTaskWoken)`是一个RTOS中的宏定义或函数调用。它用于在中断服务程序(ISR)中通知RTOS调度器,当前中断可能导致优先级更高的任务就绪,并请求进行任务切换。`xHigherPriorityTaskWoken`是一个参数,传递给宏定义或函数,用于指示是否需要进行任务切换。如果`xHigherPriorityTaskWoken`参数的值为`pdTRUE`,则表示需要进行任务切换;如果值为`pdFALSE`,则表示不需要进行任务切换。通过调用`portYIELD_FROM_ISR()`,RTOS可以在ISR返回后立即执行优先级更高的任务。这个功能在实时系统中非常重要,可以确保高优先级任务及时响应。
int32_t osSignalSet (osThreadId thread_id, int32_t signal) { #if( configUSE_TASK_NOTIFICATIONS == 1 ) BaseType_t xHigherPriorityTaskWoken = pdFALSE; uint32_t ulPreviousNotificationValue = 0; if (inHandlerMode()) { if(xTaskGenericNotifyFromISR( thread_id , (uint32_t)signal, eSetBits, &ulPreviousNotificationValue, &xHigherPriorityTaskWoken ) != pdPASS ) return 0x80000000; portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } else if(xTaskGenericNotify( thread_id , (uint32_t)signal, eSetBits, &ulPreviousNotificationValue) != pdPASS ) return 0x80000000; return ulPreviousNotificationValue; #else (void) thread_id; (void) signal; return 0x80000000; /* Task Notification not supported */ #endif }
这段代码是一个可能的osSignalSet函数的实现示例。它根据配置文件中的宏定义configUSE_TASK_NOTIFICATIONS的值来确定使用任务通知功能还是返回错误代码。如果启用了任务通知功能,函数会根据当前的运行环境(是否在中断模式下)调用不同的函数来设置信号。在中断模式下,函数会调用xTaskGenericNotifyFromISR函数来从中断服务程序中设置信号,并使用xHigherPriorityTaskWoken参数来指示是否有更高优先级的任务需要唤醒。最后,函数会返回先前的信号状态值。如果未启用任务通知功能,函数将返回一个特定的错误代码0x80000000。