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

📄 mac_beacon_handler.s51

📁 zigbee location examples
💻 S51
📖 第 1 页 / 共 5 页
字号:
//   17  * The use of this file is restricted by the signed MAC software license agreement.                    *
//   18  *                                                                                                     *
//   19  * Copyright Chipcon AS, 2005                                                                          *
//   20  *******************************************************************************************************
//   21  * This module contains functions the functions responsible for receiving and transmitting beacons,    *
//   22  * and related functions, such as synchronization and coordinator realignment.                         *
//   23  *******************************************************************************************************/
//   24 #include "mac_headers.h"
//   25 
//   26 
//   27 //-------------------------------------------------------------------------------------------------------
//   28 // Beacon-related variables

        RSEG XDATA_Z:XDATA:NOROOT(0)
        REQUIRE __INIT_XDATA_Z
//   29 MAC_BEACON_INFO mbcnInfo;
mbcnInfo:
        DS 10
//   30 //-------------------------------------------------------------------------------------------------------
//   31 
//   32 
//   33 
//   34 
//   35 /*******************************************************************************************************
//   36  *******************************************************************************************************
//   37  **************************                 BEACON RECEPTION                  **************************
//   38  *******************************************************************************************************
//   39  *******************************************************************************************************/
//   40 
//   41 
//   42 
//   43 
//   44 //-------------------------------------------------------------------------------------------------------
//   45 //  void mbcnRxPeriodicalBeacon(void)
//   46 //
//   47 //  DESCRIPTION:
//   48 //      Creates the task that handles reception of periodical beacons (in a beacon-enabled PAN)
//   49 //-------------------------------------------------------------------------------------------------------

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   50 void mbcnRxPeriodicalBeacon(void) NEAR {
mbcnRxPeriodicalBeacon:
        CFI Block cfiBlock0 Using cfiCommon0
        CFI Function mbcnRxPeriodicalBeacon
        FUNCALL mbcnRxPeriodicalBeacon, mschAddTask
        LOCFRAME XSTACK, 14, STACK
        ARGFRAME XSTACK, 14, STACK
        MOV	A,#-0xb
        LCALL	?BANKED_ENTER_XDATA
        CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
        CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
        CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
        CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
        CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
        CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
        CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-10)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-11)))
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 11)
        ; Saved register size: 11
        ; Auto size: 0
//   51     mschAddTask(mbcnInfo.rxTaskNumber, MAC_TASK_PRI_HIGHEST, mbcnRxPeriodicalBeaconTask, NULL);
        ; Setup parameters for call to function mschAddTask
        MOV	?V0 + 0,#(mbcnRxPeriodicalBeaconTask & 0xff)
        MOV	?V0 + 1,#((mbcnRxPeriodicalBeaconTask >> 8) & 0xff)
        MOV	?V0 + 2,#((mbcnRxPeriodicalBeaconTask >> 16) & 0xff)
        MOV	R0,#?V0 + 0
        LCALL	?PUSH_XSTACK_I_THREE
        CFI CFA_XSP16 add(XSP16, 14)
        MOV	R4,#0x0
        MOV	R5,#0x0
        MOV	R2,#0x3
        MOV	DPTR,#(mbcnInfo + 1)
        CFI EndBlock cfiBlock0
        REQUIRE ?Subroutine0
        ; // Fall through to label ?Subroutine0
//   52 } // mbcnRxPeriodicalBeacon

        RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
        CFI Block cfiBlock1 Using cfiCommon0
        CFI NoFunction
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 14)
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-10)))
        CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
        CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-11)))
        CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
        CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
        CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
        CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
        MOVX	A,@DPTR
        MOV	R1,A
??Subroutine0_0:
        LCALL	mschAddTask & 0xFFFF
        MOV	A,#0x3
        LCALL	?DEALLOC_XSTACK8
        CFI CFA_XSP16 add(XSP16, 11)
        MOV	R7,#0x3
        LJMP	?BANKED_LEAVE_XDATA
        CFI EndBlock cfiBlock1
