比如有两个任务,任务一优先级高,周期短,任务二优先级低,周期长。现在需要任务二在任务一之前开始执行(当然,开始执行后可以在需要的时候把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