uxTaskPriorityGet函数解读
从以下代码可知,使用uxTaskPriorityGet函数前需在FreeRTOSConfig.h文件中将INCLUDE_uxTaskPriorityGet定义为1。
代码首先定义一个TCB_t const类型的指针,该指针指向任务控制块结构体tskTaskControlBlock;同时定义了一个UBaseType_t类型变量(本质上是unsigned long类型)。
之后应该taskENTER_CRITICAL();
这行代码进入临界区。在FreeRTOS中,临界区是一种保护机制,用于防止多个任务同时访问共享资源,从而避免竞态条件。taskENTER_CRITICAL()
宏会禁用中断,确保在临界区内的代码不会被中断打断。
pxTCB = prvGetTCBFromHandle( xTask );
这行代码调用了一个辅助函数prvGetTCBFromHandle()
,它根据任务句柄xTask
获取任务控制块(Task Control Block,TCB)。TCB包含了任务的所有信息,包括任务的优先级。pxTCB
是一个指向TCB的指针。
uxReturn = pxTCB->uxPriority;
这行代码将任务的优先级(uxPriority
)赋值给uxReturn
变量。这个值随后会作为函数的返回值,表示任务的当前优先级。
最后由taskEXIT_CRITICAL();
这行代码退出临界区。在临界区代码执行完毕后,taskEXIT_CRITICAL()
宏会重新启用中断,允许中断处理程序运行。
随即返回指向任务控制块中优先级的指针。
#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) ) //prvGetTCBFromHandle函数
#if ( INCLUDE_uxTaskPriorityGet == 1 )
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )
{
TCB_t const * pxTCB;
UBaseType_t uxReturn;
taskENTER_CRITICAL();
{
/* If null is passed in here then it is the priority of the task
* that called uxTaskPriorityGet() that is being queried. */
pxTCB = prvGetTCBFromHandle( xTask );
uxReturn = pxTCB->uxPriority;
}
taskEXIT_CRITICAL();
return uxReturn;
}
#endif /* INCLUDE_uxTaskPriorityGet */
示例代码:
void vAFunction( void )
{
TaskHandle_t xHandle;
// Create a task, storing the handle.
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// ...
// Use the handle to obtain the priority of the created task.
// It was created with tskIDLE_PRIORITY, but may have changed
// it itself.
if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
{
// The task has changed its priority.
}
// ...
// Is our priority higher than the created task?
if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
{
// Our priority (obtained using NULL handle) is higher.
}
}