//   53 
//   54 
//   55 
//   56 
//   57 //-------------------------------------------------------------------------------------------------------
//   58 //  void mbcnRxPeriodicalBeaconTask(MAC_TASK_INFO *pTask)
//   59 //
//   60 //  DESCRIPTION:
//   61 //      Handles configuration of timers related to beacon reception (including starting RX and the
//   62 //      timeout to be generated when no beacon is received). It also handles beacon loss.
//   63 //
//   64 //      Note: When a beacon is received, the current mbcnRxPeriodicalBeacon callback must be cancelled,
//   65 //      and a new callback must be set up.
//   66 //
//   67 //  TASK DATA:
//   68 //      0
//   69 //-------------------------------------------------------------------------------------------------------

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   70 void mbcnRxPeriodicalBeaconTask(MAC_TASK_INFO *pTask) NEAR {
mbcnRxPeriodicalBeaconTask:
        CFI Block cfiBlock2 Using cfiCommon0
        CFI Function mbcnRxPeriodicalBeaconTask
        FUNCALL mbcnRxPeriodicalBeaconTask, mrxDecrOnCounter
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mbcnUpdateBufferedPibAttributes
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mschRemoveTask
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mlmeSyncLossIndication
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mrxIncrOnCounter
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mbcnUpdateBufferedPibAttributes
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, msupCalcBeaconInterval
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mbcnGetBeaconMargin
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mtimSetCallback
        LOCFRAME XSTACK, 20, STACK
        ARGFRAME XSTACK, 20, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, msupSetChannel
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mbcnGetBeaconMargin
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mtimSetCallback
        LOCFRAME XSTACK, 20, STACK
        ARGFRAME XSTACK, 20, STACK
        FUNCALL mbcnRxPeriodicalBeaconTask, mschRemoveTask
        LOCFRAME XSTACK, 16, STACK
        ARGFRAME XSTACK, 16, STACK
        MOV	A,#-0x10
        LCALL	?BANKED_ENTER_XDATA
        CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
        CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
        CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
        CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
        CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
        CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
        CFI V7 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI V6 load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-10)))
        CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-11)))
        CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-12)))
        CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-13)))
        CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-14)))
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-15)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-16)))
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 16)
        ; Saved register size: 16
        ; Auto size: 0
//   71 
//   72     // Beacon loss?
//   73     if (!mbcnInfo.noBcnCountdown) {
        MOV	A,R2
        ADD	A,#0x8
        MOV	R6,A
        MOV	A,R3
        ADDC	A,#0x0
        MOV	R7,A
        MOV	DPTR,#(mbcnInfo + 7)
        MOVX	A,@DPTR
        JNZ	??mbcnRxPeriodicalBeaconTask_0
//   74 
//   75         // Stop the search/tracking
//   76         if (mbcnInfo.findBeacon) mrxDecrOnCounter();
        MOV	DPTR,#(mbcnInfo + 6)
        MOVX	A,@DPTR
        JZ	??mbcnRxPeriodicalBeaconTask_1
        ; Setup parameters for call to function mrxDecrOnCounter
        MOV	DPTR,#(mrxDecrOnCounter & 0xffff)
        MOV	A,#((mrxDecrOnCounter >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
//   77 
//   78         mbcnInfo.findBeacon = FALSE;
??mbcnRxPeriodicalBeaconTask_1:
        CLR	A
        MOV	DPTR,#(mbcnInfo + 6)
        MOVX	@DPTR,A
//   79         mbcnInfo.trackBeacon = FALSE;
        MOV	DPTR,#(mbcnInfo + 5)
        MOVX	@DPTR,A
//   80 
//   81         // Update buffered PIB attributes
//   82         mbcnUpdateBufferedPibAttributes();
        ; Setup parameters for call to function mbcnUpdateBufferedPibAttributes
        MOV	DPTR,#(mbcnUpdateBufferedPibAttributes & 0xffff)
        MOV	A,#((mbcnUpdateBufferedPibAttributes >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
//   83 
//   84         // Remove and release the task
//   85         mschRemoveTask(pTask->priority, 0);
        ; Setup parameters for call to function mschRemoveTask
        MOV	R2,#0x0
        MOV	DPL,R6
        MOV	DPH,R7
        MOVX	A,@DPTR
        MOV	R1,A
        LCALL	mschRemoveTask & 0xFFFF
//   86         mbcnInfo.rxTaskNumber = NO_TASK;
        MOV	A,#-0x1
        MOV	DPTR,#(mbcnInfo + 1)
        MOVX	@DPTR,A
