硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8657|回复: 8
收起左侧

[FreeRTOS] portEND_SWITCHING_ISR() 是什么意思和作用?

[复制链接]

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2016-6-6 09:50:24 | 显示全部楼层 |阅读模式
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );



使用二值信号量同步中断和任务的时候,在中断中give了信号量后,必须加上这个语句,没看懂是什么意思? 谁能帮忙解释一下



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2016-6-6 14:10:40 | 显示全部楼层
以FromISR结尾的函数都有一个参数,用来设置调用了此函数是否有高优先级任务就绪,如果有就绪的,此标志变量就会被设置
然后代入函数portEND_SWITCHING_ISR
----------------------------------------------------------------
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT

这个函数就是使能PendSV中断。
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
 楼主| 发表于 2016-6-6 14:39:00 | 显示全部楼层
找到一些解释与大家分享:
这里几个词语有点拗口,可以这样认为:上下文切换==任务切换; 异常==中断
PendSV是可悬起中断,如果我们把它配置最低优先级,那么如果同时有多个中断被触发,它会在其他中断执行完毕后再执行,而且任何中断都可以打断它。
OS 可以利用它“缓期执行”一个中断——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的 PendSV悬起寄存器中写 1。悬起后,如果优先级不够 高,则将缓期等待执行。

举个简单的例子来辅助理解。假设有这么一个系统,里面有两个就绪的任务A和B,并且通过SysTick中断启动上下文切换,而且这个系统中,基本上Systick是最高级别的中断,可以打断任何其他中断。。比如任务A执行到50%,来了串口中断,那么任务A的数据压栈,并开始执行中断程序;执行到一半,又产生了 SysTick 中断,则 SysTick会抢占其串口中断处理程序。凑巧,在Systick中发现有高级任务B已经ready,需要执行B,在这种情况下,Systick中断程序如果切换到B任务的。则因为串口中断前压栈了A任务,串口中断后退栈的数据进入B任务,AB任务就乱套了。所以,如果 OS 在某中断活跃时尝试切入不同的任务模式,将导致任务压栈-退栈数据混乱。

正确的做法是,systick决定要任务切换,但是暂不执行,只是在pendsv中断做个标记;先让串口中断执行完毕,退栈数据到任务A,任务A继续保持50%状态;pendsv中断程序开始执行,任务切换到B,B就开始执行了。。。。

总体说来,Systic只是决定要不要任务切换,任务切换的具体执行时在pendsv中断处理程序中完成的。而pendsv的中断函数正好就是FreeRTOS移植过程中我们需要更名,交给FreeRTOS使用的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2016-6-6 14:51:02 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:找到一些解释与大家分享:
这里几个词语有点拗口,可以这样认为:上下文切换==任务切换; 异常==中断
PendSV是可悬起中断,如果我们把它配置最低优先级,那么如果同时有多个中断被触发,它会在其他中断执行完毕后再执行,而且任何中断都可以打断它。

OS 可以利用它“缓期执行”一 .. (2016-06-06 14:39) 
PenSV,SVC这些看权威指南就可以了,说明很详细。RTOS要深入学习,要优先学习权威指南。
回复

使用道具 举报

0

主题

4

回帖

51

积分

初级会员

积分
51
发表于 2018-8-8 17:18:58 | 显示全部楼层
portEND_SWITCHING_ISR,可以不加吗?在中断里调用了FromISR的情况下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2018-8-8 17:47:59 | 显示全部楼层
winter1999 发表于 2018-8-8 17:18
portEND_SWITCHING_ISR,可以不加吗?在中断里调用了FromISR的情况下

要的,这样才能保证你调用了FromISR类的函数后,有就绪的高优先级任务,才能保证退出中断后得到优先执行。
回复

使用道具 举报

0

主题

4

回帖

51

积分

初级会员

积分
51
发表于 2018-8-9 09:27:59 | 显示全部楼层
eric2013 发表于 2018-8-8 17:47
要的,这样才能保证你调用了FromISR类的函数后,有就绪的高优先级任务,才能保证退出中断后得到优先执行 ...

谢谢!那么是不是可以理解,如果不需要优先执行高优先级的任务,就可以不加。然后退出中断后按断点前执行?还是无论如何都要加这条指令,只不过参数为pdFALSE?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2018-8-9 09:32:48 | 显示全部楼层
winter1999 发表于 2018-8-9 09:27
谢谢!那么是不是可以理解,如果不需要优先执行高优先级的任务,就可以不加。然后退出中断后按断点前执行 ...

你想不加,可以的,可以在滴答定时器中断执行后进行切换或者其它执行任务切换的点做切换。
回复

使用道具 举报

0

主题

4

回帖

51

积分

初级会员

积分
51
发表于 2018-8-9 09:37:10 | 显示全部楼层
eric2013 发表于 2018-8-9 09:32
你想不加,可以的,可以在滴答定时器中断执行后进行切换或者其它执行任务切换的点做切换。

谢谢管理员!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-22 11:23 , Processed in 0.221139 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表