OpenEdv-开源电子网

标题: ucosIII系统产生中断时,保存现场的压栈(PUSH)操作在哪里? [打印本页]

作者: Tbag    时间: 2020-3-27 17:36
标题: ucosIII系统产生中断时,保存现场的压栈(PUSH)操作在哪里?
环境:STM32F205 + ucosIII系统
描述:产生中断(比如UART中断)时,在执行ISR前需要保存被中断任务的现场(CPU的多个寄存器),但是我没有在UcosIII源码中找到这个PUSH操作。
问题:1)请问保存现场(PUSH)的操作是在哪个函数中完成的,函数名字是?
2)Cortex-M3权威指南 文档说M3会自动保存现场,难道说就没有这个压栈操作吗?


作者: ultraelec    时间: 2020-3-27 17:36
本帖最后由 ultraelec 于 2020-3-28 13:18 编辑

你有点晕了吧。
如果你在开发环境里用C开发程序,那么使用普通中断和普通函数时,无需考虑入栈出栈问题,开发环境自动搞定,跟用不用OS没关系。
如果你使用OS:调度器涉及到切换任务的代码部分才涉及到手动入栈/出栈操作(汇编开发部分),一般的就是在SVC、PendSV中。

1) 有一部分寄存器是由硬件自动压栈/出栈,所以你看不到代码。这些寄存器叫做栈帧,且有固定顺序的,详看栈帧部分。
2) 除了栈帧之外的寄存器,需要手动入栈/出栈,是有代码的。如上述,这也只有在使用OS时,在SVC和PendSV中才会用到,其它C中断函数和普通函数无需考虑。
作者: 溜溜干    时间: 2020-3-28 09:20
本帖最后由 溜溜干 于 2020-3-28 13:29 编辑

Cortex-M3的中断响应会自动保存现场:依次将xPSR,PC,LR,R12,R0-R3压入堆栈;按道理:应该是xPSR->PC->LR->R12->R3->R2->R1->R0先把PC和xPSR的值入栈,以及更新xPSR的IPSR段的值
作者: 溜溜干    时间: 2020-3-28 09:35
本帖最后由 溜溜干 于 2020-3-28 11:44 编辑

需要查一下
作者: Tbag    时间: 2020-3-30 09:12
溜溜干 发表于 2020-3-28 09:20
Cortex-M3的中断响应会自动保存现场:依次将xPSR,PC,LR,R12,R0-R3压入堆栈;按道理:应该是xPSR->PC->LR ...

我想看看自动保存的代码在哪个函数里执行的,关键是“Cortex-M3的中断响应会自动保存现场”自动保存是芯片自己会执行指令吗?我觉得还得有代码支持吧
作者: Tbag    时间: 2020-3-30 12:58
ultraelec 发表于 2020-3-28 13:00
你有点晕了吧。
如果你在开发环境里用C开发程序,那么使用普通中断和普通函数时,无需考虑入栈出栈问题, ...

文档里找到这么一句:响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及
R3㏑0由硬件自动压入适当的堆栈中
作者: Tbag    时间: 2020-3-30 13:00
溜溜干 发表于 2020-3-28 09:20
Cortex-M3的中断响应会自动保存现场:依次将xPSR,PC,LR,R12,R0-R3压入堆栈;按道理:应该是xPSR->PC->LR ...

响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及
R3㏑0由硬件自动压入适当的堆栈中。
文档中找到一句话,可以说明是硬件自动保存的,没有代码or指令。
作者: ultraelec    时间: 2020-3-30 13:18
你在uCOS的源码中是看不到关于任何操作寄存器的代码的。
因为这些属于移植部分,特定于相应架构的处理器。要看也得看port的代码。

只要你用C开发,就没有保护/恢复现场的C代码,C语言就不支持操作这些寄存器,也根本无需考虑。
这些操作需要用汇编,不管你用不用操作系统,任何函数(包括中断/异常)都需要保护/恢复现场。
而这些汇编代码是编译器生成的,你看uCOS源码怎么可能有?你要看就去看编译过程中生成的汇编代码,debug中的汇编窗口也可以看见。

如果用汇编开发,就要自己写需要手动压栈的汇编代码了(栈帧部分的寄存器是硬件自动入栈/出栈的,没有代码。除了栈帧外的部分寄存器仍需手动入/出栈)。
若使用OS,也只有SVC和PendSV两个异常中需要用汇编入栈/出栈。
而之所以需要手动汇编编写,根本原因是因为这两个异常中做的是非常规操作:保护当前任务现场(寄存器),而恢复的是另外任务的现场,从而实现切换任务。
对于其他普通中断函数,如UART,这些都是C写的代码,保护/恢复现场这些常规工作编译器就完成了。

作者: Tbag    时间: 2020-3-31 17:25
ultraelec 发表于 2020-3-30 13:18
你在uCOS的源码中是看不到关于任何操作寄存器的代码的。
因为这些属于移植部分,特定于相应架构的处理器。 ...

高手
作者: Tbag    时间: 2020-4-2 15:42
找这句话好久了“Cortex㎝3 在进入异常服务例程时,自动压栈了R0㏑3, R12, LR, PSR 和PC,并且在返回时自
动弹出它们,这多清爽!既加速了中断的响应,也再不需要汇编语言代码了(第8 章有详
述)。”




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4