//   87 
//   88         // Make the call to the higher layer
//   89         mlmeSyncLossIndication(BEACON_LOSS);
        ; Setup parameters for call to function mlmeSyncLossIndication
        MOV	R1,#-0x20
        LCALL	mlmeSyncLossIndication & 0xFFFF
        LJMP	??mbcnRxPeriodicalBeaconTask_2 & 0xFFFF
//   90 
//   91     } else {
//   92         mrxIncrOnCounter();
??mbcnRxPeriodicalBeaconTask_0:
        ; Setup parameters for call to function mrxIncrOnCounter
        MOV	DPTR,#(mrxIncrOnCounter & 0xffff)
        MOV	A,#((mrxIncrOnCounter >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
//   93 
//   94         // Update buffered PIB attributes
//   95         mbcnUpdateBufferedPibAttributes();
        ; Setup parameters for call to function mbcnUpdateBufferedPibAttributes
        MOV	DPTR,#(mbcnUpdateBufferedPibAttributes & 0xffff)
        MOV	A,#((mbcnUpdateBufferedPibAttributes >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
//   96 
//   97         // Schedule the next beacon handler, including XTAL error margin (the startup margin is cumulative when missing beacons)
//   98         mtimSetCallback(mbcnRxPeriodicalBeacon, msupCalcBeaconInterval() - mbcnGetBeaconMargin());
        ; Setup parameters for call to function msupCalcBeaconInterval
        LCALL	msupCalcBeaconInterval & 0xFFFF
        MOV	?V0 + 4,R2
        MOV	?V0 + 5,R3
        MOV	?V0 + 6,R4
        MOV	?V0 + 7,R5
        ; Setup parameters for call to function mtimSetCallback
        ; Setup parameters for call to function mbcnGetBeaconMargin
        MOV	DPTR,#(mbcnGetBeaconMargin & 0xffff)
        MOV	A,#((mbcnGetBeaconMargin >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
        MOV	A,R1
        MOV	?V0 + 0,A
        MOV	?V0 + 1,#0x0
        MOV	?V0 + 2,#0x0
        MOV	?V0 + 3,#0x0
        MOV	R0,#?V0 + 4
        MOV	R1,#?V0 + 0
        LCALL	?L_SUB
        MOV	R0,#?V0 + 4
        LCALL	?PUSH_XSTACK_I_FOUR
        CFI CFA_XSP16 add(XSP16, 20)
        MOV	R1,#(mbcnRxPeriodicalBeacon & 0xff)
        MOV	R2,#((mbcnRxPeriodicalBeacon >> 8) & 0xff)
        MOV	R3,#((mbcnRxPeriodicalBeacon >> 16) & 0xff)
        LCALL	mtimSetCallback & 0xFFFF
        MOV	A,#0x4
        LCALL	?DEALLOC_XSTACK8
        CFI CFA_XSP16 add(XSP16, 16)
//   99 
//  100         // Set the RF channel (but don't mess up scanning)
//  101         if (!(macInfo.state & MAC_STATE_SCAN_BM)) msupSetChannel(ppib.phyCurrentChannel, FALSE);
        MOV	DPTR,#macInfo
        MOVX	A,@DPTR
        MOV	C,0xE0 /* A   */.6
        JC	??mbcnRxPeriodicalBeaconTask_3
        ; Setup parameters for call to function msupSetChannel
        MOV	R2,#0x0
        MOV	DPTR,#ppib
        MOVX	A,@DPTR
        MOV	R1,A
        LCALL	msupSetChannel & 0xFFFF
//  102 
//  103         // Set the off-timer (the off-time is also cumulative)
//  104         mtimSetCallback(mbcnRxBeaconTimeout, (UINT16) 2 * ((UINT16) aMaxLostBeacons - (UINT16) mbcnInfo.noBcnCountdown + (UINT16) 1) * (UINT16) mbcnGetBeaconMargin() + (UINT16) MBCN_RX_STARTUP_OVERHEAD);
??mbcnRxPeriodicalBeaconTask_3:
        ; Setup parameters for call to function mtimSetCallback
        MOV	DPTR,#(mbcnInfo + 7)
        MOVX	A,@DPTR
        MOV	R0,A
        MOV	A,#0x5
        CLR	C

⌨️ 快捷键说明

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