硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2190|回复: 7
收起左侧

[FPU] 浮点运算单元重入问题

[复制链接]

14

主题

61

回帖

103

积分

初级会员

积分
103
发表于 2020-4-27 17:15:57 | 显示全部楼层 |阅读模式
重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。
一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLOAT,用来计算和存放浮点数的中间运算结果
假设有这么个函数
void fun()
{
//...这个函数对FLOAT寄存器进行操作
}
假如第一次执行,有个对浮点数操作运算的结果临时存在FLOAT寄存器中,而就在这时被中断了,而中断函数或者另一个进程也调用fun函数,这时第二次调用的fun函数在执行的过程中就会破坏第一次FLOAT寄存器中的结果,这样当返回到第一次fun函数的时候,结果就不正确了。


有没有人遇到这个问题,以前没注意过。浮点运算还要保护起来???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-4-27 17:51:37 | 显示全部楼层
老生常谈的问题了。

对于Cortex-M内核这种带FPU单元的,如果是裸机例子,无需用户操心,编译器会处理。

OS里面使用要处理的,FPU有一批寄存器是自动入栈的,还有一批是需要手动入栈的,OS里面处理的关键就是这批手动入栈的寄存器。
回复

使用道具 举报

10

主题

19

回帖

49

积分

初级会员

积分
49
发表于 2020-4-28 19:53:04 | 显示全部楼层
eric2013 发表于 2020-4-27 17:51
老生常谈的问题了。

对于Cortex-M内核这种带FPU单元的,如果是裸机例子,无需用户操心,编译器会处理。
...

楼主,您说得手动入栈是啥意思?怎么实现手动入栈?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-4-28 20:39:11 | 显示全部楼层
nextstation 发表于 2020-4-28 19:53
楼主,您说得手动入栈是啥意思?怎么实现手动入栈?

手动就是用户自己的port代码做入栈和出栈。

任意下载的RTOS的port文件代码看下就明白了。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-4-29 10:38:50 | 显示全部楼层
也就是说操作系统移植的代码里面如果处理了那些需要手工入栈的,  我们自己的应用代码就不需要单独处理了,对吧? 硬汉大哥
回复

使用道具 举报

14

主题

61

回帖

103

积分

初级会员

积分
103
 楼主| 发表于 2020-4-29 15:52:28 | 显示全部楼层
eric2013 发表于 2020-4-27 17:51
老生常谈的问题了。

对于Cortex-M内核这种带FPU单元的,如果是裸机例子,无需用户操心,编译器会处理。
...

看了一下RT-Thread和FreeRTOS对M4的port, 都做了处理。解惑了,谢谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-4-30 07:35:37 | 显示全部楼层
morning_enr6U 发表于 2020-4-29 10:38
也就是说操作系统移植的代码里面如果处理了那些需要手工入栈的,  我们自己的应用代码就不需要单独处理了, ...

是的。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-4-30 12:21:43 | 显示全部楼层
感谢硬汉大哥
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 22:49 , Processed in 0.175344 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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