[STM8] STM8S中断程序中不能做乘法运算

[复制链接]
11445|22
 楼主| xxy261 发表于 2009-11-11 13:33 | 显示全部楼层 |阅读模式
乘法运算在主程序中正常,也可作为函数在中断中调用。但是直接在中断中就异常,后发现问题出在*2的整数倍以外的运算中,各位大侠有没有碰到这样的问题?如何解决?
huhuhu_1 发表于 2009-11-11 13:49 | 显示全部楼层
在中断程序的定义中增加修饰符 @svlreg 后再试试。
精益求精 发表于 2009-11-11 15:18 | 显示全部楼层
正常..
在51的中断中,乘除也可能不正常.
以前遇到过.
yewuyi 发表于 2009-11-11 15:20 | 显示全部楼层
有点希奇。。。
香水城 发表于 2009-11-11 15:41 | 显示全部楼层
哈哈,不稀奇。

这是因为做乘法运算时,编译器实际上调用了一个函数,而这个函数用到了几个编译器自定义的全局变量,如果不按照2楼说的去做,在进入中断时不会保存这几个全局变量,而造成这个乘法运算函数为不可重入,导致错误。
 楼主| xxy261 发表于 2009-11-11 15:46 | 显示全部楼层
谢谢大家,问题已解决
yewuyi 发表于 2009-11-11 16:15 | 显示全部楼层
哈哈,不稀奇。

这是因为做乘法运算时,编译器实际上调用了一个函数,而这个函数用到了几个编译器自定义的全局变量,如果不按照2楼说的去做,在进入中断时不会保存这几个全局变量,而造成这个乘法运算函数为不可重 ...
香水城 发表于 2009-11-11 15:41


这就更希奇了,为何要使用全局变量呢?使用局部变量不就可以了吗?除非是使用到某些特殊寄存器,这几个特殊寄存器进/出中断的时候不能自动保存/恢复,必须加那个关键字之后,编译器才会在进入中断时保存那几个积存器。
香水城 发表于 2009-11-11 17:01 | 显示全部楼层
1)STM8是CISC结构,不是RISC结构。
2)STM8是8位的核心,只有8位的乘法指令,没有16位的乘法指令,作16位或32位的乘法运算必须通过一个函数实现。
3)如果8楼说不需要函数或者全局变量,最多来个PUSH STACK,您不妨用8位的乘法指令写一个16位和32位的乘法程序给我们看看。
yewuyi 发表于 2009-11-11 17:18 | 显示全部楼层
1)STM8是CISC结构,不是RISC结构。
2)STM8是8位的核心,只有8位的乘法指令,没有16位的乘法指令,作16位或32位的乘法运算必须通过一个函数实现。
3)如果8楼说不需要函数或者全局变量,最多来个PUSH STACK,您不妨 ...
香水城 发表于 2009-11-11 17:01


呵呵,俺不管是RISC还是CISC,但俺不明白有什么必须采用全局变量的方式实现它?
香水城 发表于 2009-11-11 18:03 | 显示全部楼层
STM8只有一个8位的累加器,不用中间变量,如何进行16位的数据运算?

不管怎样,我相信你们说的有道理,也许你们确实有好的办法,而编译器的作者不如你们聪明,:)
Trylin 发表于 2009-11-11 20:23 | 显示全部楼层
desert_hawk 发表于 2009-11-12 08:07 | 显示全部楼层
香主的意思,是不是这个编译器在编译16位乘法运算语句的时候会使用一个不可重入函数?如果是中断里重入,可以使用提示符,假如在多线程中是不是就没办法了?当然,也许STM8的资源使用OS没多大意义。
desert_hawk 发表于 2009-11-12 09:40 | 显示全部楼层
ARM9和cortex-m3都是RISC,用8位的CISC跟32位的RISC比似乎意义不大。
至于不可重入,估计是考虑了MCU的架构和可用资源。
香水城 发表于 2009-11-13 17:15 | 显示全部楼层
16楼的同志总是喜欢误导、忽悠大家,关于STM8的指令周期,我已经在另外一个帖中解释得很清楚了,你根本没有好好看,或者说根本不愿意好好看。

唉,悲哀呀!
walnutcy 发表于 2009-11-13 22:15 | 显示全部楼层
STM8也就是在ST72上扩展了一下而已,
各位把它想得太神奇了,所以会有一大堆问题。
秋天落叶 发表于 2009-11-14 09:27 | 显示全部楼层
为什么一定要在中断里面做乘法呢,没必要,就在中断外面算就可以了
baidudz 发表于 2009-11-14 10:33 | 显示全部楼层
嗯,顶楼上的,中断里接受数据,主函数里面算嘛
yewuyi 发表于 2009-11-18 09:13 | 显示全部楼层
_COSMIC_中的写法@far @interrupt void ADC2_IRQHandler(void)

_RAISONANCE_ 中的写法void ADC2_IRQHandler(void) interrupt 22
复杂了很多。。。
gxgclg 发表于 2009-11-18 21:23 | 显示全部楼层
是没必要一定要在中断中算
hsbjb 发表于 2009-11-19 20:45 | 显示全部楼层
要看具体的情况,一般不用在中断里计算
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

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