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

📄 mac_tx_engine.s51

📁 zigbee location examples
💻 S51
📖 第 1 页 / 共 5 页
字号:
        MOVX	A,@DPTR
        JZ	??mtxCalcCspTimeout_2
//  232                 //        <----------------- The CAP duration -----------------> - <--------- Used CAP ----------> - <---- Overhead ----->
//  233                 bosLeft = (mbcnInfo.beaconDuration + mpib.macBattLifeExtPeriods) - (T2_GET_OVERFLOW_COUNTER() + 1) - (MTX_START_CSP_DELAY);
        MOV	DPTR,#(mbcnInfo + 4)
        MOVX	A,@DPTR
        MOV	R0,A
        MOV	DPTR,#(mpib + 4)
        MOVX	A,@DPTR
        ADD	A,R0
        MOV	?V0 + 4,A
        CLR	A
        ADDC	A,#0x0
        MOV	?V0 + 5,A
        MOV	?V0 + 6,#0x0
        MOV	?V0 + 7,#0x0
        ; Setup parameters for call to function T2_GET_OVERFLOW_COUNTER
        MOV	DPTR,#(T2_GET_OVERFLOW_COUNTER & 0xffff)
        MOV	A,#((T2_GET_OVERFLOW_COUNTER >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
        MOV	?V0 + 0,R2
        MOV	?V0 + 1,R3
        MOV	?V0 + 2,R4
        MOV	?V0 + 3,R5
        MOV	R0,#?V0 + 4
        MOV	R1,#?V0 + 0
        LCALL	?L_SUB
        MOV	DPTR,#__Constant_fffffffd
        MOV	R0,#?V0 + 4
        LCALL	?L_ADD_X
        SJMP	??mtxCalcCspTimeout_3
//  234             } else {
//  235                 //        <- The CAP duration > - <--------- Used CAP ----------> - <------------- Overhead + duration -------------> - <-- Beacon margin -->
//  236                 bosLeft = msupCalcCapDuration() - (T2_GET_OVERFLOW_COUNTER() + 1) - (MTX_START_CSP_DELAY + mtxInfo.pPacket->duration) - mbcnGetBeaconMargin();
??mtxCalcCspTimeout_2:
        ; Setup parameters for call to function msupCalcCapDuration
        LCALL	msupCalcCapDuration & 0xFFFF
        MOV	?V0 + 4,R2
        MOV	?V0 + 5,R3
        MOV	?V0 + 6,R4
        MOV	?V0 + 7,R5
        ; Setup parameters for call to function T2_GET_OVERFLOW_COUNTER
        MOV	DPTR,#(T2_GET_OVERFLOW_COUNTER & 0xffff)
        MOV	A,#((T2_GET_OVERFLOW_COUNTER >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
        MOV	?V0 + 0,R2
        MOV	?V0 + 1,R3
        MOV	?V0 + 2,R4
        MOV	?V0 + 3,R5
        ; 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	R2,A
        MOV	R0,#?V0 + 4
        MOV	R1,#?V0 + 0
        LCALL	?L_SUB
        MOV	DPTR,#__Constant_ffffffff
        MOV	R0,#?V0 + 4
        LCALL	?L_ADD_X
        MOV	DPTR,#mtxInfo
        MOVX	A,@DPTR
        ADD	A,#-0x7b
        MOV	R0,A
        INC	DPTR
        MOVX	A,@DPTR
        ADDC	A,#0x0
        MOV	R1,A
        MOV	DPL,R0
        MOV	DPH,R1
        MOVX	A,@DPTR
        MOV	R0,A
        MOV	A,#0x2
        ADD	A,R0
        MOV	?V0 + 0,A
        CLR	A
        ADDC	A,#0x0
        MOV	?V0 + 1,A
        MOV	?V0 + 2,#0x0
        MOV	?V0 + 3,#0x0
        MOV	R0,#?V0 + 4
        MOV	R1,#?V0 + 0
        LCALL	?L_SUB
        MOV	?V0 + 0,R2
        MOV	?V0 + 1,#0x0
        MOV	R0,#?V0 + 4
        MOV	R1,#?V0 + 0
        LCALL	?L_SUB
