OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2509|回复: 4

【FreeRTOS】提高任务的优先级之后没有立马执行该任务

[复制链接]

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-4-29
在线时间
3 小时
发表于 2022-8-5 17:59:00 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 XUYILUO 于 2022-8-5 18:12 编辑
  1. 这里按照《FreeRTOS实时内核使用指南》------中文译文,更改任务优先级的例程
复制代码
  1. static void TASK1_task(void *pvParameters)
  2. {
  3.         unsigned portBASE_TYPE uxPriority;
  4.         uxPriority = uxTaskPriorityGet(NULL);
  5.         for(;;)
  6.         {
  7.                 printf("TASK1 is running\r\n");
  8.                 printf("raise the TASK2 priority,%d\r\n",(uxPriority+1));
  9.                 vTaskPrioritySet(TASK2_Handler,(uxPriority+1) );
  10.                 //vTaskDelay(1);
  11.         }
  12. }

  13. static void TASK2_task(void *pvParameters)
  14. {
  15.         unsigned portBASE_TYPE uxPriority;
  16.         uxPriority = uxTaskPriorityGet(NULL);
  17.         for(;;)
  18.         {
  19.                 printf("TASK2 is running\r\n");
  20.                 printf("lower the TASK2 priority,%d\r\n",(uxPriority-2));
  21.                 vTaskPrioritySet(NULL,(uxPriority-2) );
  22.                 //vTaskDelay(1);
  23.         }
  24. }

  25. void TaskInit(void)
  26. {

  27.         xTaskCreate((TaskFunction_t )TASK1_task,
  28.                                 (const char*    )"TASK1",
  29.                                 (uint16_t       )configMINIMAL_STACK_SIZE,
  30.                                 (void*          )NULL,
  31.                                 (UBaseType_t    )1,
  32.                                 (TaskHandle_t*  )NULL);
  33.         xTaskCreate((TaskFunction_t )TASK2_task,
  34.                                 (const char*    )"TASK2",
  35.                                 (uint16_t       )configMINIMAL_STACK_SIZE,
  36.                                 (void*          )NULL,
  37.                                 (UBaseType_t    )2,
  38.                                 (TaskHandle_t*  )&TASK2_Handler);
  39. }
复制代码


1659693299436.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2037
金钱
2037
注册时间
2021-7-17
在线时间
636 小时
发表于 2022-8-5 18:20:38 | 显示全部楼层
把优先级部分代码也截图看看
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-4-29
在线时间
3 小时
 楼主| 发表于 2022-8-5 18:27:39 | 显示全部楼层
  1. #if ( INCLUDE_vTaskPrioritySet == 1 )

  2.         void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority )
  3.         {
  4.         TCB_t *pxTCB;
  5.         UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry;
  6.         BaseType_t xYieldRequired = pdFALSE;

  7.                 configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) );

  8.                 /* Ensure the new priority is valid. */
  9.                 if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES )
  10.                 {
  11.                         uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U;
  12.                 }
  13.                 else
  14.                 {
  15.                         mtCOVERAGE_TEST_MARKER();
  16.                 }

  17.                 taskENTER_CRITICAL();
  18.                 {
  19.                         /* If null is passed in here then it is the priority of the calling
  20.                         task that is being changed. */
  21.                         pxTCB = prvGetTCBFromHandle( xTask );

  22.                         traceTASK_PRIORITY_SET( pxTCB, uxNewPriority );

  23.                         #if ( configUSE_MUTEXES == 1 )
  24.                         {
  25.                                 uxCurrentBasePriority = pxTCB->uxBasePriority;
  26.                         }
  27.                         #else
  28.                         {
  29.                                 uxCurrentBasePriority = pxTCB->uxPriority;
  30.                         }
  31.                         #endif

  32.                         if( uxCurrentBasePriority != uxNewPriority )
  33.                         {
  34.                                 /* The priority change may have readied a task of higher
  35.                                 priority than the calling task. */
  36.                                 if( uxNewPriority > uxCurrentBasePriority )
  37.                                 {
  38.                                         if( pxTCB != pxCurrentTCB )
  39.                                         {
  40.                                                 /* The priority of a task other than the currently
  41.                                                 running task is being raised.  Is the priority being
  42.                                                 raised above that of the running task? */
  43.                                                 if( uxNewPriority >= pxCurrentTCB->uxPriority )
  44.                                                 {
  45.                                                         xYieldRequired = pdTRUE;
  46.                                                 }
  47.                                                 else
  48.                                                 {
  49.                                                         mtCOVERAGE_TEST_MARKER();
  50.                                                 }
  51.                                         }
  52.                                         else
  53.                                         {
  54.                                                 /* The priority of the running task is being raised,
  55.                                                 but the running task must already be the highest
  56.                                                 priority task able to run so no yield is required. */
  57.                                         }
  58.                                 }
  59.                                 else if( pxTCB == pxCurrentTCB )
  60.                                 {
  61.                                         /* Setting the priority of the running task down means
  62.                                         there may now be another task of higher priority that
  63.                                         is ready to execute. */
  64.                                         xYieldRequired = pdTRUE;
  65.                                 }
  66.                                 else
  67.                                 {
  68.                                         /* Setting the priority of any other task down does not
  69.                                         require a yield as the running task must be above the
  70.                                         new priority of the task being modified. */
  71.                                 }

  72.                                 /* Remember the ready list the task might be referenced from
  73.                                 before its uxPriority member is changed so the
  74.                                 taskRESET_READY_PRIORITY() macro can function correctly. */
  75.                                 uxPriorityUsedOnEntry = pxTCB->uxPriority;

  76.                                 #if ( configUSE_MUTEXES == 1 )
  77.                                 {
  78.                                         /* Only change the priority being used if the task is not
  79.                                         currently using an inherited priority. */
  80.                                         if( pxTCB->uxBasePriority == pxTCB->uxPriority )
  81.                                         {
  82.                                                 pxTCB->uxPriority = uxNewPriority;
  83.                                         }
  84.                                         else
  85.                                         {
  86.                                                 mtCOVERAGE_TEST_MARKER();
  87.                                         }

  88.                                         /* The base priority gets set whatever. */
  89.                                         pxTCB->uxBasePriority = uxNewPriority;
  90.                                 }
  91.                                 #else
  92.                                 {
  93.                                         pxTCB->uxPriority = uxNewPriority;
  94.                                 }
  95.                                 #endif

  96.                                 /* Only reset the event list item value if the value is not
  97.                                 being used for anything else. */
  98.                                 if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )
  99.                                 {
  100.                                         listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  101.                                 }
  102.                                 else
  103.                                 {
  104.                                         mtCOVERAGE_TEST_MARKER();
  105.                                 }

  106.                                 /* If the task is in the blocked or suspended list we need do
  107.                                 nothing more than change it's priority variable. However, if
  108.                                 the task is in a ready list it needs to be removed and placed
  109.                                 in the list appropriate to its new priority. */
  110.                                 if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )
  111.                                 {
  112.                                         /* The task is currently in its ready list - remove before adding
  113.                                         it to it's new ready list.  As we are in a critical section we
  114.                                         can do this even if the scheduler is suspended. */
  115.                                         if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
  116.                                         {
  117.                                                 /* It is known that the task is in its ready list so
  118.                                                 there is no need to check again and the port level
  119.                                                 reset macro can be called directly. */
  120.                                                 portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority );
  121.                                         }
  122.                                         else
  123.                                         {
  124.                                                 mtCOVERAGE_TEST_MARKER();
  125.                                         }
  126.                                         prvAddTaskToReadyList( pxTCB );
  127.                                 }
  128.                                 else
  129.                                 {
  130.                                         mtCOVERAGE_TEST_MARKER();
  131.                                 }

  132.                                 if( xYieldRequired != pdFALSE )
  133.                                 {
  134.                                         taskYIELD_IF_USING_PREEMPTION();
  135.                                 }
  136.                                 else
  137.                                 {
  138.                                         mtCOVERAGE_TEST_MARKER();
  139.                                 }

  140.                                 /* Remove compiler warning about unused variables when the port
  141.                                 optimised task selection is not being used. */
  142.                                 ( void ) uxPriorityUsedOnEntry;
  143.                         }
  144.                 }
  145.                 taskEXIT_CRITICAL();
  146.         }

  147. #endif /* INCLUDE_vTaskPrioritySet */
