FreeRTOS系统中两个不同优先级的任务可以按一定时序运行吗?

比如有两个任务,任务一优先级高,周期短,任务二优先级低,周期长。现在需要任务二在任务一之前开始执行(当然,开始执行后可以在需要的时候把cpu让给任务二)。现在周期性可以用 vTaskDelayUntil() 解决,但是任务的时序应该怎么解决?

考虑了二值信号量,但是任务一周期长,不能给及时的释放信号量,导致任务二的周期变得与任务一相同。之后又考虑了在任务二中加入条件判断,仍没有达到想要的效果。

希望大家帮忙提供建议和思路,谢谢!

任务一:

void vTask1( void *pvParameters )
{
    volatile uint32_t u1;
    TickType_t Timer1;
    TickType_t PreviousWakeTime1;
    PreviousWakeTime1 = xTaskGetTickCount();
    for(;;)
    {
        Timer1 = xTaskGetTickCount();
        xSemaphoreGive(BinarySemaphore);
        printf("Task1 starts at %u\r\n", Timer1);
        for( u1 = 0; u1 < TASK1_LOOP_COUNT; u1++)
            {
            }
        vTaskDelayUntil(&PreviousWakeTime1, TASK_1_PERIOD);
    }
}

任务二:

void vTask2( void *pvParameters)
{
    volatile uint32_t u2;
    volatile uint32_t counter = 0;
    TickType_t Timer2;
    TickType_t PreviousWakeTime2;
    BaseType_t err;
    PreviousWakeTime2 = xTaskGetTickCount();
    for(;;)
    {
        Timer2 = xTaskGetTickCount();
        if (counter == 0 || (counter % PERIOD_RATIO == 0))
        {
            if(BinarySemaphore != NULL)
            {
                err = xSemaphoreTake(BinarySemaphore,10);
                if (err == pdTRUE)
                {
                    printf("Task2 starts at %u\r\n", Timer2);
                    for(u2 = 0; u2 < TASK2_LOOP_COUNT; u2++)
                    {
                    }
                }
            }
        }
        else 
        {
            printf("Task2 starts at %u\r\n", Timer2);
            for(u2 = 0; u2 < TASK2_LOOP_COUNT; u2++)
                {
                }
        }
        counter ++;
        vTaskDelayUntil( &PreviousWakeTime2, TASK_2_PERIOD);
    }
}

https://blog.csdn.net/xinghuanmeiying/article/details/78206416