//  237             }
//  238         } else
//  239             bosLeft = 0;
//  240     }
//  241 
//  242     // Calculate the CSP timeout
//  243     if (bosLeft >= CSP_TIMEOUT_RUN_FOREVER) {
??mtxCalcCspTimeout_3:
        MOV	DPTR,#__Constant_ff
        MOV	R0,#?V0 + 0
        LCALL	?L_MOV_X
        MOV	R0,#?V0 + 0
        MOV	R1,#?V0 + 4
        LCALL	?SL_GT
        JC	??mtxCalcCspTimeout_4
//  244         return CSP_TIMEOUT_RUN_FOREVER;
??mtxCalcCspTimeout_0:
        MOV	R1,#-0x1
        SJMP	??mtxCalcCspTimeout_5
//  245     } else if (bosLeft < 1) {
??mtxCalcCspTimeout_4:
        MOV	DPTR,#__Constant_1
        MOV	R0,#?V0 + 0
        LCALL	?L_MOV_X
        MOV	R0,#?V0 + 0
        MOV	R1,#?V0 + 4
        LCALL	?SL_GT
        JNC	??mtxCalcCspTimeout_6
//  246         return CSP_TIMEOUT_STOP;
??mtxCalcCspTimeout_1:
        MOV	R1,#0x0
        SJMP	??mtxCalcCspTimeout_5
//  247     } else {
//  248         return (UINT8) bosLeft;
??mtxCalcCspTimeout_6:
        MOV	R1,?V0 + 4
??mtxCalcCspTimeout_5:
        MOV	R7,#0x8
        LJMP	?BANKED_LEAVE_XDATA
        CFI EndBlock cfiBlock5
