⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 3 页
字号:
   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 + -