FreeRTOS调度器挂起与解除

151 篇文章 4 订阅 ¥299.90 ¥399.90
本文深入探讨了FreeRTOS中调度器的挂起与解除过程。在系统节拍器中断中,调度器挂起仅增加挂起时间,不执行任务切换;在PendSV中断中,挂起调度器会阻止上下文切换。调度器挂起通过设置uxSchedulerSuspended标志实现,而完全解除挂起时,需检查并处理挂起期间的任务状态变化,包括移除就绪任务、更新任务解除阻塞时间以及补偿挂起期间的节拍。
摘要由CSDN通过智能技术生成

通过分析任务切换,我们知道任务切换的两种方法:系统节拍器中断、调用portYIELD产生PendSV中断。

在系统节拍器中断中,如果调度器被挂起,仅仅将调度器挂起时间加一(在解除挂起后需要补偿这些节拍),并不会检查是否有任务需要切换。

/* 系统节拍加一 */
BaseType_t xTaskIncrementTick(void)
{
	BaseType_t xSwitchRequired = pdFALSE;
	
	/* 调度器没有被挂起 */
	if(uxSchedulerSuspended == (UBaseType_t)pdFALSE)
	{
		......
	}
	/* 调度器被挂起 */
	else
	{
		/* 挂起时间加一 */
		++uxPendedTicks;
	}

        /* 前面有程序因为各种原因,要求延迟到现在切换 */
	if(xYieldPending != pdFALSE)
	{
		/* 请求切换任务,最终进入PendSV异常,是否切换上下文还是在于PendSV */
		xSwitchRequired = pdTRUE;
	}

	return xSwitchRequired;
}

在PendSV中断中,如果调度器被挂起,则不进行上下文切换,通过xYieldPending将任务切换延迟到下一个节拍。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值