打印
[STM8]

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

[复制链接]
10093|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 | 只看该作者
有点希奇。。。

使用特权

评论回复
5
香水城| | 2009-11-11 15:41 | 只看该作者
哈哈,不稀奇。

这是因为做乘法运算时,编译器实际上调用了一个函数,而这个函数用到了几个编译器自定义的全局变量,如果不按照2楼说的去做,在进入中断时不会保存这几个全局变量,而造成这个乘法运算函数为不可重入,导致错误。

使用特权

评论回复
6
xxy261|  楼主 | 2009-11-11 15:46 | 只看该作者
谢谢大家,问题已解决

使用特权

评论回复
7
yewuyi| | 2009-11-11 16:15 | 只看该作者
哈哈,不稀奇。

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


这就更希奇了,为何要使用全局变量呢?使用局部变量不就可以了吗?除非是使用到某些特殊寄存器,这几个特殊寄存器进/出中断的时候不能自动保存/恢复,必须加那个关键字之后,编译器才会在进入中断时保存那几个积存器。

使用特权

评论回复
8
香水城| | 2009-11-11 17:01 | 只看该作者
1)STM8是CISC结构,不是RISC结构。
2)STM8是8位的核心,只有8位的乘法指令,没有16位的乘法指令,作16位或32位的乘法运算必须通过一个函数实现。
3)如果8楼说不需要函数或者全局变量,最多来个PUSH STACK,您不妨用8位的乘法指令写一个16位和32位的乘法程序给我们看看。

使用特权

评论回复
9
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,但俺不明白有什么必须采用全局变量的方式实现它?

使用特权

评论回复
10
香水城| | 2009-11-11 18:03 | 只看该作者
STM8只有一个8位的累加器,不用中间变量,如何进行16位的数据运算?

不管怎样,我相信你们说的有道理,也许你们确实有好的办法,而编译器的作者不如你们聪明,:)

使用特权

评论回复
11
Trylin| | 2009-11-11 20:23 | 只看该作者
mark

使用特权

评论回复
12
desert_hawk| | 2009-11-12 08:07 | 只看该作者
香主的意思,是不是这个编译器在编译16位乘法运算语句的时候会使用一个不可重入函数?如果是中断里重入,可以使用提示符,假如在多线程中是不是就没办法了?当然,也许STM8的资源使用OS没多大意义。

使用特权

评论回复
13
desert_hawk| | 2009-11-12 09:40 | 只看该作者
ARM9和cortex-m3都是RISC,用8位的CISC跟32位的RISC比似乎意义不大。
至于不可重入,估计是考虑了MCU的架构和可用资源。

使用特权

评论回复
14
香水城| | 2009-11-13 17:15 | 只看该作者
16楼的同志总是喜欢误导、忽悠大家,关于STM8的指令周期,我已经在另外一个帖中解释得很清楚了,你根本没有好好看,或者说根本不愿意好好看。

唉,悲哀呀!

使用特权

评论回复
15
walnutcy| | 2009-11-13 22:15 | 只看该作者
STM8也就是在ST72上扩展了一下而已,
各位把它想得太神奇了,所以会有一大堆问题。

使用特权

评论回复
16
秋天落叶| | 2009-11-14 09:27 | 只看该作者
为什么一定要在中断里面做乘法呢,没必要,就在中断外面算就可以了

使用特权

评论回复
17
baidudz| | 2009-11-14 10:33 | 只看该作者
嗯,顶楼上的,中断里接受数据,主函数里面算嘛

使用特权

评论回复
18
yewuyi| | 2009-11-18 09:13 | 只看该作者
_COSMIC_中的写法@far @interrupt void ADC2_IRQHandler(void)

_RAISONANCE_ 中的写法void ADC2_IRQHandler(void) interrupt 22
复杂了很多。。。

使用特权

评论回复
19
gxgclg| | 2009-11-18 21:23 | 只看该作者
是没必要一定要在中断中算

使用特权

评论回复
20
hsbjb| | 2009-11-19 20:45 | 只看该作者
要看具体的情况,一般不用在中断里计算

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