📄 filter.lst
字号:
ARM COMPILER V2.53, filter 22/09/07 23:08:05 PAGE 1
ARM COMPILER V2.53, COMPILATION OF MODULE filter
OBJECT MODULE PLACED IN filter.OBJ
COMPILER INVOKED BY: D:\Keil\ARM\BIN\CA.exe filter.c ARM BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************
2 filter.c file
3 作者:lig&lij
4 建立日期:2006-4-25
5 修改日期:2006-4-25
6 版本:V1.0
7 **********************************************************************/
8
9 #include <ADuC7020.H>
10 #include"stdio.h"
11 #include "my_type.h"
12 #include "LED.H"
13 #include "interrupt.h"
14 #include "Timer.h"
15 #include "UART.H"
16 #include "ADC.h"
17 #include "others.h"
18
19 #define LEN 6 //移动算术平均的个数+2=SHIFT<<2+2
20 #define SHIFT 2 //2^SHIFT
21 ///////////////////////////////////////////////////
22 //extern uint16 AD_value[5];
23
24 ///////////////////////////////////////////////////
25 uint8 pdata; //移动指针
26 uint8 pmax,pmin; //记录数据表中最大值和最小值的位置,
27 //在一般的数据采集系统中,数据的长度>=8,
28 //因此用指针记录而不是直接记录最大值和最小值
29 uint16 datas[LEN];
30
31 uint16 szlb(uint16 _data)
32 {
33 1 /****************************/
34 1 /* 在调用此子程序前必须对 */
35 1 /* pdata,datas[]数组, */
36 1 /* pmax,pmin进行初始化 */
37 1 /****************************/
38 1
39 1 uint8 i;
40 1 uint32 average1=0;
41 1 uint16 average=0; //清零,用来计算平均值
42 1 pdata=(pdata+1)%LEN; //指针下标在0到LEN-1上滑动
43 1 datas[pdata]=_data; //采样所得数据存入数据表中
44 1 for(i=0;i<LEN;i++)
45 1 average1+=datas[i]; //求所有数据总和
46 1
47 1 /*******去除被认为是脉冲的数据******/
48 1 if(_data>datas[pmax])
49 1 pmax=pdata; //得到最大值的指针
50 1 else if(_data<datas[pmin])
51 1 pmin=pdata; //得到最小值的指针
52 1 if(pdata==pmax) //如果当前输入值将存入当前最大值的位置时
53 1 { //由以上方法将不可行,必须从其他位置中查找极值
54 2 for(i=0;i<LEN;i++)
55 2 if(datas[i]>datas[pmax])
56 2 pmax=i;
57 2 }
58 1 else if(pdata==pmin)//如果当前输入值将存入当前最大值的位置时
59 1 { //由以上方法将不可行,必须从其他位置中查找极值
ARM COMPILER V2.53, filter 22/09/07 23:08:05 PAGE 2
60 2 for(i=0;i<LEN;i++)
61 2 if(datas[i]<datas[pmin])
62 2 pmin=i;
63 2 }
64 1 average=average1-datas[pmax]-datas[pmin];//减去脉冲
65 1
66 1 return (average>>SHIFT); //求算术平均值
67 1 }
ARM COMPILER V2.53, filter 22/09/07 23:08:05 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE32 (?C?SDIV?A)
*** PUBLICS:
PUBLIC szlb?A
PUBLIC pdata
PUBLIC pmax
PUBLIC pmin
PUBLIC datas
*** DATA SEGMENT '?DT0?filter':
00000000 datas:
00000000 DS 12
0000000C pdata:
0000000C DS 1
0000000D pmax:
0000000D DS 1
0000000E pmin:
0000000E DS 1
*** CODE SEGMENT '?PR?szlb?A?filter':
31: uint16 szlb(uint16 _data)
00000000 E92D40F0 STMDB R13!,{R4-R7,LR}
00000004 E1A07000 MOV R7,R0 ; _data
00000008 ---- Variable '_data' assigned to Register 'R7' ----
32: {
00000008 ; SCOPE-START
40: uint32 average1=0;
00000008 E3A03000 MOV R3,#0x0
0000000C ---- Variable 'average1' assigned to Register 'R3' ----
41: uint16 average=0; //清零,用来计算平均值
0000000C E3A02000 MOV R2,#0x0
00000010 ---- Variable 'average' assigned to Register 'R2' ----
42: pdata=(pdata+1)%LEN; //指针下标在0到LEN-1上滑动
00000010 E5100000 LDR R0,=pdata ; pdata
00000014 E5D00000 LDRB R0,[R0,#0x0] ; pdata
00000018 E2800001 ADD R0,R0,#0x0001
0000001C E3A01006 MOV R1,#0x6
00000020 EBFFFFF6 BL ?C?SDIV?A ; Targ=0x0 ; ?C?SDIV?A
00000024 E1A01000 MOV R1,R0
00000028 E1A01C01 MOV R1,R1,LSL #24
0000002C E1A01C21 MOV R1,R1,LSR #24
00000030 E5100000 LDR R0,=pdata ; pdata
00000034 E5C01000 STRB R1,[R0,#0x0] ; pdata
43: datas[pdata]=_data; //采样所得数据存入数据表中
00000038 E1A00007 MOV R0,R7 ; _data
0000003C E5101000 LDR R1,=pdata ; pdata
00000040 E5D16000 LDRB R6,[R1,#0x0] ; pdata
00000044 E1A04006 MOV R4,R6
00000048 E1A04084 MOV R4,R4,LSL #1
0000004C E5101000 LDR R1,=datas ; datas
00000050 E18100B4 STRH R0,[R1,R4]
44: for(i=0;i<LEN;i++)
00000054 E3A04000 MOV R4,#0x0
00000058 E1A01004 MOV R1,R4 ; i
0000005C ---- Variable 'i' assigned to Register 'R1' ----
0000005C EA000008 B L_3 ; Targ=0x84
00000060 L_4:
45: average1+=datas[i]; //求所有数据总和
00000060 E1A00001 MOV R0,R1 ; i
00000064 E1A05C00 MOV R5,R0,LSL #24 ; i
00000068 E1A05C25 MOV R5,R5,LSR #24
0000006C E1A05085 MOV R5,R5,LSL #1
ARM COMPILER V2.53, filter 22/09/07 23:08:05 PAGE 4
00000070 E5100000 LDR R0,=datas ; datas
00000074 E19000B5 LDRH R0,[R0,R5]
00000078 E0833000 ADD R3,R3,R0 ; average1
0000007C E2811001 ADD R1,R1,#0x0001 ; i
00000080 E20110FF AND R1,R1,#0x00FF
00000084 L_3:
00000084 E1A00001 MOV R0,R1 ; i
00000088 E1A00C00 MOV R0,R0,LSL #24 ; i
0000008C E1A00C20 MOV R0,R0,LSR #24
00000090 E3500006 CMP R0,#0x0006
00000094 BAFFFFF1 BLT L_4 ; Targ=0x60
48: if(_data>datas[pmax])
00000098 E5100000 LDR R0,=pmax ; pmax
0000009C E5D00000 LDRB R0,[R0,#0x0] ; pmax
000000A0 E1A05000 MOV R5,R0
000000A4 E1A05085 MOV R5,R5,LSL #1
000000A8 E5100000 LDR R0,=datas ; datas
000000AC E19000B5 LDRH R0,[R0,R5]
000000B0 E1A05000 MOV R5,R0
000000B4 E1A00007 MOV R0,R7 ; _data
000000B8 E1A00800 MOV R0,R0,LSL #16 ; _data
000000BC E1A00820 MOV R0,R0,LSR #16
000000C0 E1500005 CMP R0,R5
000000C4 9A000002 BLS L_6 ; Targ=0xD4
49: pmax=pdata; //得到最大值的指针
000000C8 E5100000 LDR R0,=pmax ; pmax
000000CC E5C06000 STRB R6,[R0,#0x0] ; pmax
000000D0 EA00000D B L_7 ; Targ=0x10C
000000D4 L_6:
50: else if(_data<datas[pmin])
000000D4 E5100000 LDR R0,=pmin ; pmin
000000D8 E5D00000 LDRB R0,[R0,#0x0] ; pmin
000000DC E1A05000 MOV R5,R0
000000E0 E1A05085 MOV R5,R5,LSL #1
000000E4 E5100000 LDR R0,=datas ; datas
000000E8 E19000B5 LDRH R0,[R0,R5]
000000EC E1A05000 MOV R5,R0
000000F0 E1A00007 MOV R0,R7 ; _data
000000F4 E1A00800 MOV R0,R0,LSL #16 ; _data
000000F8 E1A00820 MOV R0,R0,LSR #16
000000FC E1500005 CMP R0,R5
00000100 2A000001 BCS L_7 ; Targ=0x10C
51: pmin=pdata; //得到最小值的指针
00000104 E5100000 LDR R0,=pmin ; pmin
00000108 E5C06000 STRB R6,[R0,#0x0] ; pmin
0000010C L_7:
52: if(pdata==pmax) //如果当前输入值将存入当前最大值的位置时
0000010C E5100000 LDR R0,=pmax ; pmax
00000110 E5D00000 LDRB R0,[R0,#0x0] ; pmax
00000114 E1A05000 MOV R5,R0
00000118 E1A00006 MOV R0,R6
0000011C E1500005 CMP R0,R5
00000120 1A00001B BNE L_9 ; Targ=0x194
54: for(i=0;i<LEN;i++)
00000124 E1A01004 MOV R1,R4 ; i
00000128 EA000013 B L_12 ; Targ=0x17C
0000012C L_13:
55: if(datas[i]>datas[pmax])
0000012C E5105000 LDR R5,=pmax ; pmax
00000130 E5D55000 LDRB R5,[R5,#0x0] ; pmax
00000134 E1A06005 MOV R6,R5
00000138 E1A06086 MOV R6,R6,LSL #1
0000013C E5105000 LDR R5,=datas ; datas
00000140 E19550B6 LDRH R5,[R5,R6]
00000144 E1A06005 MOV R6,R5
00000148 E1A05001 MOV R5,R1 ; i
ARM COMPILER V2.53, filter 22/09/07 23:08:05 PAGE 5
0000014C E1A07C05 MOV R7,R5,LSL #24 ; i
00000150 E1A07C27 MOV R7,R7,LSR #24
00000154 E1A07087 MOV R7,R7,LSL #1
00000158 E5105000 LDR R5,=datas ; datas
0000015C E19550B7 LDRH R5,[R5,R7]
00000160 E1550006 CMP R5,R6
00000164 9A000002 BLS L_10 ; Targ=0x174
56: pmax=i;
00000168 E1A06001 MOV R6,R1 ; i
0000016C E5105000 LDR R5,=pmax ; pmax
00000170 E5C56000 STRB R6,[R5,#0x0] ; pmax
00000174 L_10:
00000174 E2811001 ADD R1,R1,#0x0001 ; i
00000178 E20110FF AND R1,R1,#0x00FF
0000017C L_12:
0000017C E1A05001 MOV R5,R1 ; i
00000180 E1A05C05 MOV R5,R5,LSL #24 ; i
00000184 E1A05C25 MOV R5,R5,LSR #24
00000188 E3550006 CMP R5,#0x0006
0000018C BAFFFFE6 BLT L_13 ; Targ=0x12C
57: }
00000190 EA00001E B L_16 ; Targ=0x210
00000194 L_9:
58: else if(pdata==pmin)//如果当前输入值将存入当前最大值的位置时
00000194 E5105000 LDR R5,=pmin ; pmin
00000198 E5D55000 LDRB R5,[R5,#0x0] ; pmin
0000019C E1500005 CMP R0,R5
000001A0 1A00001A BNE L_16 ; Targ=0x210
60: for(i=0;i<LEN;i++)
000001A4 E1A01004 MOV R1,R4 ; i
000001A8 EA000013 B L_20 ; Targ=0x1FC
000001AC L_21:
61: if(datas[i]<datas[pmin])
000001AC E5100000 LDR R0,=pmin ; pmin
000001B0 E5D00000 LDRB R0,[R0,#0x0] ; pmin
000001B4 E1A04000 MOV R4,R0
000001B8 E1A04084 MOV R4,R4,LSL #1
000001BC E5100000 LDR R0,=datas ; datas
000001C0 E19000B4 LDRH R0,[R0,R4]
000001C4 E1A04000 MOV R4,R0
000001C8 E1A00001 MOV R0,R1 ; i
000001CC E1A05C00 MOV R5,R0,LSL #24 ; i
000001D0 E1A05C25 MOV R5,R5,LSR #24
000001D4 E1A05085 MOV R5,R5,LSL #1
000001D8 E5100000 LDR R0,=datas ; datas
000001DC E19000B5 LDRH R0,[R0,R5]
000001E0 E1500004 CMP R0,R4
000001E4 2A000002 BCS L_18 ; Targ=0x1F4
62: pmin=i;
000001E8 E1A04001 MOV R4,R1 ; i
000001EC E5100000 LDR R0,=pmin ; pmin
000001F0 E5C04000 STRB R4,[R0,#0x0] ; pmin
000001F4 L_18:
000001F4 E2811001 ADD R1,R1,#0x0001 ; i
000001F8 E20110FF AND R1,R1,#0x00FF
000001FC L_20:
000001FC E1A00001 MOV R0,R1 ; i
00000200 E1A00C00 MOV R0,R0,LSL #24 ; i
00000204 E1A00C20 MOV R0,R0,LSR #24
00000208 E3500006 CMP R0,#0x0006
0000020C BAFFFFE6 BLT L_21 ; Targ=0x1AC
63: }
00000210 L_16:
64: average=average1-datas[pmax]-datas[pmin];//减去脉冲
00000210 E5100000 LDR R0,=pmax ; pmax
00000214 E5D00000 LDRB R0,[R0,#0x0] ; pmax
ARM COMPILER V2.53, filter 22/09/07 23:08:05 PAGE 6
00000218 E1A01000 MOV R1,R0
0000021C E1A01081 MOV R1,R1,LSL #1
00000220 E5100000 LDR R0,=datas ; datas
00000224 E19000B1 LDRH R0,[R0,R1]
00000228 E1A02003 MOV R2,R3 ; average1
0000022C E0422000 SUB R2,R2,R0 ; average1
00000230 E5100000 LDR R0,=pmin ; pmin
00000234 E5D00000 LDRB R0,[R0,#0x0] ; pmin
00000238 E1A01000 MOV R1,R0
0000023C E1A01081 MOV R1,R1,LSL #1
00000240 E5100000 LDR R0,=datas ; datas
00000244 E19000B1 LDRH R0,[R0,R1]
00000248 E0422000 SUB R2,R2,R0
0000024C E1A02802 MOV R2,R2,LSL #16
00000250 E1A02822 MOV R2,R2,LSR #16
66: return (average>>SHIFT); //求算术平均值
00000254 E1A00002 MOV R0,R2 ; average
00000258 E1A00800 MOV R0,R0,LSL #16 ; average
0000025C E1A00820 MOV R0,R0,LSR #16
00000260 E1A00120 MOV R0,R0,LSR #2
00000264 ; SCOPE-END
00000264 E8BD00F0 LDMIA R13!,{R4-R7}
00000268 E8BD0008 LDMIA R13!,{R3}
0000026C E12FFF13 BX R3
00000270 ENDP ; 'szlb?A'
Module Information Static
----------------------------------
code size = ------
data size = 15
const size = ------
End of Module Information.
ARM COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -