OpenEdv-开源电子网

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

ucosIII系统产生中断时,保存现场的压栈(PUSH)操作在哪里?

[复制链接]

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
发表于 2020-3-27 17:36:45 | 显示全部楼层 |阅读模式
1金钱
环境:STM32F205 + ucosIII系统
描述:产生中断(比如UART中断)时,在执行ISR前需要保存被中断任务的现场(CPU的多个寄存器),但是我没有在UcosIII源码中找到这个PUSH操作。
问题:1)请问保存现场(PUSH)的操作是在哪个函数中完成的,函数名字是?
2)Cortex-M3权威指南 文档说M3会自动保存现场,难道说就没有这个压栈操作吗?

最佳答案

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

你有点晕了吧。 如果你在开发环境里用C开发程序,那么使用普通中断和普通函数时,无需考虑入栈出栈问题,开发环境自动搞定,跟用不用OS没关系。 如果你使用OS:调度器涉及到切换任务的代码部分才涉及到手动入栈/出栈操作(汇编开发部分),一般的就是在SVC、PendSV中。 1) 有一部分寄存器是由硬件自动压栈/出栈,所以你看不到代码。这些寄存器叫做栈帧,且有固定顺序的,详看栈帧部分。 2) 除了栈帧之外的寄存器,需要手动 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2018-9-1
在线时间
177 小时
发表于 2020-3-27 17:36:46 | 显示全部楼层
本帖最后由 ultraelec 于 2020-3-28 13:18 编辑

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

1) 有一部分寄存器是由硬件自动压栈/出栈,所以你看不到代码。这些寄存器叫做栈帧,且有固定顺序的,详看栈帧部分。
2) 除了栈帧之外的寄存器,需要手动入栈/出栈,是有代码的。如上述,这也只有在使用OS时,在SVC和PendSV中才会用到,其它C中断函数和普通函数无需考虑。
uevip#126.com
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-12-9
在线时间
11 小时
发表于 2020-3-28 09:20:21 | 显示全部楼层
本帖最后由 溜溜干 于 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段的值
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-12-9
在线时间
11 小时
发表于 2020-3-28 09:35:01 | 显示全部楼层
本帖最后由 溜溜干 于 2020-3-28 11:44 编辑

需要查一下
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-3-30 09:12:32 | 显示全部楼层
溜溜干 发表于 2020-3-28 09:20
Cortex-M3的中断响应会自动保存现场:依次将xPSR,PC,LR,R12,R0-R3压入堆栈;按道理:应该是xPSR->PC->LR ...

我想看看自动保存的代码在哪个函数里执行的,关键是“Cortex-M3的中断响应会自动保存现场”自动保存是芯片自己会执行指令吗?我觉得还得有代码支持吧
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-3-30 12:58:33 | 显示全部楼层
ultraelec 发表于 2020-3-28 13:00
你有点晕了吧。
如果你在开发环境里用C开发程序,那么使用普通中断和普通函数时,无需考虑入栈出栈问题, ...

文档里找到这么一句:响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及
R3㏑0由硬件自动压入适当的堆栈中
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-3-30 13:00:58 | 显示全部楼层
溜溜干 发表于 2020-3-28 09:20
Cortex-M3的中断响应会自动保存现场:依次将xPSR,PC,LR,R12,R0-R3压入堆栈;按道理:应该是xPSR->PC->LR ...

响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及
R3㏑0由硬件自动压入适当的堆栈中。
文档中找到一句话,可以说明是硬件自动保存的,没有代码or指令。
回复

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2018-9-1
在线时间
177 小时
发表于 2020-3-30 13:18:51 | 显示全部楼层
你在uCOS的源码中是看不到关于任何操作寄存器的代码的。
因为这些属于移植部分,特定于相应架构的处理器。要看也得看port的代码。

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

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

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-3-31 17:25:43 | 显示全部楼层
ultraelec 发表于 2020-3-30 13:18
你在uCOS的源码中是看不到关于任何操作寄存器的代码的。
因为这些属于移植部分,特定于相应架构的处理器。 ...

高手
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-10-10
在线时间
16 小时
 楼主| 发表于 2020-4-2 15:42:33 | 显示全部楼层
找这句话好久了“Cortex㎝3 在进入异常服务例程时,自动压栈了R0㏑3, R12, LR, PSR 和PC,并且在返回时自
动弹出它们,这多清爽!既加速了中断的响应,也再不需要汇编语言代码了(第8 章有详
述)。”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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