3098|4

1万

帖子

25

TA的资源

裸片初长成(高级)

楼主
 

去极值平均,有没有更好的办法? [复制链接]

         现有N个数,假设N = 8 ,需要对这8个数求和,并在这8个数中找出最大值和最小值,在总和中减去。      这8个数存于数组ABC[8]中,MaxMin[2]数组中存放最大值及最小值。
      返回6个数的累加结果在ACC中。 -------  使用的CPU为 C28
C28程序如下:


        MOVL        XAR7, #_ABC
        RPT                #7 ||MAX AH, *XAR7++
        MOV                @_MaxMin, AH
        MOVL        XAR7, #_ABC
        RPT                #7 ||MIN AL, *XAR7++
        MOV                @_MaxMin + 1 , AL
        MOVL        XAR7, #_ABC
        RPT             #7        || ADD ACC, *XAR7++
        SUB                ACC, @_MaxMin
        SUB                ACC, @_MaxMin + 1


     总感觉这段程序没有达到最简,执行周期达31个!大伙看看怎么使用指令会使它更简单?


最新回复

本帖最后由 rjqsd 于 2016-3-15 21:31 编辑 关注,汇编好难。。。我在ADC采样中是下面这样用的,同时对6个通道滤波,感觉非常非常耗时间。         static Uint16 cnt = 0;         Uint16 adc_i,adc_j;         Uint16 max,min;         //===========================================================================         for (adc_i = 0;adc_i<6;adc_i++){                 max = 0;                 min = 50000;                 ADC_SUM[adc_i] = 0;                 ADC_Store[adc_i][cnt] = ADC_Results[adc_i];//更新新的ADC值                 for(adc_j=0;adc_j<8;adc_j++){                         ADC_SUM[adc_i] = ADC_SUM[adc_i] + ADC_Store[adc_i][adc_j];                         if(ADC_Store[adc_i][adc_j] > max)                                 max = ADC_Store[adc_i][adc_j];                         if(ADC_Store[adc_i][adc_j] < min)                                 min = ADC_Store[adc_i][adc_j];                 }                 ADC_SUM[adc_i] = ADC_SUM[adc_i] - max - min;         }         if(cnt >= 7)                 cnt = 0;         else                 cnt++; 复制代码  详情 回复 发表于 2016-3-15 18:40
 
点赞 关注

回复
举报

6423

帖子

16

TA的资源

版主

沙发
 
持续关注,表示想了想没想出什么好办法来
 
个人签名training
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 rjqsd 于 2016-3-15 21:31 编辑

关注,汇编好难。。。我在ADC采样中是下面这样用的,同时对6个通道滤波,感觉非常非常耗时间。


  1.         static Uint16 cnt = 0;
  2.         Uint16 adc_i,adc_j;
  3.         Uint16 max,min;

  4.         //===========================================================================

  5.         for (adc_i = 0;adc_i<6;adc_i++){
  6.                 max = 0;
  7.                 min = 50000;

  8.                 ADC_SUM[adc_i] = 0;
  9.                 ADC_Store[adc_i][cnt] = ADC_Results[adc_i];//更新新的ADC值

  10.                 for(adc_j=0;adc_j<8;adc_j++){
  11.                         ADC_SUM[adc_i] = ADC_SUM[adc_i] + ADC_Store[adc_i][adc_j];

  12.                         if(ADC_Store[adc_i][adc_j] > max)
  13.                                 max = ADC_Store[adc_i][adc_j];
  14.                         if(ADC_Store[adc_i][adc_j] < min)
  15.                                 min = ADC_Store[adc_i][adc_j];
  16.                 }
  17.                 ADC_SUM[adc_i] = ADC_SUM[adc_i] - max - min;
  18.         }

  19.         if(cnt >= 7)
  20.                 cnt = 0;
  21.         else
  22.                 cnt++;

复制代码

点评

C28的CPU,跳转指令需要四个周期,判断跳转至少再加一个指令 ---- 一个周期。 在C语言编程时所用的 if 语句肯定要使用判断、跳转方法的。这样执行的周期会长一些。 你的C语句的 FOR 循环内部再加判断,这样执行的  详情 回复 发表于 2016-3-15 18:56
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

4
 
rjqsd 发表于 2016-3-15 18:40
关注,汇编好难。。。我在ADC采样中是下面这样用的,同时对6个通道滤波,感觉非常非常耗时间。

C28的CPU,跳转指令需要四个周期,判断跳转至少再加一个指令 ---- 一个周期。
在C语言编程时所用的 if 语句肯定要使用判断、跳转方法的。这样执行的周期会长一些。
你的C语句的 FOR 循环内部再加判断,这样执行的时间就更长。

CCS编译器并不太聪明,我试过在不同优化时生成的汇编指令,均没有采用C28最快的指令。多少都要绕些圈子。

我上面的汇编,没有使用判断、跳转,无形中就节省时间了。
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

5
 
发现一楼的程序可以将
MOVL        XAR7, #_ABC
装载首地址的三个省去两个,办法是使用--XARn寻址:


        MOVL        XAR7, #_ABC
        RPT                #7 ||MAX AH, *XAR7++
        MOV                @_MaxMin, AH
       ; MOVL        XAR7, #_ABC -------省去
        RPT                #7 ||MIN AL, *--XAR7  ;用递减寻址。
        MOV                @_MaxMin + 1 , AL
       ; MOVL        XAR7, #_ABC   -------省去
        RPT             #7        || ADD ACC, *XAR7++
        SUB                ACC, @_MaxMin
        SUB                ACC, @_MaxMin + 1
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表