找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1498|回复: 21
收起左侧

请教各位单片机开中断能用除法吗?

  [复制链接]
ID:343102 发表于 2022-1-7 08:26 | 显示全部楼层 |阅读模式
看单片机说明,中断会干扰浮点运算。问题来了,除法是浮点运算吗?开中断时能用吗?若不能用,显示各位数字时怎么办?
回复

使用道具 举报

ID:1000469 发表于 2022-1-7 09:37 | 显示全部楼层
看变量类型,整型变量除法的就是整型
回复

使用道具 举报

ID:661945 发表于 2022-1-7 10:13 | 显示全部楼层
除法是不是浮点运算跟你定义的变量类型有关系的,如果是定义浮点数才是浮点运算~~~
回复

使用道具 举报

ID:343102 发表于 2022-1-7 10:39 | 显示全部楼层
城夫子 发表于 2022-1-7 09:37
看变量类型,整型变量除法的就是整型

谢谢回复。
不过,有关说明指出,不支持浮点运算的单片机可以用软件模拟运算,但是如果运算中被中断打断,是无法恢复的,这样连结果都无法得到,就不用说结果取整了。
回复

使用道具 举报

ID:343102 发表于 2022-1-7 10:41 | 显示全部楼层
wuwei520 发表于 2022-1-7 10:13
除法是不是浮点运算跟你定义的变量类型有关系的,如果是定义浮点数才是浮点运算~~~

你说的是运算结果还是运算过程?
回复

使用道具 举报

ID:624769 发表于 2022-1-7 11:12 来自手机 | 显示全部楼层
你要先明白什么叫浮点运算,如果你单片机没有硬件浮点运算器,是无法进行浮点远算的。所谓的模拟浮点运算,也不是浮点运算,而是用整形运算,来帮你算出用浮点运算才能得到的结果。
回复

使用道具 举报

ID:57657 发表于 2022-1-7 11:54 | 显示全部楼层
模拟一次浮点运算需要几百上千条指令,中断触发后会将一些运算有关的寄存器push进去,返回后再全部pop出来继续运算。
回复

使用道具 举报

ID:879348 发表于 2022-1-7 11:59 | 显示全部楼层
你没搞明白是怎么回事,影响是中断在变量运算半途进入中断又改变了你运算的变量,要软件处理,比如运算结束前禁止中断或者运算的变量不要用中断的变量,而是重新赋值新变量去运算
回复

使用道具 举报

ID:401564 发表于 2022-1-7 12:51 | 显示全部楼层
看单片机说明,中断会干扰浮点运算。问题来了,你是在哪里看到这个说明的?
在中断中用大量浮点运算会干扰中断才是的,所以,不要在中断中使用大量浮点运算
你说反了
回复

使用道具 举报

ID:343102 发表于 2022-1-7 14:03 | 显示全部楼层
wufa1986 发表于 2022-1-7 11:59
你没搞明白是怎么回事,影响是中断在变量运算半途进入中断又改变了你运算的变量,要软件处理,比如运算结束 ...

看来只有这位朋友知道我说的是什么。
不过,有些时候是不允许停止中断的,例如使用外中断计数。
最好能知道软件除法的代码,待我上网搜搜看。
回复

使用道具 举报

ID:1000530 发表于 2022-1-7 14:07 | 显示全部楼层
能用除法,一般没什么问题,肯定是哪里耦合,而不是除法耦合,除法的运算时间比较长也是存在的事实
回复

使用道具 举报

ID:962286 发表于 2022-1-7 14:20 | 显示全部楼层
目前应该没有单片机的中断会干扰浮点运算,因为进中断和出中断都有对应的现场保护和现场恢复。相反,如果浮点运算是在中断服务函数里边运算的话,浮点运算是会影响中断的时序。
而像楼主说的显示,比如数码管,LCD,OLED等等等显示一些数据,绝大部分环境都可以不用浮点数,以免给CPU增加不必要的负担!比如数码管显示37.8,可以用378来代替,自己软件上记住数据被放大10倍就可以了。
回复

