OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5149|回复: 3

FreeRTOS为什么要用SVC和pendSV中断?

[复制链接]

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
发表于 2020-4-16 16:52:29 | 显示全部楼层 |阅读模式
5金钱
FreeRTOS目前用了3个中断,
SVC、
pendSV、
滴答。
想问下为啥第一个任务要用SVC来启动,不能直接启动吗。
为啥任务切换是滴答中断启动pendSV,不能在滴答中断里直接做吗

最佳答案

查看完整内容[请看2#楼]

SVC 是在启动调度器函数vTaskStartScheduler()最后阶段触发并启动第一个任务。 既然你用OS了,必然任务都交给内核。不知道你说的什么直接启动,总之不能像调用普通函数一样启动一个任务,那和裸机没啥区别。 在FreeRTOS中SVC只使用了一次,就是在第一次,它不只是启动第一个任务,也是在设置MCU在线程模式下使用psp,一共没几行汇编代码,建议自己研读。 若知道它的原理了,其实不用SVC,用其它异常/中断也能实现同样的功能,只 ...
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2018-9-1
在线时间
177 小时
发表于 2020-4-16 16:52:30 | 显示全部楼层
SVC 是在启动调度器函数vTaskStartScheduler()最后阶段触发并启动第一个任务。
既然你用OS了,必然任务都交给内核。不知道你说的什么直接启动,总之不能像调用普通函数一样启动一个任务,那和裸机没啥区别。
在FreeRTOS中SVC只使用了一次,就是在第一次,它不只是启动第一个任务,也是在设置MCU在线程模式下使用psp,一共没几行汇编代码,建议自己研读。
若知道它的原理了,其实不用SVC,用其它异常/中断也能实现同样的功能,只不过SVC最合适,它也是专门为了OS设计的。  
   
SysTick虽然会在某些条件成立时调用pendSV,但它不是为了专门切换任务。
pendSV主要功能就是切换任务,且它是软中断,除了SysTick外,有些API中也会调用。

uevip#126.com
回复

使用道具 举报

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
 楼主| 发表于 2020-4-16 21:10:34 | 显示全部楼层
ultraelec 发表于 2020-4-16 16:52
SVC 是在启动调度器函数vTaskStartScheduler()最后阶段触发并启动第一个任务。
既然你用OS了,必然任务都 ...

哈哈,大神又见面了,谢谢谢谢。
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
回复

使用道具 举报

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
 楼主| 发表于 2020-4-19 10:59:07 | 显示全部楼层
这两天对这个事又多了一点理解,补充一下。

之前的心里感觉一直是,任务调度是基于时间片的调度,每个时间周期(eg:1ms),作一次任务切换,切PC、栈之类的。
所以需要一个稳定的滴答定时器来做定时切换。

后来发现不是这样的,其实任务切换是基于状态来做的。
因为是抢占式的,只有更高优先级的任务进入ready状态才需要切状态,
状态的切换才会导致一次任务切换(pendSV)
滴答定时器只是做一个简单的工作,就是给计时数加1,(函数名字写的也很明白了,就是xTaskIncrementTick),如果因为加一,导致有些任务的状态发生变化,比如堵塞到期等,而导致改变了状态链表,产生了一个触发,这样才会进行pendSV的调度器。
可见滴答定时器也没有之前想象的那么重要,他也不过是产生了一个触发。
和其他事件的触发是一样。
比如入队出队操作,导致系统任务的状态发生变化,有优先级更高的任务放了出来,进入了ready,也是触发中断,进pendSV做上下文切换。


所以滴答和pendSV完全是两个东西,做的是两件事情。
所以放在两个中断里。

至于为什么是pendSV,而不是别的什么中断,是因为pendSV设计出来就是用来做切换的,pendSV可以挂起。
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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