//  249     }
//  250 
//  251 } // mtxCalcCspTimeout
//  252 
//  253 
//  254 
//  255 
//  256 //-------------------------------------------------------------------------------------------------------
//  257 //  void mtxResumeAfterBeacon(void)
//  258 //
//  259 //  DESCRIPTION:
//  260 //      Resumes transmission after the beacon has been received, if there is a sufficient number of
//  261 //      backoff slot left in the CAP.
//  262 //-------------------------------------------------------------------------------------------------------
//  263 void mtxResumeAfterBeaconCallback(void) NEAR { mschAddTask(mschReserveTask(), MAC_TASK_PRI_HIGH, mtxResumeAfterBeaconTask, NULL); }
//  264 void mtxResumeAfterBeaconTask(MAC_TASK_INFO   *pTask) NEAR { mtxResumeAfterBeacon(); mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM); }
//  265 void mtxResumeAfterBeacon(void) NEAR {
//  266     if (mtxInfo.waitForBeacon) {
//  267 
//  268         // Cancel beacon search when enabled (the WAIT -> OUT_OF_CAP state will turn it back on if necessary)
//  269         if (mtxInfo.beaconSearchEnabled) {
//  270             mrxDecrOnCounter();
//  271             mtxInfo.beaconSearchEnabled = FALSE;
//  272             mtxInfo.beaconSearchTimeout = FALSE;
//  273             mtimCancelCallback(mtxBeaconSearchTimeout);
//  274         }
//  275 
//  276         // Go ahead if there's sufficient CAP left (otherwise remain in the OUT_OF_CAP state)
//  277         if (T2_IS_CAP_ACTIVE()) {
//  278             mtxInfo.waitForBeacon = FALSE;
//  279             mtxInfo.status = MTX_STATUS_WAITING;
//  280             mtxInfo.cspTimeout = mtxCalcCspTimeout();
//  281 
//  282             if (mtxInfo.cspTimeout) {
//  283                 mtxCreateStartTask();
//  284                 mtxInfo.status = MTX_STATUS_WAITING;
//  285             } else {
//  286                 mtxInfo.status = MTX_STATUS_OUT_OF_CAP;
//  287             }
//  288         }
//  289     }
//  290 } // mtxResumeAfterBeacon
//  291 
//  292 
//  293 
//  294 void mtxResetBosCounter(void) NEAR {
//  295 
//  296     // New CAP begins
//  297     T2_SET_OVERFLOW_COUNTER(0x00000);
//  298     T2_SET_OVERFLOW_COUNTER_COMPARE_VALUE(msupCalcCapDuration());
//  299     T2_SET_CAP_ACTIVE();
//  300 
//  301     // Schedule the next beacon handler
//  302     if (mpib.macBeaconOrder != 15) {
//  303         mtimSetCallback(mbcnTxPeriodicalBeacon, msupCalcBeaconInterval() - MBCN_TX_STARTUP_OVERHEAD - MBCN_TX_PREPARE_TIME);
//  304     }
//  305 }
//  306 
//  307 
//  308 
//  309 
//  310 //-------------------------------------------------------------------------------------------------------
//  311 //  void mtxAckTimeout(void)
//  312 //
//  313 //  DESCRIPTION:
//  314 //-------------------------------------------------------------------------------------------------------
//  315 void mtxAckTimeout(void) NEAR {
//  316     mrxDecrOnCounter();
//  317     FSMTC1 &= ~FSMTC1_ACCEPT_ACKPKT_BM;
//  318     if (mtxInfo.status == MTX_STATUS_WAITING_FOR_ACK) {
//  319         mtxInfo.status = MTX_STATUS_ACK_TIMEOUT;
//  320     }
//  321 } // mtxAckTimeout
//  322 
//  323 
//  324 
//  325 
//  326 //-------------------------------------------------------------------------------------------------------
//  327 //  void mtxScheduleTransmission(MAC_TASK_INFO *pTask)
//  328 //
//  329 //  DESCRIPTION:
//  330 //      This task is created to start a transmission. The task is responsible for setting up the CSMA-CA
//  331 //      mechanism, scheduling the transmission, and handle the result when the packet timeout is trigged.
//  332 //      Note: Periodically transmitted beacons bypass this task and uses mtxStartTransmission directly.
//  333 //-------------------------------------------------------------------------------------------------------
//  334 void mtxScheduleTransmission(MAC_TASK_INFO   *pTask) NEAR {
//  335     MAC_TX_PACKET   *pPacket = (MAC_TX_PACKET   *) pTask->taskData;
//  336 
//  337     switch (pTask->state) {
//  338     case MTX_STATE_INIT_TRANSMISSION:
//  339         // Reschedule this task if we're in scan mode and the "scan related" flag is not set on this packet
//  340         if ((macInfo.state & MAC_STATE_SCAN_BM) && !(pPacket->txMode & MTX_MODE_SCAN_RELATED_BM)) {
//  341             mschRescheduleTask(pTask, MTX_STATE_INIT_TRANSMISSION);
//  342             return;
//  343         }
//  344 
//  345         // Set the TX engine packet pointer
//  346         mtxInfo.pPacket = pPacket;
//  347 
//  348         // No break here!
//  349 
//  350     case MTX_STATE_PROCESS_SECURITY:
//  351         pTask->state = MTX_STATE_PREPARE_STARTUP;
//  352         break;
//  353 
//  354     case MTX_STATE_RETRY_TRANSMISSION:
//  355     case MTX_STATE_PREPARE_STARTUP:
//  356 
//  357         // Bail out if beacon transmission is in progress
//  358 #if MAC_OPT_FFD
//  359         if (mtxInfo.beaconTransmissionInProgress) {
//  360             if ((pPacket->txOptions & TX_OPT_INDIRECT)) {
//  361                 miqSetRequested(pPacket, FALSE);
//  362                 pPacket->transmissionStarted = FALSE;
//  363                 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
//  364             }
//  365             break;
//  366         }
//  367 #endif
//  368 
//  369         // Reset CSMA-CA parameters
//  370         mtxInfo.nb = mpib.macMaxCsmaBackoffs;
//  371         mtxInfo.be = mpib.macMinBE;
//  372         pPacket->slotted = !(BYTE)((mpib.macBeaconOrder == 15) || (pPacket->txMode & MTX_MODE_FORCE_UNSLOTTED_BM));
//  373         if (pPacket->slotted && mpib.macBattLifeExt) {
//  374             mtxInfo.be = (BYTE)(MIN(2, mtxInfo.be));
//  375         }
//  376 
//  377         // No break here!
//  378 
//  379     case MTX_STATE_SWITCHED_TO_UNSLOTTED:
//  380         mtxInfo.randomBackoff = msupGetRandomByte() & (BM(mtxInfo.be) - 1);
//  381 
//  382         mtxInfo.beaconSearchEnabled = FALSE;
//  383 
//  384         // Calculate the CSP timeout constant for slotted/unslotted transmissions, and go ahead if OK
//  385         mtxInfo.cspTimeout = mtxCalcCspTimeout();
//  386         if (mtxInfo.cspTimeout) {
//  387             mtxCreateStartTask();
//  388             mtxInfo.status = MTX_STATUS_WAITING;
//  389         } else
//  390         {
//  391 #if MAC_OPT_FFD
//  392             if ((pPacket->txOptions & TX_OPT_INDIRECT)) {
//  393                 miqSetRequested(pPacket, FALSE);
//  394                 pPacket->transmissionStarted = FALSE;
//  395                 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
//  396             } else {
//  397                 mtxInfo.status = MTX_STATUS_OUT_OF_CAP;
//  398             }
//  399 #else
//  400             mtxInfo.status = MTX_STATUS_OUT_OF_CAP;
//  401 #endif
//  402         }
//  403         pTask->state = MTX_STATE_WAIT;
//  404         break;
//  405 
//  406     case MTX_STATE_WAIT:
//  407 
//  408         switch (mtxInfo.status) {
//  409         case MTX_STATUS_WAITING:
//  410         case MTX_STATUS_WAIT_FOR_NEXT_BEACON:
//  411         case MTX_STATUS_TRANSMISSION_STARTED:
//  412         case MTX_STATUS_WAITING_FOR_ACK:
//  413         case MTX_STATUS_ACK_HANDLER_CREATED:
//  414             // Keep the current status/state
//  415             break;
//  416 
//  417         case MTX_STATUS_CHANNEL_ACCESS_FAILURE:
//  418             // For indirect packets with one or more retries left...
//  419 #if MAC_OPT_FFD
//  420             if ((pPacket->txOptions & TX_OPT_INDIRECT) && pPacket->retriesLeft) {
//  421                 pPacket->retriesLeft--;
//  422                 miqSetRequested(pPacket, FALSE);
//  423                 pPacket->transmissionStarted = FALSE;
//  424                 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
//  425 
//  426             // Otherwise...
//  427             } else {
//  428                 mtxFinishTransmission(CHANNEL_ACCESS_FAILURE, pPacket, pTask);
//  429             }
//  430 #else
//  431             mtxFinishTransmission(CHANNEL_ACCESS_FAILURE, pPacket, pTask);
//  432 #endif
//  433             break;
//  434 
//  435         case MTX_STATUS_ACK_TIMEOUT:
//  436             // Fail because of "no acknowledgment"?
//  437             if (pPacket->retriesLeft == 0) {
//  438                 mtxFinishTransmission(NO_ACK, pPacket, pTask);
//  439 
//  440             // Or retry?
//  441             } else {
//  442                 pPacket->retriesLeft--;
//  443 
//  444                 // Indirect packets don't retry autmatically!
//  445 #if MAC_OPT_FFD
//  446                 if (pPacket->txOptions & TX_OPT_INDIRECT) {
//  447                     miqSetRequested(pPacket, FALSE);
//  448                     pPacket->transmissionStarted = FALSE;
//  449                     mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
//  4

⌨️ 快捷键说明

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