uxTaskPriorityGet函数解读

本文详细解释了如何在FreeRTOS中使用uxTaskPriorityGet函数获取任务的优先级,包括设置临界区以保护共享资源,调用prvGetTCBFromHandle获取任务控制块,以及中断处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.
     }
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小庄科技服务工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值