FreeRTOS任务切换

151 篇文章 5 订阅 ¥299.90 ¥399.90
本文介绍了FreeRTOS的任务切换,主要通过系统节拍器中断和portYIELD触发PendSV中断来实现。当系统节拍器中断发生时,xTaskIncrementTick函数会检查任务是否需要切换。调度器未挂起时,会更新节拍、处理延时任务,并根据优先级决定是否切换。调度器挂起时,任务切换会被延迟。PendSV异常处理涉及入栈、取向量等步骤,并在异常返回时出栈。PendSV的主要工作包括保护和恢复任务现场,以及切换到高优先级的就绪任务。
摘要由CSDN通过智能技术生成

任务切换一共两种方式:系统节拍器中断、调用portYIELD。但是,最终都是产生PendSV中断。

/* SysTick异常处理入口 */
void xPortSysTickHandler(void)
{
	/* 禁止不高于系统调用优先级的中断 */
	vPortRaiseBASEPRI();
	{
		/* 提供系统节拍,并判断是否需要切换任务 */
		if(xTaskIncrementTick() != pdFALSE)
		{
			/* 悬起PendSV */
			portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
		}
	}
	/* 打开中断 */
	vPortClearBASEPRIFromISR();
}
/* 请求调度 */
#define portYIELD()																\
{																				\
	/* 请求可悬起异常 */								\
	portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;								\
																				\
	__dsb(portSY_FULL_READ_WRITE);											\
	__isb(portSY_FULL_READ_WRITE);											\
}

 

 

系统节拍器产生中断之后ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值