复制代码
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-4-29
在线时间
3 小时
 楼主| 发表于 2022-8-5 18:39:54 | 显示全部楼层
ChenRyan 发表于 2022-8-5 18:20
把优先级部分代码也截图看看

优先级部分代码是指??
就只有这两个任务,我在TASK1中提高TASK2的优先级,之后不是应该直接被TASK2抢占CPU使用权,直接执行TASK2?但是看打印是执行了两次TASK1之后,TASK2才开始执行,不太理解为什么,难道在vTaskPrioritySet里面不会发生任务调度吗?

如果在提高TASK2优先级之后加上vTaskDelay(1);里面会执行一次任务调度,然后直接转到TASK1运行,这个感觉就跟预想的逻辑一样了
static void TASK1_task(void *pvParameters)
{
        unsigned portBASE_TYPE uxPriority;
        uxPriority = uxTaskPriorityGet(NULL);
        for(;;)
        {
                printf("TASK1 is running\r\n");
                printf("raise the TASK2 priority,%d\r\n",(uxPriority+1));
                vTaskPrioritySet(TASK2_Handler,(uxPriority+1) );
                //vTaskDelay(1);
        }
}

static void TASK2_task(void *pvParameters)
{
        unsigned portBASE_TYPE uxPriority;
        uxPriority = uxTaskPriorityGet(NULL);
        for(;;)
        {
                printf("TASK2 is running\r\n");
                printf("lower the TASK2 priority,%d\r\n",(uxPriority-2));
                vTaskPrioritySet(NULL,(uxPriority-2) );
                //vTaskDelay(1);
        }
}
void TaskInit(void)
{

        xTaskCreate((TaskFunction_t )TASK1_task,
                                (const char*    )"TASK1",
                                (uint16_t       )configMINIMAL_STACK_SIZE,
                                (void*          )NULL,
                                (UBaseType_t    )1,
                                (TaskHandle_t*  )NULL);
        xTaskCreate((TaskFunction_t )TASK2_task,
                                (const char*    )"TASK2",
                                (uint16_t       )configMINIMAL_STACK_SIZE,
                                (void*          )NULL,
                                (UBaseType_t    )2,
                                (TaskHandle_t*  )&TASK2_Handler);
}
回复

使用道具 举报

28

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2021-8-10
在线时间
271 小时
发表于 2022-9-18 18:29:28 | 显示全部楼层
你提升优先级之后,不在自己加vtaskdelay这种调度函数,起码也要等到滴答定时器中断这种,才能有机会执行任务调度
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表