OpenEdv-开源电子网

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

FreeRTOS在Cortex-M3内核单片机上的任务切换具体行为

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-10-15
在线时间
7 小时
发表于 2019-8-11 15:51:01 | 显示全部楼层 |阅读模式
1金钱
查看Cortex-M3 权威指南一书,发现这样一张图
捕获.PNG
意思就是FreeRTOS的任务切换过程是这样一个流程:滴答定时器中断---->悬起PendSv 中断--->滴答定时器结束--->PendSV中断服务函数执行
滴答定时器中断来时,会自动将当前的任务A的R0-R3和xPSR, PC, LR, R12自动入栈,也就是说任务A的状态和真正的任务切换的现场保存相比还差R4-R11寄存器未进行压栈保存,那么按照内核指南的说明,上面步骤的滴答定时器中断退出时,不会执行POP操作而是直接执行这里的PendSV中断函数(中断咬尾),但是此时的PendSV函数还是会将R4-R11用PSP进行压栈(任务A 的栈空间)操作,但是此时的R4-R11已经不能保证是任务A进入中断之前的值了(1),因为中断服务函数可能也会用到R4-R11这些寄存器,所以压栈进去的内容就会有问题,这里无法解释FreeRTOS能正常进行多任务切换的现象。百思不得其解,发帖求助,大佬赐教啊。。。。。。。。。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-8-12 02:57:34 | 显示全部楼层
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-10-15
在线时间
7 小时
 楼主| 发表于 2019-8-12 09:31:38 | 显示全部楼层
本帖最后由 Smile99 于 2019-8-12 09:36 编辑

自己找了块板子,仿真验证了一下,中断咬未并未发生,而是正常的退出中断运行了空闲任务然后才执行PendSV中断,这是为什么?
明明滴答定时器已将将PendSV中断悬起位置起了,并且也将中断掩蔽寄存器清零不掩蔽任何中断,但是PendSV中断并不是在滴答定时器中断服务程序后立即执行,而是先执行了空闲任务之后才开始执行PendSV中断服务函数。SysTick中断服务程序如下:
void xPortSysTickHandler( void )
{
        vPortRaiseBASEPRI();//中断掩蔽
        {

                if( xTaskIncrementTick() != pdFALSE )
                {
                        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;//设置Pen大SV悬起位
                }
        }
        vPortClearBASEPRIFromISR();//取消中断掩蔽
}


回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-10-15
在线时间
7 小时
 楼主| 发表于 2019-8-12 20:20:37 | 显示全部楼层

谢谢,原子哥,不光因为顶贴啊!,还有云教授
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-10-15
在线时间
7 小时
 楼主| 发表于 2019-8-14 22:31:29 | 显示全部楼层
自己顶一下
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-10-15
在线时间
7 小时
 楼主| 发表于 2019-8-14 22:32:22 | 显示全部楼层
顶一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 23:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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