[应用相关] 尝试两个任务的切换

[复制链接]
2362|38
 楼主| dingbo95 发表于 2019-6-16 20:06 | 显示全部楼层
使用F11进入到FirstTask()函数内部,接着按F11将PSP的值设置为0
294705d0630b01baf5.png
 楼主| dingbo95 发表于 2019-6-16 20:06 | 显示全部楼层
使用F11 触发PendSV异常,执行完毕后会进入PendSV_Hander函数中
896755d0630c715f4e.png
 楼主| dingbo95 发表于 2019-6-16 20:07 | 显示全部楼层
接着F11,MRS R0, PSP指令后,R0的值将会刷新为0
862085d0630f4b9558.png
 楼主| dingbo95 发表于 2019-6-16 20:07 | 显示全部楼层
接着F11,由于CBZ R0,PendSVHander_nosave指令,此时R0的值为0,会被跳转到PendSVHander_nosave代码段。
723165d0631070806c.png
 楼主| dingbo95 发表于 2019-6-16 20:08 | 显示全部楼层
接着F11,执行LDR R0, = currentTask  LDR R1, = nextTask  LDR R2,[R1]  STR R2,[R0] 四条指令后,会完成nextTask向currentTask赋值操作。
654855d063120410e8.png
 楼主| dingbo95 发表于 2019-6-16 20:08 | 显示全部楼层
接着F11,执行LDR R0,[R2],从currentTask取出堆栈的地址给R0
87185d06313724a7d.png
 楼主| dingbo95 发表于 2019-6-16 20:08 | 显示全部楼层
接着F11,执行LDMIA R0!,{R4-R11} 从堆栈取值批量加载R4-R11寄存器中。
96625d06314eaf6b7.png
 楼主| dingbo95 发表于 2019-6-16 20:09 | 显示全部楼层
接着F11,执行MSR PSP,R0 更改PSP值,为进程间切换做准备。
899535d06316f0dd2f.png
 楼主| dingbo95 发表于 2019-6-16 20:09 | 显示全部楼层
最后程序会跳转到第一个要执行中,实现了从FirstTask()任务到任务1的跳转。
336275d063187cd630.png
 楼主| dingbo95 发表于 2019-6-16 20:10 | 显示全部楼层
下面就是任务1与任务2的切换,FirstTask()任务已经完成了它的使命。接着F11到umTaskSched()
913045d06319934d06.png
 楼主| dingbo95 发表于 2019-6-16 20:10 | 显示全部楼层
F10进入umTaskSched()任务调度函数中,这里完成了任务的切换,最终会进入umTaskSwitch()函数。
811405d0631ad744a3.png
 楼主| dingbo95 发表于 2019-6-16 20:11 | 显示全部楼层
再次F10 进入umTaskSwitch()函数,在umTaskSwitch()函数中只是完成了PendSV异常的触发,再一次回到了汇编执行区域,这个难缠的家伙!
466165d0631d643c1f.png
 楼主| dingbo95 发表于 2019-6-16 20:11 | 显示全部楼层
这次PSP的值已经不再是0的,我们将PSP的值传给R0寄存器,需要注意的是PSP的值是当前任务的堆栈地址。这样我们就可以轻松保存当前任务的状态了。
535455d0631e96b0c9.png
 楼主| dingbo95 发表于 2019-6-16 20:11 | 显示全部楼层
接着F11 ,保存当前任务状态,将R4-R11批量存入R0中。 205635d063209e0899.png
 楼主| dingbo95 发表于 2019-6-16 20:12 | 显示全部楼层
接着F11,接着将R0的值写入该任务堆栈的地址中。
896985d063221731ef.png
 楼主| dingbo95 发表于 2019-6-16 20:13 | 显示全部楼层
后面就是重复了,一路F11过去,看是否进入任务2中。
989485d063251ac63f.png
 楼主| dingbo95 发表于 2019-6-16 20:13 | 显示全部楼层
按照我们的计划已经进入任务2中,在逻辑分析仪中已经看到任务2中变量产生的波形。
116115d06326606985.png
 楼主| dingbo95 发表于 2019-6-16 20:13 | 显示全部楼层
最后就是验证,能否从任务2切换回任务1,所以一路F11过去。很幸运,已经可以实现了两个任务之间的切换了。
404855d063277bddf9.png
 楼主| dingbo95 发表于 2019-6-16 20:14 | 显示全部楼层
最后来展示一个全速运行的逻辑分析仪的波形,以此纪念我打字的辛苦!
266815d06328b7cba8.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部