📄 mac_backoff_timer.lst
字号:
\ 00001E 90.... MOV DPTR,#(halAssertHandler & 0xffff)
\ 000021 74.. MOV A,#((halAssertHandler >> 16) & 0xff)
\ 000023 12.... LCALL ?BCALL ; Banked call to: DPTR()
382
383 /*-------------------------------------------------------------------------------
384 * Calculate the delta backoff difference between expected backoff count,
385 * which is zero, and the backoff count of the received frame.
386 */
387
388 /* since expected receive time is zero, the delta is simply the receive time */
389 backoffDelta = pMsg->mac.timestamp;
\ ??macBackoffTimerRealign_0:
\ 000026 EE MOV A,R6
\ 000027 2424 ADD A,#0x24
\ 000029 F582 MOV DPL,A
\ 00002B EF MOV A,R7
\ 00002C 3400 ADDC A,#0x0
\ 00002E F583 MOV DPH,A
\ 000030 78.. MOV R0,#?V0 + 4
\ 000032 12.... LCALL ?L_MOV_X
390
391 /* if the frame was received more than halfway to the rollover count, use a negative delta value */
392 if (((uint32) backoffDelta) > (backoffTimerRollover / 2))
\ 000035 90.... MOV DPTR,#??backoffTimerRollover
\ 000038 78.. MOV R0,#?V0 + 0
\ 00003A 12.... LCALL ?L_MOV_X
\ 00003D 7401 MOV A,#0x1
\ 00003F 78.. MOV R0,#?V0 + 0
\ 000041 12.... LCALL ?UL_SHR
\ 000044 78.. MOV R0,#?V0 + 4
\ 000046 79.. MOV R1,#?V0 + 0
\ 000048 12.... LCALL ?UL_GT
\ 00004B 5008 JNC ??macBackoffTimerRealign_1
393 {
394 backoffDelta = backoffDelta - backoffTimerRollover; /* result will be negative */
\ 00004D 90.... MOV DPTR,#??backoffTimerRollover
\ 000050 78.. MOV R0,#?V0 + 4
\ 000052 12.... LCALL ?L_SUB_X
395 }
396
397 /*-------------------------------------------------------------------------------
398 * Calculate the number of timer ticks to delay that will align the internal
399 * time base with the received frame.
400 */
401
402 /* retrieve the timer count when frame was received */
403 timerDelayTicks = pMsg->mac.timestamp2;
\ ??macBackoffTimerRealign_1:
\ 000055 EE MOV A,R6
\ 000056 2428 ADD A,#0x28
\ 000058 F582 MOV DPL,A
\ 00005A EF MOV A,R7
\ 00005B 3400 ADDC A,#0x0
\ 00005D F583 MOV DPH,A
\ 00005F E0 MOVX A,@DPTR
\ 000060 FE MOV R6,A
\ 000061 A3 INC DPTR
\ 000062 E0 MOVX A,@DPTR
\ 000063 FF MOV R7,A
404
405 /*
406 * Subtract the expected SFD time from the actual SFD time to find the needed
407 * timer adjustment. If subtracting the offset would result in a negative value,
408 * the tick delay must wrap around.
409 */
410 if (timerDelayTicks >= TIMER_TICKS_EXPECTED_AT_SFD)
\ 000064 C3 CLR C
\ 000065 EE MOV A,R6
\ 000066 9466 SUBB A,#0x66
\ 000068 EF MOV A,R7
\ 000069 9404 SUBB A,#0x4
\ 00006B EE MOV A,R6
\ 00006C 4009 JC ??macBackoffTimerRealign_2
411 {
412 /* since delay count is greater than or equal to offset, subtract it directly */
413 timerDelayTicks = timerDelayTicks - TIMER_TICKS_EXPECTED_AT_SFD;
\ 00006E 249A ADD A,#-0x66
\ 000070 FE MOV R6,A
\ 000071 EF MOV A,R7
\ 000072 34FB ADDC A,#-0x5
\ 000074 FF MOV R7,A
\ 000075 800F SJMP ??macBackoffTimerRealign_3
414 }
415 else
416 {
417 /*
418 * The expected time is greater that actualy time so it cannot be subtracted directly.
419 * The tick count per backoff is added to wrap around within the backoff.
420 * Since a wrap around did happen, the backoff delta is adjusted by one.
421 */
422 timerDelayTicks = timerDelayTicks - TIMER_TICKS_EXPECTED_AT_SFD + MAC_RADIO_TIMER_TICKS_PER_BACKOFF();
\ ??macBackoffTimerRealign_2:
\ 000077 249A ADD A,#-0x66
\ 000079 FE MOV R6,A
\ 00007A EF MOV A,R7
\ 00007B 3423 ADDC A,#0x23
\ 00007D FF MOV R7,A
423 backoffDelta--;
\ 00007E 90.... MOV DPTR,#__Constant_ffffffff
\ 000081 78.. MOV R0,#?V0 + 4
\ 000083 12.... LCALL ?L_ADD_X
424 }
425
426 /*-------------------------------------------------------------------------------
427 * Calculate the new backoff count.
428 */
429
430 backoffCount = MAC_RADIO_BACKOFF_COUNT() - backoffDelta;
\ ??macBackoffTimerRealign_3:
\ 000086 ; Setup parameters for call to function macMcuOverflowCount
\ 000086 90.... MOV DPTR,#(macMcuOverflowCount & 0xffff)
\ 000089 74.. MOV A,#((macMcuOverflowCount >> 16) & 0xff)
\ 00008B 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00008E 8A.. MOV ?V0 + 0,R2
\ 000090 8B.. MOV ?V0 + 1,R3
\ 000092 8C.. MOV ?V0 + 2,R4
\ 000094 8D.. MOV ?V0 + 3,R5
\ 000096 78.. MOV R0,#?V0 + 0
\ 000098 79.. MOV R1,#?V0 + 4
\ 00009A 12.... LCALL ?L_SUB
\ 00009D 85..82 MOV DPL,?XSP + 0
\ 0000A0 85..83 MOV DPH,?XSP + 1
\ 0000A3 78.. MOV R0,#?V0 + 0
\ 0000A5 12.... LCALL ?L_MOV_TO_X
431
432 if (backoffCount >= ((int32) backoffTimerRollover))
\ 0000A8 85..82 MOV DPL,?XSP + 0
\ 0000AB 85..83 MOV DPH,?XSP + 1
\ 0000AE C082 PUSH DPL
\ 0000B0 C083 PUSH DPH
\ 0000B2 90.... MOV DPTR,#??backoffTimerRollover
\ 0000B5 78.. MOV R0,#?V0 + 0
\ 0000B7 12.... LCALL ?L_MOV_X
\ 0000BA D083 POP DPH
\ 0000BC D082 POP DPL
\ 0000BE 78.. MOV R0,#?V0 + 0
\ 0000C0 12.... LCALL ?SL_GT_X
\ 0000C3 85..82 MOV DPL,?XSP + 0
\ 0000C6 85..83 MOV DPH,?XSP + 1
\ 0000C9 4007 JC ??macBackoffTimerRealign_4
433 {
434 backoffCount -= backoffTimerRollover;
\ 0000CB 78.. MOV R0,#?V0 + 0
\ 0000CD 12.... LCALL ?L_SUB_FROM_X
\ 0000D0 802A SJMP ??macBackoffTimerRealign_5
435 }
436 else if (backoffCount < 0)
\ ??macBackoffTimerRealign_4:
\ 0000D2 C082 PUSH DPL
\ 0000D4 C083 PUSH DPH
\ 0000D6 90.... MOV DPTR,#__Constant_0
\ 0000D9 78.. MOV R0,#?V0 + 0
\ 0000DB 12.... LCALL ?L_MOV_X
\ 0000DE D083 POP DPH
\ 0000E0 D082 POP DPL
\ 0000E2 78.. MOV R0,#?V0 + 0
\ 0000E4 12.... LCALL ?SL_GT_X
\ 0000E7 5013 JNC ??macBackoffTimerRealign_5
437 {
438 backoffCount += backoffTimerRollover;
\ 0000E9 90.... MOV DPTR,#??backoffTimerRollover
\ 0000EC 78.. MOV R0,#?V0 + 0
\ 0000EE 12.... LCALL ?L_MOV_X
\ 0000F1 85..82 MOV DPL,?XSP + 0
\ 0000F4 85..83 MOV DPH,?XSP + 1
\ 0000F7 78.. MOV R0,#?V0 + 0
\ 0000F9 12.... LCALL ?L_ADD_TO_X
439 }
440
441 MAC_RADIO_TIMER_FORCE_DELAY(timerDelayTicks);
\ ??macBackoffTimerRealign_5:
\ 0000FC EE MOV A,R6
\ 0000FD F5A6 MOV 0xa6,A
\ 0000FF EF MOV A,R7
\ 000100 F5A7 MOV 0xa7,A
442 MAC_RADIO_BACKOFF_SET_COUNT(backoffCount);
\ 000102 ; Setup parameters for call to function macMcuOverflowSetCount
\ 000102 85..82 MOV DPL,?XSP + 0
\ 000105 85..83 MOV DPH,?XSP + 1
\ 000108 78.. MOV R0,#?V0 + 0
\ 00010A 12.... LCALL ?L_MOV_X
\ 00010D AA.. MOV R2,?V0 + 0
\ 00010F AB.. MOV R3,?V0 + 1
\ 000111 AC.. MOV R4,?V0 + 2
\ 000113 AD.. MOV R5,?V0 + 3
\ 000115 90.... MOV DPTR,#(macMcuOverflowSetCount & 0xffff)
\ 000118 74.. MOV A,#((macMcuOverflowSetCount >> 16) & 0xff)
\ 00011A 12.... LCALL ?BCALL ; Banked call to: DPTR()
443
444 return(backoffDelta);
\ 00011D AA.. MOV R2,?V0 + 4
\ 00011F AB.. MOV R3,?V0 + 5
\ 000121 AC.. MOV R4,?V0 + 6
\ 000123 AD.. MOV R5,?V0 + 7
\ 000125 7404 MOV A,#0x4
\ 000127 12.... LCALL ?DEALLOC_XSTACK8
\ 00012A 02.... LJMP ??Subroutine2_1 & 0xFFFF
445 }
446
447
448 /**************************************************************************************************
449 * @fn macBackoffTimerCompareIsr
450 *
451 * @brief Interrupt service routine that fires when the backoff count is equal
452 * to the trigger count.
453 *
454 * @param none
455 *
456 * @return none
457 **************************************************************************************************
458 */
\ In segment BANKED_CODE, align 1, keep-with-next
459 void macBackoffTimerCompareIsr(void)
\ macBackoffTimerCompareIsr:
460 {
\ 000000 74F4 MOV A,#-0xc
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 12
\ 000005 ; Auto size: 0
461 uint8 oldState;
462 halIntState_t s;
463
464 HAL_ENTER_CRITICAL_SECTION(s);
\ 000005 A2AF MOV C,0xa8.7
\ 000007 E4 CLR A
\ 000008 92E0 MOV 0xE0 /* A */.0,C
\ 00000A FE MOV R6,A
\ 00000B C2AF CLR 0xa8.7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -