📄 timer.lst
字号:
1 .file "timer.c"
2 .arch atmega128
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
86 TimerHPLClockSetInterval:
1:timer.c **** /*
2:timer.c **** ****************************************************************************
3:timer.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
4:timer.c **** * http:\\www.nbicc.com
5:timer.c **** *文件名: timer.h
6:timer.c **** *程序员: 夏鹏 xpsonny@nbicc.com
7:timer.c **** *主要内容 定时器
8:timer.c ****
9:timer.c **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
10:timer.c **** ****************************************************************************
11:timer.c **** */
12:timer.c ****
13:timer.c **** #include "timer.h"
14:timer.c **** #include "fun.h"
15:timer.c **** #include "os.h"
16:timer.c **** //static result_t TimerStdControlStart(void);
17:timer.c **** static result_t TimerTimerFired(uint8_t id); // 加入定时要触发的程序
18:timer.c **** static void TimerAdjustInterval(void);
19:timer.c **** static result_t TimerDefaultFired(uint8_t id);
20:timer.c **** static void TimerEnqueue(uint8_t value);
21:timer.c **** static uint8_t TimerDequeue(void);
22:timer.c **** static void TimerSignalOneTimer(void);
23:timer.c **** static void TimerHandleFire(void);
24:timer.c **** static result_t TimerClockFire(void);
25:timer.c **** static void TimerHPLClockSetInterval(uint8_t value);
26:timer.c **** static result_t TimerHPLClockSetRate(char interval, char scale);
27:timer.c **** static uint32_t TimerM_mState;
28:timer.c **** static uint8_t TimerM_setIntervalFlag;
29:timer.c **** static uint8_t TimerM_mScale;
30:timer.c ****
31:timer.c **** static uint8_t TimerM_mInterval;
32:timer.c **** static int8_t TimerM_queue_head;
33:timer.c **** static int8_t TimerM_queue_tail;
34:timer.c **** static uint8_t TimerM_queue_size;
35:timer.c **** static uint8_t TimerM_queue[NUM_TIMERS];
36:timer.c ****
37:timer.c **** static uint8_t HPLClock_set_flag;
38:timer.c **** static uint8_t HPLClock_mscale;
39:timer.c **** static uint8_t HPLClock_nextScale;
40:timer.c **** static uint8_t HPLClock_minterval;
41:timer.c ****
42:timer.c **** struct TimerM_timer_s {
43:timer.c **** uint8_t type;
44:timer.c **** int32_t ticks;
45:timer.c **** int32_t ticksLeft;
46:timer.c **** } TimerM_mTimerList[NUM_TIMERS];
47:timer.c **** ///
48:timer.c **** /*
49:timer.c **** static result_t TimerStdControlStart(void)
50:timer.c **** {
51:timer.c **** return SUCCESS;
52:timer.c **** }
53:timer.c **** */
54:timer.c **** static result_t TimerHPLClockSetRate(char interval, char scale)
55:timer.c **** {
56:timer.c **** scale &= 0x7;
57:timer.c **** scale |= 0x8;
58:timer.c **** { uint8_t atomicState = AtomicStart();
59:timer.c **** {
60:timer.c **** * (volatile unsigned char *)(0x37 + 0x20) &= ~(1 << 0);
61:timer.c **** * (volatile unsigned char *)(0x37 + 0x20) &= ~(1 << 1);
62:timer.c **** * (volatile unsigned char *)(0x30 + 0x20) |= 1 << 3;
63:timer.c ****
64:timer.c ****
65:timer.c **** * (volatile unsigned char *)(0x33 + 0x20) = scale;
66:timer.c **** * (volatile unsigned char *)(0x32 + 0x20) = 0;
67:timer.c **** * (volatile unsigned char *)(0x31 + 0x20) = interval;
68:timer.c **** * (volatile unsigned char *)(0x37 + 0x20) |= 1 << 1;
69:timer.c **** }
70:timer.c **** AtomicEnd(atomicState); }
71:timer.c **** return SUCCESS;
72:timer.c **** }
73:timer.c ****
74:timer.c **** static void TimerHPLClockSetInterval(uint8_t value)
75:timer.c **** {
88 .LM1:
89 /* prologue: frame size=0 */
90 /* prologue end (size=0) */
76:timer.c **** * (volatile unsigned char *)(0x31 + 0x20) = value;
92 .LM2:
93 0000 81BF out 81-0x20,r24
94 /* epilogue: frame size=0 */
95 0002 0895 ret
96 /* epilogue end (size=1) */
97 /* function TimerHPLClockSetInterval size 2 (1) */
101 .global TimerTimerStop
103 TimerTimerStop:
77:timer.c **** }
78:timer.c ****
79:timer.c **** static void TimerAdjustInterval(void)
80:timer.c **** {
81:timer.c **** uint8_t i;
82:timer.c **** uint8_t val = TimerM_maxTimerInterval;
83:timer.c ****
84:timer.c **** if (TimerM_mState) {
85:timer.c **** for (i = 0; i < NUM_TIMERS; i++) {
86:timer.c **** if (TimerM_mState & (0x1 << i) && TimerM_mTimerList[i].ticksLeft < val) {
87:timer.c **** val = TimerM_mTimerList[i].ticksLeft;
88:timer.c **** }
89:timer.c **** }
90:timer.c **** { uint8_t atomicState = AtomicStart();
91:timer.c **** {
92:timer.c **** TimerM_mInterval = val;
93:timer.c **** TimerHPLClockSetInterval(TimerM_mInterval);
94:timer.c **** TimerM_setIntervalFlag = 0;
95:timer.c **** }
96:timer.c **** AtomicEnd(atomicState); }
97:timer.c **** }
98:timer.c **** else {
99:timer.c **** { uint8_t atomicState = AtomicStart();
100:timer.c **** {
101:timer.c **** TimerM_mInterval = TimerM_maxTimerInterval;
102:timer.c **** TimerHPLClockSetInterval(TimerM_mInterval);
103:timer.c **** TimerM_setIntervalFlag = 0;
104:timer.c **** }
105:timer.c **** AtomicEnd(atomicState); }
106:timer.c **** }
107:timer.c **** PowerManagementAdjust();
108:timer.c **** }
109:timer.c ****
110:timer.c **** result_t TimerTimerStop(uint8_t id)
111:timer.c **** {
105 .LM3:
106 /* prologue: frame size=0 */
107 0004 CF92 push r12
108 0006 DF92 push r13
109 0008 EF92 push r14
110 000a FF92 push r15
111 000c 0F93 push r16
112 000e 1F93 push r17
113 0010 CF93 push r28
114 0012 DF93 push r29
115 /* prologue end (size=8) */
112:timer.c ****
113:timer.c **** if (id >= NUM_TIMERS)
117 .LM4:
118 0014 8230 cpi r24,lo8(2)
119 0016 08F0 brlo .+2
120 0018 4EC0 rjmp .L4
114:timer.c **** {
115:timer.c **** return FAIL;
116:timer.c **** }
117:timer.c **** if (TimerM_mState & (0x1 << id)) {
122 .LM5:
123 001a 91E0 ldi r25,lo8(1)
124 001c C92E mov r12,r25
125 001e D12C mov r13,__zero_reg__
126 0020 E601 movw r28,r12
127 0022 02C0 rjmp 2f
128 0024 CC0F 1: lsl r28
129 0026 DD1F rol r29
130 0028 8A95 2: dec r24
131 002a E2F7 brpl 1b
132 002c 9E01 movw r18,r28
133 002e 4427 clr r20
134 0030 37FD sbrc r19,7
135 0032 4095 com r20
136 0034 542F mov r21,r20
137 0036 8091 0000 lds r24,TimerM_mState
138 003a 9091 0000 lds r25,(TimerM_mState)+1
139 003e A091 0000 lds r26,(TimerM_mState)+2
140 0042 B091 0000 lds r27,(TimerM_mState)+3
141 0046 8223 and r24,r18
142 0048 9323 and r25,r19
143 004a A423 and r26,r20
144 004c B523 and r27,r21
145 004e 0097 sbiw r24,0
146 0050 A105 cpc r26,__zero_reg__
147 0052 B105 cpc r27,__zero_reg__
148 0054 81F1 breq .L4
149 .LBB2:
118:timer.c **** { uint8_t atomicState = AtomicStart();
151 .LM6:
152 0056 0E94 0000 call AtomicStart
119:timer.c **** TimerM_mState &= ~(0x1 << id);
154 .LM7:
155 005a C095 com r28
156 005c D095 com r29
157 005e 9E01 movw r18,r28
158 0060 4427 clr r20
159 0062 37FD sbrc r19,7
160 0064 4095 com r20
161 0066 542F mov r21,r20
162 0068 E090 0000 lds r14,TimerM_mState
163 006c F090 0000 lds r15,(TimerM_mState)+1
164 0070 0091 0000 lds r16,(TimerM_mState)+2
165 0074 1091 0000 lds r17,(TimerM_mState)+3
166 0078 E222 and r14,r18
167 007a F322 and r15,r19
168 007c 0423 and r16,r20
169 007e 1523 and r17,r21
170 0080 E092 0000 sts TimerM_mState,r14
171 0084 F092 0000 sts (TimerM_mState)+1,r15
172 0088 0093 0000 sts (TimerM_mState)+2,r16
173 008c 1093 0000 sts (TimerM_mState)+3,r17
120:timer.c **** AtomicEnd(atomicState); }
175 .LM8:
176 0090 0E94 0000 call AtomicEnd
177 .LBE2:
121:timer.c **** if (!TimerM_mState) {
179 .LM9:
180 0094 8091 0000 lds r24,TimerM_mState
181 0098 9091 0000 lds r25,(TimerM_mState)+1
182 009c A091 0000 lds r26,(TimerM_mState)+2
183 00a0 B091 0000 lds r27,(TimerM_mState)+3
184 00a4 0097 sbiw r24,0
185 00a6 A105 cpc r26,__zero_reg__
186 00a8 B105 cpc r27,__zero_reg__
187 00aa 19F4 brne .L5
122:timer.c **** TimerM_setIntervalFlag = 1;
189 .LM10:
190 00ac 81E0 ldi r24,lo8(1)
191 00ae 8093 0000 sts TimerM_setIntervalFlag,r24
192 .L5:
123:timer.c **** }
124:timer.c **** return SUCCESS;
194 .LM11:
195 00b2 C601 movw r24,r12
196 00b4 02C0 rjmp .L2
197 .L4:
125:timer.c **** }
126:timer.c **** return FAIL;
199 .LM12:
200 00b6 80E0 ldi r24,lo8(0)
201 00b8 90E0 ldi r25,hi8(0)
202 .L2:
203 /* epilogue: frame size=0 */
204 00ba DF91 pop r29
205 00bc CF91 pop r28
206 00be 1F91 pop r17
207 00c0 0F91 pop r16
208 00c2 FF90 pop r15
209 00c4 EF90 pop r14
210 00c6 DF90 pop r13
211 00c8 CF90 pop r12
212 00ca 0895 ret
213 /* epilogue end (size=9) */
214 /* function TimerTimerStop size 101 (84) */
218 TimerSignalOneTimer:
127:timer.c **** }
128:timer.c ****
129:timer.c **** static result_t TimerDefaultFired(uint8_t id)
130:timer.c **** {
131:timer.c **** return SUCCESS;
132:timer.c **** }
133:timer.c ****
134:timer.c **** static result_t TimerTimerFired(uint8_t id)
135:timer.c **** {
136:timer.c **** unsigned char result;
137:timer.c **** switch (id) {
138:timer.c **** case 1: //hladd
139:timer.c ****
140:timer.c **** result = Timer0_1_Fired();
141:timer.c **** break;
142:timer.c ****
143:timer.c **** case 0:
144:timer.c **** result = Timer0_0_Fired() ;
145:timer.c **** break;
146:timer.c ****
147:timer.c **** default:
148:timer.c **** result = TimerDefaultFired(id);
149:timer.c **** }
150:timer.c **** return result;
151:timer.c ****
152:timer.c **** }
153:timer.c ****
154:timer.c **** static uint8_t TimerDequeue(void)
155:timer.c **** {
156:timer.c **** if (TimerM_queue_size == 0) {
157:timer.c **** return NUM_TIMERS;
158:timer.c **** }
159:timer.c **** if (TimerM_queue_head == NUM_TIMERS - 1) {
160:timer.c **** TimerM_queue_head = -1;
161:timer.c **** }
162:timer.c **** TimerM_queue_head++;
163:timer.c **** TimerM_queue_size--;
164:timer.c **** return TimerM_queue[(uint8_t )TimerM_queue_head];
165:timer.c **** }
166:timer.c ****
167:timer.c **** static void TimerSignalOneTimer(void)
168:timer.c **** {
220 .LM13:
221 /* prologue: frame size=0 */
222 /* prologue end (size=0) */
223 .LBB3:
224 .LBB4:
226 .LM14:
227 00cc 9091 0000 lds r25,TimerM_queue_size
228 00d0 9923 tst r25
229 00d2 19F4 brne .L7
231 .LM15:
232 00d4 82E0 ldi r24,lo8(2)
233 00d6 90E0 ldi r25,hi8(2)
234 00d8 15C0 rjmp .L8
235 .L7:
237 .LM16:
238 00da 8091 0000 lds r24,TimerM_queue_head
239 00de 8130 cpi r24,lo8(1)
240 00e0 19F4 brne .L9
242 .LM17:
243 00e2 8FEF ldi r24,lo8(-1)
244 00e4 8093 0000 sts TimerM_queue_head,r24
245 .L9:
247 .LM18:
248 00e8 8091 0000 lds r24,TimerM_queue_head
249 00ec 8F5F subi r24,lo8(-(1))
250 00ee 8093 0000 sts TimerM_queue_head,r24
252 .LM19:
253 00f2 9150 subi r25,lo8(-(-1))
254 00f4 9093 0000 sts TimerM_queue_size,r25
255 00f8 E82F mov r30,r24
256 00fa FF27 clr r31
257 00fc E050 subi r30,lo8(-(TimerM_queue))
258 00fe F040 sbci r31,hi8(-(TimerM_queue))
259 0100 8081 ld r24,Z
260 0102 9927 clr r25
261 .L8:
262 .LBE4:
263 .LBE3:
169:timer.c **** uint8_t itimer = TimerDequeue();
170:timer.c ****
171:timer.c **** if (itimer < NUM_TIMERS) {
265 .LM20:
266 0104 8230 cpi r24,lo8(2)
267 0106 50F4 brsh .L6
268 .LBB5:
269 .LBB6:
271 .LM21:
272 0108 9927 clr r25
273 010a 0097 sbiw r24,0
274 010c 29F0 breq .L13
275 010e 0197 sbiw r24,1
276 0110 29F4 brne .L6
278 .LM22:
279 0112 0E94 0000 call Timer0_1_Fired
281 .LM23:
282 0116 0895 ret
283 .L13:
285 .LM24:
286 0118 0E94 0000 call Timer0_0_Fired
287 .L6:
288 011c 0895 ret
289 .LBE6:
290 .LBE5:
291 /* epilogue: frame size=0 */
292 /* epilogue: noreturn */
293 /* epilogue end (size=0) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -