一个有关0.0625℃的运算想到的问题

2020-01-19 19:42发布

发布: 2010-3-30 09:02 | 作者: cat_li | 来源: 电子爱好者社区
碰到一哥们号称挺NB的嵌入软件工程师,看了他的代码后就欧拉,事情是在一个只有4K代码的单片机接2个DS18B20测温传感器,都知道DS18B20输出数据只要乘以0.0625就是测量的温度值,这哥们说程序空间怎么也不够,实际上程序只有简单的采集两个DS18B20的数据转换成温度值,之后在1602液晶上显示,挺简单个程序,怎么也想不通为什么程序空间不够。只读了一下代码发现程序就没动脑子,真的用浮点库把DS18B20数据直接乘以0.0625了,那程序不超才怪呢,稍微动动脑子也会知道0.0625不就是1/16吗,把DS18B20的数据直接右移4位不就是了(当然要注意符号),这右移程序可十分简单还省空间,问题很好解决,空间自然也就够了。
    现在想来嵌入处理器确实是进步了,程序空间是越来越大,数据RAM空间也越来越大,导致很多人在写程序的时候真的是什么都不顾,借着C语言的灵活性真是纵横驰骋,压根也不讲个程序效率和可靠性。正如前些日子见到一孩子用ARM cortex-m3处理器给人接活写个便携表的1024点FFT算法,本身12位的AD系统,这小家伙直接到网上下载了浮点的FFT算法代码就给人加上了,结果整个程序死慢死慢的,人家用户可不买单啊,这时要动动脑子把数据直接变成乘以某个数变成整数后用定点FFT处理,之后再把数据除一下不就行了。速度自然也快了,而且也能省下空间。实际当中我们做嵌入软件很多时候犯懒都忽视程序执行效率问题,是都能实现功能,但有时候就是没法谈性能。我几次碰到这样的工程师,直接把传感器的信号放大后进嵌入处理器的AD,也不看看AD数据是否稳定有效,直接就进行FFT运算,那FFT结果真是热闹,不难看出混叠很严重,于是又机械地在FFT基础上再去衍生算法,系统程序越做越大,速度越做越慢。实际上也很简单的事,在传感器放大信号进AD之前来一级抗混叠滤波基本也就解决了,大有所谓嵌入软件高手的概念是程序几乎是万能,实在解决不了就换大程序空间更高速的处理器,整个恶性循环。
    经常听说现在流行低碳族,我想出 {MOD}的嵌入软件工程师最容易成为低碳一族,只要让代码高效那处理器频率自然可以灵活降下来,自然耗电也就少了,二氧化碳排放也就少了。想想目前到处都是嵌入处理器,代码条数看来也别有效果。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
bluefeel
1楼-- · 2020-01-23 18:45
以前都是用汇编,后来懒了
knight_avr
2楼-- · 2020-01-23 21:55
DS18B20精度是 0.5度
其实 不用那么复杂的

     T = (Tadc >>3);  就可以

每一个码表示0.5度
eduhf_123
3楼-- · 2020-01-24 03:36
回复【32楼】hsztc
没注意看上面的是四位都算出来,我只算小数后一位并四舍五入,因为18B20的精度就那样,后面几位没多大意义。
跟据24楼的表加上自己的处里得到下面的算式,应该算很简了吧?
U=(xx*5)>>3;              //8T
V=xx*6+(xx>>2)-U*10;      //13T
W=((xx&3)*5)>>1;          //7
X=(xx&1)*5;               //5T
共33T,比查表少周期数和代码数。不过不好理解公式。
-----------------------------------------------------------------------

夜猫子啊……
:-)

如果我24楼的表都是放在RAM中呢?应该是最快的了吧?
XA144F
4楼-- · 2020-01-24 08:39
CAL_FLO:
                MOV        A,7BH
                MOV        B,#04H
                MUL        AB
                MOV        B,A
                MOV        DPTR,#TMPX0

                MOVC        A,@A+DPTR
                MOV        73H,A

                MOV        A,B
                INC        DPTR
                MOVC        A,@A+DPTR
                MOV        74H,A

                MOV        A,B
                INC        DPTR
                MOVC        A,@A+DPTR
                MOV        75H,A

                MOV        A,B
                INC        DPTR
                MOVC        A,@A+DPTR
                MOV        76H,A
       
                RET

TMP00:        DB        '0000'
TMP01:        DB        '0625'
TMP02:        DB        '1250'
TMP03:        DB        '1875'
TMP04:        DB        '2500'
TMP05:        DB        '3125'
TMP06:        DB        '3750'
TMP07:        DB        '4375'
TMP08:        DB        '5000'
TMP09:        DB        '5625'
TMP0A:        DB        '6250'
TMP0B:        DB        '6875'
TMP0C:        DB        '7500'
TMP0D:        DB        '8125'
TMP0E:        DB        '8750'
TMP0F:        DB        '9375'

正好,也是33个周期。
hsztc
5楼-- · 2020-01-24 10:41
 精彩回答 2  元偷偷看……
hsztc
6楼-- · 2020-01-24 13:50
将我写的AVR C直接转成相应的51汇编,要53T,因为51和AVR结构不同,所以如果用51的方法写应该会更少写,不用查表。

CAL_FLO:MOV     A,7BH        ;U
        MOV     B,#5
        MUL     AB
        MOV     B,#8
        DIV     AB
        MOV     73H,A
        
        MOV     A,7BH        ;V
        ADD     A,73H
        MOV     B,#6
        MUL     AB
        MOV     B,A
        MOV     A,7BH
        RR      A
        RR      A
        ADD     A,B
        ANL     A,#0FH
        MOV     74H,A
        
        MOV     A,7BH         ;W
        ANL     A,#3
        MOV     B,#5
        MUL     AB
        CLR     C
        RRC     A
        MOV     75H,A
        
        MOV     A,7BH          ;X
        ANL     A,#1
        MOV     B,#5
        MUL     AB
        MOV     76H,A

        RET

一周热门 更多>