使用道具 举报

ID:845170 发表于 2022-1-7 15:27 | 显示全部楼层
除法是不是浮点运算跟你定义的变量类型有关系的,需要是定义浮点数才是浮点运算
回复

使用道具 举报

ID:57657 发表于 2022-1-7 15:43 | 显示全部楼层
如果堆栈出现了问题,别说干扰浮点计算,PC指针都能弹飞。
回复

使用道具 举报

ID:343102 发表于 2022-1-7 20:58 | 显示全部楼层
MCU_FANS 发表于 2022-1-7 14:20
目前应该没有单片机的中断会干扰浮点运算,因为进中断和出中断都有对应的现场保护和现场恢复。相反,如果浮 ...

有的教程明确指出,单片机浮点运算以及不可再入函数可能会被中断打断终止,产生不可预料结果,一般不提倡使用浮点运算。特别指出使用sin()前必须关闭中断。
至于中断程序,不要说非常耗时的浮点运算,就是整数运算也必须尽量减少。倒不是影响中断,而是无法得到正确结果。
回复

使用道具 举报

ID:343102 发表于 2022-1-7 21:06 | 显示全部楼层
谢谢各位积极发言。
经过查找发现,两整数模拟除法运算并不产生小数,而是产生整数的商和余数,不是浮点运算。但是模拟除法运算非常耗时,提倡尽量少用。
回复

使用道具 举报

ID:624769 发表于 2022-1-7 21:15 | 显示全部楼层
风158 发表于 2022-1-7 20:58
有的教程明确指出,单片机浮点运算以及不可再入函数可能会被中断打断终止,产生不可预料结果,一般不提倡 ...

你 C 语言编程,还真编不出 不可再入函数来……

也许是我C语言太渣吧,反正,我C语言写的代码,编译后察看M51文件,所有函数都是以?开头的可再入函数,要想编一个不可再入函数,不得不通过汇编去写。
你如果有办法在 C 语言环境下编出不可再入函数,麻烦指点一二,真的想学。
回复

使用道具 举报

ID:883242 发表于 2022-1-7 22:49 | 显示全部楼层
风158 发表于 2022-1-7 20:58
有的教程明确指出,单片机浮点运算以及不可再入函数可能会被中断打断终止,产生不可预料结果,一般不提倡 ...

你看到的教程的说法全都是错误的。
回复

使用道具 举报

ID:883242 发表于 2022-1-7 22:52 | 显示全部楼层
188610329 发表于 2022-1-7 21:15
你 C 语言编程,还真编不出 不可再入函数来……

也许是我C语言太渣吧,反正,我C语言写的代码,编译后 ...

在标准c语言里面,函数局部变量是在堆栈上临时分配的,这种函数可递归,可再入。但是对于8位单片机来说,这种做法消耗太大,尤其是RAM空前紧张的8051体系,所以编译器用了非正规的快速简洁的实现方法,分析函数间调用层级,给局部变量分配一个固定的地址,比如25H吧,这种函数就是不递归的,一旦发生了重入,被打断的函数的局部变量被重进函数给彻底破坏了。
回复

使用道具 举报

ID:343102 发表于 2022-1-8 00:50 | 显示全部楼层
好吧,我看到的教程可能是错误的,但是我编的程序会遵守这个教程的。另外把我看到的教程贴出来,有兴趣的朋友继续研究吧。

无标题.png
回复

使用道具 举报

ID:883242 发表于 2022-1-8 01:11 | 显示全部楼层
风158 发表于 2022-1-8 00:50
好吧,我看到的教程可能是错误的,但是我编的程序会遵守这个教程的。另外把我看到的教程贴出来,有兴趣的朋 ...

你在15楼发言中只有不可再入部分是对的,但是C51会给出错误信息,无法通过编译,所以即使这个知识点是对的也是毫无价值的。

其他知识点完全错误。
回复

使用道具 举报

ID:526543 发表于 2022-1-8 15:01 | 显示全部楼层
看你自己定义的数据类型  而且中断不干扰吧
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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