任务切换分析

任务切换

进程栈指针 PSP
1:任务切换就是在就绪列表中寻找优先级最高的就绪任务,然后去执行该任务,但是现在编写的还不支持优先级,仅实现两个任务的轮流切换
2:任务切换具体过程是在PendSV中断服务函数中完成的,只需将ICSR寄存器bit28置1就能引起PendSV中断,PendSV具体内容参考M3权威指南
3:任务切换一般都是调用portYIELD这个函数还有一个中断中的portYIELD_FROM_ISR( x )
4:上下文(任务)切换场合:
1)可以执行一个系统调用,比如:vTaskDelay->portYIELD_WITHIN_API->portYIELD
2)系统滴答定时器中断
5:xPortPendSVHandler中断服务函数是真正实现任务切换的地方
1)保存当前寄存器值到任务堆栈中
2)调用函数 vTaskSwitchContext(),此函数用来获取下一个要运行的任务,并将pxCurrentTCB 更新为这个要运行的任务
6: vTaskSwitchContext查找下一个要运行的任务

#define taskYIELD()			portYIELD()   //任务切换的本质就是将PendSV的悬起位置1,当没有其他中断运行的时候相应PendSV中断,去执行PendSV中断服务函数,在里面实现任务切换

#define portYIELD()																\
{
     																				\
	/* Set a PendSV to request a context switch.   #define portNVIC_PENDSVSET_BIT		( 1UL << 28UL ) */								\
	portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;								\
																				\
	/* Barriers are normally not required but do ensure the code is completely	\
	within the specified behaviour for the architecture. */						\
	__dsb( portSY_FULL_READ_WRITE );											\
	__isb( portSY_FULL_READ_WRITE );											\
}

中断服务函数是真正实现任务切换的地方

#define xPortPendSVHandler   PendSV_Handler

__asm void xPortPendSVHandler( void )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值