lingdianhao 发表于 2022-12-2 23:07:22

FreeRTOS任务调度问题请教

本帖最后由 lingdianhao 于 2022-12-2 23:09 编辑

调度配置:
开启了抢占式调度,关闭了时间片调度。

任务情况:
系统除空闲任务外共有3个任务。
task1任务优先级为2
task2任务优先级为2
task3任务优先级为3

uint8_t task_counter_1 = 0;
uint8_t task_counter_2 = 0;
uint8_t task_counter_3 = 0;

void task1(void* ptr)
{
        while(1)
        {
                task_counter_1++ ;
        }
}

void task2(void* ptr)
{
        while(1)
        {
                task_counter_2++ ;
        }
}

void task3(void* ptr)
{
        while(1)
        {
                vTaskDelay(10);
                task_counter_3++ ;
        }
}

测试1:只创建任务1和任务2,因为关闭时间片调度,任务1和任务2优先级相同,只有task1得到执行,task2得不到执行。
测试2:创建任务1,任务2,任务3,此时出现task1和task2被轮流执行的情况,因为一个更高优先级的任务3加入而导致已有的两个同优先级任务运行结果不一致。
我想要的功能是任务1和任务2同优先级,只要在运行的任务没有主动释放CPU其他同优先级任务就不能执行,即使有更高优先级任务把它打断,返回后也能继续执行被打断的任务,而不是切换到下一个同优先级任务,因为我已经关闭了时间片调度,就不应该出现任务1和任务2能轮流执行共享时间片的情况。

liwei_jlu 发表于 2022-12-3 09:22:41

任务1与任务2共享一个信号量不就行了。谁申请到谁运行。用完了再释放

xinyou 发表于 2022-12-3 09:38:37

我知道的在FreeRTOS没有配置可以实现你的需求,如果要实现的话,需要修改FreeRTOS的code,可以看下 listGET_OWNER_OF_NEXT_ENTRY ,这个是切换同级任务的。

asj1989 发表于 2022-12-3 11:28:21

我觉得不能设置成一个优先级。

xinyou 发表于 2022-12-3 12:25:17

liwei_jlu 发表于 2022-12-3 09:22
任务1与任务2共享一个信号量不就行了。谁申请到谁运行。用完了再释放
(引用自2楼)

对的,用信号量可以实现他说的问题,优先级不一样。
在需要释放的时候:

释放信号量
延时一点时间
等待信号量
页: [1]
查看完整版本: FreeRTOS任务调度问题请教