16493|24

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM8S中断程序中不能做乘法运算 [复制链接]

                                 乘法运算在主程序中正常,也可作为函数在中断中调用。但是直接在中断中就异常,后发现问题出在*2的整数倍以外的运算中,各位大侠有没有碰到这样的问题?如何解决?
此帖出自stm32/stm8论坛

最新回复

                    mark  详情 回复 发表于 2016-7-22 14:03
点赞 关注
 

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 在中断程序的定义中增加修饰符 @svlreg 后再试试。
此帖出自stm32/stm8论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 有点希奇。。。
此帖出自stm32/stm8论坛
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
哈哈,不稀奇。

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

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 谢谢大家,问题已解决
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
哈哈,不稀奇。

这是因为做乘法运算时,编译器实际上调用了一个函数,而这个函数用到了几个编译器自定义的全局变量,如果不按照2楼说的去做,在进入中断时不会保存这几个全局变量,而造成这个乘法运算函数为不可重 ...
这就更希奇了,为何要使用全局变量呢?使用局部变量不就可以了吗?除非是使用到某些特殊寄存器,这几个特殊寄存器进/出中断的时候不能自动保存/恢复,必须加那个关键字之后,编译器才会在进入中断时保存那几个积存器。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个编译器简直荒谬吧?  STM8结构到底是不是真正的 RISC 哈佛结构 啊.
连CISC的ARM7 三级流水线达到0.9MIPS的水平都没有。还叫哈佛结构的RISC.真是的。

乘法器 只需要两个入口寄存器,然后一个出口寄存器。
更甚者把这这个出口寄存器 回环到其中的一个寄存器。
(不是说有乘法指令吗,当然就要硬件的乘法器单元了)
哪里需要函数或者全局变量, 最多 来个PUSH STACK,
这个编译器也太荒谬了吧?
此帖出自stm32/stm8论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

8
 
1)STM8是CISC结构,不是RISC结构。
2)STM8是8位的核心,只有8位的乘法指令,没有16位的乘法指令,作16位或32位的乘法运算必须通过一个函数实现。
3)如果8楼说不需要函数或者全局变量,最多来个PUSH STACK,您不妨用8位的乘法指令写一个16位和32位的乘法程序给我们看看。
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 
1)STM8是CISC结构,不是RISC结构。
2)STM8是8位的核心,只有8位的乘法指令,没有16位的乘法指令,作16位或32位的乘法运算必须通过一个函数实现。
3)如果8楼说不需要函数或者全局变量,最多来个PUSH STACK,您不妨 ...
呵呵,俺不管是RISC还是CISC,但俺不明白有什么必须采用全局变量的方式实现它?
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
STM8只有一个8位的累加器,不用中间变量,如何进行16位的数据运算?

不管怎样,我相信你们说的有道理,也许你们确实有好的办法,而编译器的作者不如你们聪明,
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 mark
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 版主的意思,是不是这个编译器在编译16位乘法运算语句的时候会使用一个不可重入函数?如果是中断里重入,可以使用提示符,假如在多线程中是不是就没办法了?当然,也许STM8的资源使用OS没多大意义。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 


1. 楼主的*2 不知是 8 还是16?   
  
2.  那些人说一条CISC指令就需要RISC的多条指令, 那简直就是鬼话!

看看 MUL ,DIV这些指令,如果让51来做,看看需要多少条指令。
看看ARM的CISC ARM7 与 RISC CORTEX-M3,指令基本无异。
还看看那些 DSP扩展指令,好比RBIT 位取反。。。。

其实这个跟 CISC 还是RISC 没本质的区别, 这是ARM的片子来看。

3. STM8确实 有缺陷。 就是寄存器太少,到ALU的。
   这样 就不得不需要外部RAM,也就是版主说的全局变量。

4. LLMUL函数是64*64 ,这个谁都可以自己写,但是没这个必要,这个几乎就是 国际标准了,
好比那些C基本函数库,你有必要去自己编写吗?

在ARM上的64*64 位乘法, 根本就不需要任何全局变量。全部是寄存器。

为何不能重入,不管任何嵌套,现场都会 PUSH STACK,出来就POP STACK,
根本不用担心什么。。

看来,多寄存器确实对 代码优化很有用。ARM指令确实是一套很高效的指令系统。
要不然就不是叫ARM了。
此帖出自stm32/stm8论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

14
 
ARM9和cortex-m3都是RISC,用8位的CISC跟32位的RISC比似乎意义不大。
至于不可重入,估计是考虑了MCU的架构和可用资源。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 


看看STM8的汇编,它的执行效率是 Cycles为单位的。
而AVR等是以CLOCKS为单位的。
AVR标称的是1个时钟脉冲一条指令执行效率。(最高)

认真看看,STM8是0.75  MPS ,就是0.75百万条指令每秒;这样计算就是1.333个时钟一条指令。

也可以这样理解。增强型的8051(没有流水线)是4个CLOCKS一条指令(最高),而STM8是三级流水线
结构, 4/3=1.3333 CLOCKS, 也就是0.75MPS(百万条指令每秒).

因此Cycles是机器周期,普通51的是12 CLOCK,增强型的51是4 CLOCK,
AVR的 机器周期是1 CLOCK.

而STM8的就是1.3333 CLOCK= 1 Cycle

同等的AVR 但周期指令,都比STM8快大约25%-30%

是不是ST有心忽悠 中国的 电子工程师?
先是忽悠说是 哈佛结构,RISC 处理器,

其实就是CISC处理器,  而且看来也不是什么哈佛结构啊!
就是在增强型的51上加了3级流水线结构。把【理论】性能提高到0.75MPS罢了。
STM8就是ARM7的8位版本。ARM7是CISC结构的。大概也是0.75MPS吧?忘了。
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
16楼的同志总是喜欢误导、忽悠大家,关于STM8的指令周期,我已经在另外一个帖中解释得很清楚了,你根本没有好好看,或者说根本不愿意好好看。

唉,悲哀呀!
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

17
 
STM8也就是在ST72上扩展了一下而已,
各位把它想得太神奇了,所以会有一大堆问题。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 为什么一定要在中断里面做乘法呢,没必要,就在中断外面算就可以了
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 嗯,顶楼上的,中断里接受数据,主函数里面算嘛
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

20
 
#ifdef _COSMIC_
@far @interrupt void ADC2_IRQHandler(void)
#else /* _RAISONANCE_ */
void ADC2_IRQHandler(void) interrupt 22
#endif /* _COSMIC_ */
{
    u8 temp ;
    ADC2Stop;
    ClearADC2;
    NewAdcData.part[1] = ADC2->DRL;
    NewAdcData.part[0] = ADC2->DRH;
    if( NewAdcData.data != OldAdcData.data )
    {   
        OldAdcData.data = NewAdcData.data ;
        temp =(u8)( 5 * NewAdcData.data / 0x3ff)  ;
        switch(temp)
        {
            case 0 : GPIOD->ODR =0b00000000;
                     break;
            case 1 : GPIOD->ODR =0b00001000;
                     break;
            case 2 : GPIOD->ODR =0b00000100;
                     break;
            case 3 : GPIOD->ODR =0b00001100;
                     break;
            case 4 : GPIOD->ODR =0b00000001;
                     break;
            case 5 : GPIOD->ODR =0b00001001;
                                                
        }
    }   
    ADC2Start;
}

没问题出现!!!!!!!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表