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

📄 kertimer.lst

📁 无线传感器星型网络的节点的基站程序,采用802.15.4协议
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"kertimer.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:
 223               	timer0_setInterval:
   1:kertimer.c    **** //----------------------------------------------------//
   2:kertimer.c    **** //-------Institute Of  Computing Technology-----------//
   3:kertimer.c    **** //------------Chinese Academic  Science---------------//
   4:kertimer.c    **** //-----中国科学院计算技术研究所先进测试技术实验室-----//
   5:kertimer.c    **** //----------------------------------------------------//
   6:kertimer.c    **** 
   7:kertimer.c    **** // **************************************************
   8:kertimer.c    **** // * @copyright:nbicc_lpp
   9:kertimer.c    **** // * @this is timer0 support
  10:kertimer.c    **** // * @author zhouqiang  (zhouhongren@163.com)
  11:kertimer.c    **** // *              liulingyi      (lingyiliu@ict.ac.cn)
  12:kertimer.c    **** // * @data:2005.12.02
  13:kertimer.c    **** // * @version:0.0.1
  14:kertimer.c    **** // * @updata:$
  15:kertimer.c    **** // **************************************************
  16:kertimer.c    **** 
  17:kertimer.c    **** 
  18:kertimer.c    **** #include "kertimer.h"
  19:kertimer.c    **** 
  20:kertimer.c    **** //----------------------------------------------------------------
  21:kertimer.c    **** //timer0 setup is added by zhouqiang in 2005.12.02
  22:kertimer.c    **** //----------------------------------------------------------------
  23:kertimer.c    **** /** 
  24:kertimer.c    ****    *  set Timer/Counter0 to be asynchronous 
  25:kertimer.c    ****    *  from the CPU clock with a second external 
  26:kertimer.c    ****    *  clock(32,768kHz)driving it
  27:kertimer.c    ****  **/
  28:kertimer.c    **** static void timer0_hardware_init(uint8_t interval, uint8_t scale){
  29:kertimer.c    **** 	{ os_atomic_t  _nesc_atomic = os_atomic_start();
  30:kertimer.c    **** 		{
  31:kertimer.c    **** 			scale &= 0x7;
  32:kertimer.c    **** 			scale |= 0x8;
  33:kertimer.c    **** 			
  34:kertimer.c    **** 
  35:kertimer.c    **** 			TIMSK &= ((unsigned char)~(1 << (TOIE0)));
  36:kertimer.c    **** 			TIMSK &= ((unsigned char)~(1 << (OCIE0)));
  37:kertimer.c    **** 			//!< Disable TC0 interrupt
  38:kertimer.c    **** 		   	
  39:kertimer.c    **** 			ASSR |= (1 << (AS0));         
  40:kertimer.c    **** 			TCCR0 = scale;    
  41:kertimer.c    **** 			TCNT0 = 0;
  42:kertimer.c    **** 			OCR0 = interval;
  43:kertimer.c    **** 			TIMSK |= (1 << (OCIE0));
  44:kertimer.c    **** 		}
  45:kertimer.c    **** 	os_atomic_end(_nesc_atomic); }
  46:kertimer.c    **** 	
  47:kertimer.c    **** }   
  48:kertimer.c    **** 
  49:kertimer.c    **** static void timer0_setInterval(uint8_t val)
  50:kertimer.c    **** {
 225               	.LM1:
 226               	/* prologue: frame size=0 */
 227               	/* prologue end (size=0) */
 228 0000 282F      		mov r18,r24
  51:kertimer.c    **** 	uint8_t interval;
  52:kertimer.c    **** 	if ((ASSR & (_BV(OCR0UB) | _BV(TCN0UB))) != 0) {
 230               	.LM2:
 231 0002 80B7      		in r24,80-0x20
 232 0004 9927      		clr r25
 233 0006 8670      		andi r24,lo8(6)
 234 0008 9070      		andi r25,hi8(6)
 235 000a 892B      		or r24,r25
 236 000c 61F4      		brne .L1
  53:kertimer.c    **** 	  return;
  54:kertimer.c    **** 	}
  55:kertimer.c    **** 	if(val > 250) {interval = 250;}
 238               	.LM3:
 239 000e 2B3F      		cpi r18,lo8(-5)
 240 0010 10F0      		brlo .L3
 241 0012 8AEF      		ldi r24,lo8(-6)
 242 0014 06C0      		rjmp .L4
 243               	.L3:
  56:kertimer.c    **** 	else if(val <= 2) {interval = 2;}
 245               	.LM4:
 246 0016 2330      		cpi r18,lo8(3)
 247 0018 10F4      		brsh .L5
 248 001a 82E0      		ldi r24,lo8(2)
 249 001c 02C0      		rjmp .L4
 250               	.L5:
  57:kertimer.c    **** 	else {interval = (uint8_t)val - 1;}
 252               	.LM5:
 253 001e 822F      		mov r24,r18
 254 0020 8150      		subi r24,lo8(-(-1))
 255               	.L4:
  58:kertimer.c    **** 	TCNT0 = 0;
 257               	.LM6:
 258 0022 12BE      		out 82-0x20,__zero_reg__
  59:kertimer.c    **** 	OCR0 = interval;
 260               	.LM7:
 261 0024 81BF      		out 81-0x20,r24
 262               	.L1:
 263 0026 0895      		ret
 264               	/* epilogue: frame size=0 */
 265 0028 0895      		ret
 266               	/* epilogue end (size=1) */
 267               	/* function timer0_setInterval size 21 (20) */
 271               	.global	timer0_getInterval
 273               	timer0_getInterval:
  60:kertimer.c    **** 	
  61:kertimer.c    **** }
  62:kertimer.c    **** 
  63:kertimer.c    **** inline uint8_t timer0_getInterval()   {return OCR0 + 1;}
 275               	.LM8:
 276               	/* prologue: frame size=0 */
 277               	/* prologue end (size=0) */
 278 002a 81B7      		in r24,81-0x20
 279 002c 8F5F      		subi r24,lo8(-(1))
 280 002e 9927      		clr r25
 281               	/* epilogue: frame size=0 */
 282 0030 0895      		ret
 283               	/* epilogue end (size=1) */
 284               	/* function timer0_getInterval size 4 (3) */
 287               	.global	timer0_hardware_get_counter
 289               	timer0_hardware_get_counter:
  64:kertimer.c    **** 
  65:kertimer.c    **** inline uint8_t timer0_hardware_get_counter()
  66:kertimer.c    **** {
 291               	.LM9:
 292               	/* prologue: frame size=0 */
 293               	/* prologue end (size=0) */
  67:kertimer.c    **** 	return TCNT0;
 295               	.LM10:
 296 0032 82B7      		in r24,82-0x20
  68:kertimer.c    **** }
 298               	.LM11:
 299 0034 9927      		clr r25
 300               	/* epilogue: frame size=0 */
 301 0036 0895      		ret
 302               	/* epilogue end (size=1) */
 303               	/* function timer0_hardware_get_counter size 3 (2) */
 306               	.global	kertimer_init
 308               	kertimer_init:
  69:kertimer.c    **** 
  70:kertimer.c    **** //----------------------------------------------------------------
  71:kertimer.c    **** //kertimer setup is added by zhouqiang in 2005.12.02,timer0 is used
  72:kertimer.c    **** //----------------------------------------------------------------
  73:kertimer.c    **** 
  74:kertimer.c    **** void kertimer_init(void)
  75:kertimer.c    **** {
 310               	.LM12:
 311               	/* prologue: frame size=0 */
 312 0038 1F93      		push r17
 313               	/* prologue end (size=1) */
  76:kertimer.c    **** 	 mState=0;
 315               	.LM13:
 316 003a 1092 0000 		sts mState,__zero_reg__
 317 003e 1092 0000 		sts (mState)+1,__zero_reg__
 318 0042 1092 0000 		sts (mState)+2,__zero_reg__
 319 0046 1092 0000 		sts (mState)+3,__zero_reg__
  77:kertimer.c    ****         setIntervalFlag = 0;
 321               	.LM14:
 322 004a 1092 0000 		sts setIntervalFlag,__zero_reg__
  78:kertimer.c    ****         queue_head = queue_tail = -1;
 324               	.LM15:
 325 004e 8FEF      		ldi r24,lo8(-1)
 326 0050 8093 0000 		sts queue_tail,r24
 327 0054 8093 0000 		sts queue_head,r24
  79:kertimer.c    ****         queue_size = 0;
 329               	.LM16:
 330 0058 1092 0000 		sts queue_size,__zero_reg__
  80:kertimer.c    ****         mScale = 0x05;//prescale time0 with 128
 332               	.LM17:
 333 005c 85E0      		ldi r24,lo8(5)
 334 005e 8093 0000 		sts mScale,r24
  81:kertimer.c    ****         mInterval = maxTimerInterval;
 336               	.LM18:
 337 0062 16EE      		ldi r17,lo8(-26)
 338 0064 1093 0000 		sts mInterval,r17
 339               	.LBB2:
 340               	.LBB3:
 341               	.LBB4:
 343               	.LM19:
 344 0068 0E94 0000 		call os_atomic_start
 346               	.LM20:
 347 006c 97B7      		in r25,87-0x20
 348 006e 9E7F      		andi r25,lo8(-2)
 349 0070 97BF      		out 87-0x20,r25
 351               	.LM21:
 352 0072 97B7      		in r25,87-0x20
 353 0074 9D7F      		andi r25,lo8(-3)
 354 0076 97BF      		out 87-0x20,r25
 356               	.LM22:
 357 0078 90B7      		in r25,80-0x20
 358 007a 9860      		ori r25,lo8(8)
 359 007c 90BF      		out 80-0x20,r25
 361               	.LM23:
 362 007e 9DE0      		ldi r25,lo8(13)
 363 0080 93BF      		out 83-0x20,r25
 365               	.LM24:
 366 0082 12BE      		out 82-0x20,__zero_reg__
 368               	.LM25:
 369 0084 11BF      		out 81-0x20,r17
 371               	.LM26:
 372 0086 97B7      		in r25,87-0x20
 373 0088 9260      		ori r25,lo8(2)
 374 008a 97BF      		out 87-0x20,r25
 376               	.LM27:
 377 008c 0E94 0000 		call os_atomic_end
 378               	.LBE4:
 379               	.LBE3:
 380               	.LBE2:
 381               	/* epilogue: frame size=0 */
 382 0090 1F91      		pop r17
 383 0092 0895      		ret
 384               	/* epilogue end (size=2) */
 385               	/* function kertimer_init size 46 (43) */
 395               	.global	kertimer_start
 397               	kertimer_start:
  82:kertimer.c    **** 	 timer0_hardware_init(mInterval,mScale);
  83:kertimer.c    **** 
  84:kertimer.c    **** }
  85:kertimer.c    **** 
  86:kertimer.c    **** uint8_t  kertimer_start (uint8_t  id,uint8_t type, uint32_t  interval,void (*fun)(void)) 
  87:kertimer.c    **** {
 399               	.LM28:
 400               	/* prologue: frame size=0 */
 401 0094 AF92      		push r10
 402 0096 BF92      		push r11
 403 0098 CF92      		push r12
 404 009a DF92      		push r13
 405 009c EF92      		push r14
 406 009e FF92      		push r15
 407 00a0 0F93      		push r16
 408 00a2 1F93      		push r17
 409 00a4 CF93      		push r28
 410               	/* prologue end (size=9) */
 411 00a6 5901      		movw r10,r18
 412 00a8 6A01      		movw r12,r20
 413 00aa 9801      		movw r18,r16
  88:kertimer.c    **** 	 uint8_t diff;
  89:kertimer.c    ****         if (id >= KER_TIMERS) return FAIL;
 415               	.LM29:
 416 00ac 8330      		cpi r24,lo8(3)
 417 00ae 08F0      		brlo .+2
 418 00b0 58C0      		rjmp .L11
  90:kertimer.c    ****         if (type>1) return FAIL;
 420               	.LM30:
 421 00b2 6230      		cpi r22,lo8(2)
 422 00b4 08F0      		brlo .+2
 423 00b6 55C0      		rjmp .L11
  91:kertimer.c    ****         mTimerList[id].ticks = interval ;
 425               	.LM31:
 426 00b8 E82E      		mov r14,r24
 427 00ba FF24      		clr r15
 428 00bc 8BE0      		ldi r24,lo8(11)
 429 00be 90E0      		ldi r25,hi8(11)
 430 00c0 E89E      		mul r14,r24
 431 00c2 8001      		movw r16,r0
 432 00c4 E99E      		mul r14,r25
 433 00c6 100D      		add r17,r0
 434 00c8 F89E      		mul r15,r24
 435 00ca 100D      		add r17,r0
 436 00cc 1124      		clr r1
 437 00ce 0050      		subi r16,lo8(-(mTimerList))
 438 00d0 1040      		sbci r17,hi8(-(mTimerList))
 439 00d2 F801      		movw r30,r16
 440 00d4 A182      		std Z+1,r10
 441 00d6 B282      		std Z+2,r11
 442 00d8 C382      		std Z+3,r12
 443 00da D482      		std Z+4,r13
  92:kertimer.c    ****         mTimerList[id].type = type;
 445               	.LM32:
 446 00dc 6083      		st Z,r22
  93:kertimer.c    **** 	 mTimerList[id].tp=fun;
 448               	.LM33:
 449 00de 2187      		std Z+9,r18
 450 00e0 3287      		std Z+10,r19
 451               	.LBB5:
  94:kertimer.c    **** 	
  95:kertimer.c    ****         { os_atomic_t _nesc_atomic = os_atomic_start();
 453               	.LM34:
 454 00e2 0E94 0000 		call os_atomic_start
 455 00e6 C82F      		mov r28,r24
 456               	.LBB6:
 457               	.LBB7:
 459               	.LM35:
 460 00e8 82B7      		in r24,82-0x20
 461               	.LBE7:
 462               	.LBE6:
  96:kertimer.c    **** 	     		{
  97:kertimer.c    **** 			            diff = timer0_hardware_get_counter();
  98:kertimer.c    **** 			            interval += diff;
 464               	.LM36:
 465 00ea A80E      		add r10,r24
 466 00ec B11C      		adc r11,__zero_reg__
 467 00ee C11C      		adc r12,__zero_reg__
 468 00f0 D11C      		adc r13,__zero_reg__
  99:kertimer.c    **** 			            mTimerList[id].ticksLeft = interval;
 470               	.LM37:
 471 00f2 F801      		movw r30,r16
 472 00f4 A582      		std Z+5,r10
 473 00f6 B682      		std Z+6,r11
 474 00f8 C782      		std Z+7,r12
 475 00fa D086      		std Z+8,r13
 100:kertimer.c    **** 			            mState|=(0x1L<<id);
 477               	.LM38:
 478 00fc 21E0      		ldi r18,lo8(1)
 479 00fe 30E0      		ldi r19,hi8(1)
 480 0100 40E0      		ldi r20,hlo8(1)
 481 0102 50E0      		ldi r21,hhi8(1)
 482 0104 04C0      		rjmp 2f
 483 0106 220F      	1:	lsl r18
 484 0108 331F      		rol r19
 485 010a 441F      		rol r20
 486 010c 551F      		rol r21
 487 010e EA94      	2:	dec r14
 488 0110 D2F7      		brpl 1b
 489 0112 8091 0000 		lds r24,mState
 490 0116 9091 0000 		lds r25,(mState)+1
 491 011a A091 0000 		lds r26,(mState)+2
 492 011e B091 0000 		lds r27,(mState)+3
 493 0122 822B      		or r24,r18
 494 0124 932B      		or r25,r19
 495 0126 A42B      		or r26,r20
 496 0128 B52B      		or r27,r21
 497 012a 8093 0000 		sts mState,r24
 498 012e 9093 0000 		sts (mState)+1,r25
 499 0132 A093 0000 		sts (mState)+2,r26
 500 0136 B093 0000 		sts (mState)+3,r27
 101:kertimer.c    **** 			            if (interval < mInterval)
 502               	.LM39:
 503 013a 8091 0000 		lds r24,mInterval
 504 013e 9927      		clr r25
 505 0140 AA27      		clr r26
 506 0142 BB27      		clr r27
 507 0144 A816      		cp r10,r24
 508 0146 B906      		cpc r11,r25
 509 0148 CA06      		cpc r12,r26
 510 014a DB06      		cpc r13,r27
 511 014c 38F4      		brsh .L15
 102:kertimer.c    **** 					{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -