FREERTOS之任务调度vPortYield

本文介绍了FreeRTOS如何在可抢占内核中进行任务调度,包括基于优先级和时间片轮流调度。当有多个任务处于相同优先级时,FreeRTOS通过vPortYield()实现任务切换,确保公平分配处理器时间。在Atmel的ATmega323 MCU中,vPortYield()会保存现场并调用vTaskSwitchContext()选择下一个任务,然后在portRESTORE_CONTEXT()中完成任务切换。

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

freeRTOS
支持多个任务具有相同的优先级,因此,当它被配置为可抢占内核时,调度算法既支持基于优先级的调度,也支持时间片轮流调度。任何时候调度器运行时它都选择处于就绪状态下的优先级最高的那个任务;如果有多个任务处于同一优先级,则freertos每个时钟节拍的中断服务程序中,将对这些任务应用换调度算法,轮流执行这些任务。
系统用uxTopReadyPriority全局变量记录当前处于就绪态的任务的最高优先级。调度的时候就根据这个uxTopReadyPriority直接找到就绪链表中pxReadyTasksLists[ uxTopReadyPriority ]的任务,进行运行。
一个任务可以通过调用 taskYIELD() 让出cpu,从而调度令一个任务运行。它的实现如下:
#define taskYIELD() portYIELD()
而portYIELD()是一个体系结构相关的函数,对于不同的mcu需要实现这么一个函数完成调度。我拿atmel的atmega323 mcu为例子,说明下具体实现。

extern void vPortYield( void ) __attribute__ ( ( naked ) );
#define portYIELD() vPortYield()
* Manual context switch. The first thing we do is save the registers so we
* can use a naked attribute.
void vPortYield( void ) __attribute__ ( ( naked ) );
void vPortYield( void )
{
    portSAVE_CONTEXT();
    vTaskSwitchContext();
    portRESTORE_CONTEXT();
    asm volatile ( "ret" );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值