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

📄 mac_indirect_queue.s51

📁 zigbee location examples
💻 S51
📖 第 1 页 / 共 5 页
字号:
        DS 3
//   31 //-------------------------------------------------------------------------------------------------------
//   32 
//   33 
//   34 
//   35 
//   36 /*******************************************************************************************************
//   37  *******************************************************************************************************
//   38  **************************                 QUEUE MANAGEMENT                  **************************
//   39  *******************************************************************************************************
//   40  *******************************************************************************************************/
//   41 
//   42 
//   43 
//   44 
//   45 //-------------------------------------------------------------------------------------------------------
//   46 //  void miqInit(void)
//   47 //
//   48 //  DESCRIPTION:
//   49 //      Initializes the indirect packet queue
//   50 //-------------------------------------------------------------------------------------------------------

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   51 ROOT void miqInit(void) {
miqInit:
        CFI Block cfiBlock0 Using cfiCommon0
        CFI Function miqInit
        PUSH	DPL
        CFI DPL0 Frame(CFA_SP, 3)
        CFI CFA_SP SP+-3
        PUSH	DPH
        CFI DPH0 Frame(CFA_SP, 4)
        CFI CFA_SP SP+-4
        ; Saved register size: 2
        ; Auto size: 0
//   52     miqInfo.firstIndirectPacket = NO_PACKET;
        MOV	A,#-0x1
        MOV	DPTR,#miqInfo
        MOVX	@DPTR,A
//   53     miqInfo.lastIndirectPacket = NO_PACKET;
        MOV	DPTR,#(miqInfo + 1)
        MOVX	@DPTR,A
//   54     miqInfo.requestedCounter = 0;
        CLR	A
        MOV	DPTR,#(miqInfo + 2)
        MOVX	@DPTR,A
        CFI EndBlock cfiBlock0
//   55 } // miqInit
        REQUIRE ?Subroutine0
        ; // Fall through to label ?Subroutine0

        RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
        CFI Block cfiBlock1 Using cfiCommon0
        CFI NoFunction
        CFI CFA_SP SP+-4
        CFI DPL0 Frame(CFA_SP, 3)
        CFI DPH0 Frame(CFA_SP, 4)
        POP	DPH
        CFI CFA_SP SP+-3
        CFI DPH0 SameValue
        POP	DPL
        CFI CFA_SP SP+-2
        CFI DPL0 SameValue
        RET
        CFI EndBlock cfiBlock1
//   56 
//   57 
//   58 
//   59 
//   60 //-------------------------------------------------------------------------------------------------------
//   61 //  void miqAddIndirectPacket(MAC_TASK_INFO *pTask)
//   62 //
//   63 //  DESCRIPTION:
//   64 //      This task adds a packet to the indirect queue.
//   65 //
//   66 //  TASK DATA:
//   67 //      A pointer to the MAC_TX_PACKET to be added
//   68 //-------------------------------------------------------------------------------------------------------
//   69 void miqAddIndirectPacket(MAC_TASK_INFO *pTask) NEAR {
//   70     MAC_TX_PACKET   *pPacket = (MAC_TX_PACKET *) pTask->taskData;
//   71     MAC_TX_PACKET   *pIndirectPacket;
//   72     UINT8           temp;
//   73     BYTE            destAddrMode;
//   74     ADDRESS         *pDestAddr;
//   75 
//   76     switch (pTask->state) {
//   77     case MIQ_STATE_FIND_FIRST_PACKET_FROM_NODE:
//   78         // Start by determining whether or not this is the first indirect packet to this node.
//   79         pPacket->isFirstPacket = TRUE;
//   80         destAddrMode = (BYTE)(pPacket->pHeader[1] & DEST_ADDR_BM);
//   81         pDestAddr = (ADDRESS*) (pPacket->pHeader + 5);
//   82 
//   83         // Go through the whole packet queue, and clear the isFirstPacket flag if a match is found
//   84         temp = miqInfo.firstIndirectPacket;
//   85         while (temp != NO_PACKET) {
//   86             pIndirectPacket = &pMtxPacketPool[temp];
//   87             if (destAddrMode == (pIndirectPacket->pHeader[1] & DEST_ADDR_BM)) {
//   88                 if (destAddrMode == DEST_ADDR_SHORT) {
//   89                     if (pDestAddr->Short == *((WORD   *) (pIndirectPacket->pHeader + 5))) {
//   90                         pPacket->isFirstPacket = FALSE;
//   91                         break;
//   92                     }
//   93                 } else {
//   94                     if (msupCompareExtendedAddress((ADDRESS   *) pDestAddr, (ADDRESS   *) (pIndirectPacket->pHeader + 5))) {
//   95                         pPacket->isFirstPacket = FALSE;
//   96                         break;
//   97                     }
//   98                 }
//   99             }
//  100             temp = pIndirectPacket->nextPacket;
//  101         }
//  102         pTask->state = MIQ_STATE_INSERT_INTO_QUEUE;
//  103         break;
//  104 
//  105     case MIQ_STATE_INSERT_INTO_QUEUE:
//  106 
//  107         // Find the index of the new packet
//  108         temp = pPacket->poolIndex;
//  109 
//  110         // Add the packet to the queue
//  111         if (miqInfo.lastIndirectPacket != NO_PACKET)
//  112             pMtxPacketPool[miqInfo.lastIndirectPacket].nextPacket = temp;
//  113 
//  114         pPacket->prevPacket = miqInfo.lastIndirectPacket;
//  115         pPacket->nextPacket = NO_PACKET;
//  116         pPacket->timeToLive = mpib.macTransactionPersistenceTime;
//  117         pPacket->purgeRequest = FALSE;
//  118         pPacket->requested = FALSE;
//  119         pPacket->transmissionStarted = FALSE;
//  120 
//  121         // Update the global indexes
//  122         miqInfo.lastIndirectPacket = temp;
//  123         if (miqInfo.firstIndirectPacket == NO_PACKET) miqInfo.firstIndirectPacket = temp;
//  124 
//  125         // Remove the task
//  126         mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
//  127         break;
//  128     }
//  129 
//  130 } // miqAddIndirectPacket
//  131 
//  132 
//  133 
//  134 
//  135 //-------------------------------------------------------------------------------------------------------
//  136 //  void miqRemoveIndirectPacket(MAC_TASK_INFO *pTask)
//  137 //
//  138 //  DESCRIPTION:
//  139 //      This task removes a packet from the indirect queue. Note that the "requested flag" must have been
//  140 //      cleared before this task is created. To make sure that the packet is not requested again before
//  141 //      this task completes, the timeToLive counter should be set to < 1.
//  142 //
//  143 //  TASK DATA:
//  144 //      A pointer to the MAC_TX_PACKET to be removed.
//  145 //-------------------------------------------------------------------------------------------------------
//  146 void miqRemoveIndirectPacket(MAC_TASK_INFO *pTask) NEAR {
//  147     MAC_TX_PACKET   *pPacket = (MAC_TX_PACKET *) pTask->taskData;
//  148     MAC_TX_PACKET   *pIndirectPacket;
//  149     BYTE            temp;
//  150     BYTE            destAddrMode;
//  151     ADDRESS         *pDestAddr;
//  152 
//  153     switch (pTask->state) {
//  154     case MIQ_STATE_REMOVE_PACKET:
//  155 
//  156         // Update the link on the previous packet
//  157         if (pPacket->prevPacket != NO_PACKET) {
//  158             pMtxPacketPool[pPacket->prevPacket].nextPacket = pPacket->nextPacket;
//  159         }
//  160 
//  161         // Update the link on the next packet
//  162         if (pPacket->nextPacket != NO_PACKET) {
//  163             pMtxPacketPool[pPacket->nextPacket].prevPacket = pPacket->prevPacket;
//  164         }
//  165 
//  166         // Update the "head" and "tail" indexes of the queue
//  167         temp = pPacket->poolIndex;
//  168         if (temp == miqInfo.firstIndirectPacket) miqInfo.firstIndirectPacket = pPacket->nextPacket;
//  169         if (temp == miqInfo.lastIndirectPacket) miqInfo.lastIndirectPacket = pPacket->prevPacket;
//  170 
//  171         pTask->state = MIQ_STATE_MOVE_FIRST_PACKET_FLAG;
//  172         break;
//  173 
//  174     case MIQ_STATE_MOVE_FIRST_PACKET_FLAG:
//  175 
//  176         // If set here, then move the isFirstPacket flag to the next packet with same destination in the queue
//  177         if (pPacket->isFirstPacket) {
//  178             pPacket->isFirstPacket = FALSE;
//  179             temp = pPacket->nextPacket;
//  180             destAddrMode = (BYTE)(pPacket->pHeader[1] & DEST_ADDR_BM);
//  181             pDestAddr = (ADDRESS   *) (pPacket->pHeader + 5);
//  182 
//  183             // For each packet in the queue ...
//  184             while (temp != NO_PACKET) {
//  185                 pIndirectPacket = &pMtxPacketPool[temp];
//  186                 if (destAddrMode == (pIndirectPacket->pHeader[1] & DEST_ADDR_BM)) {
//  187                     if (destAddrMode == DEST_ADDR_SHORT) {
//  188                         if (pDestAddr->Short == *((WORD   *) (pIndirectPacket->pHeader + 5))) {
//  189                             pIndirectPacket->isFirstPacket = TRUE;
//  190                             break;
//  191                         }
//  192                     } else {
//  193                         if (msupCompareExtendedAddress((ADDRESS   *) pDestAddr, (ADDRESS   *) (pIndirectPacket->pHeader + 5))) {
//  194                             pIndirectPacket->isFirstPacket = TRUE;
//  195                             break;
//  196                         }
//  197                     }
//  198                 }
//  199                 temp = pIndirectPacket->nextPacket;
//  200             }
//  201         }
//  202 
//  203         // Clean up
//  204         mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
//  205         mtxpReleasePacket(pPacket);
//  206         break;
//  207     }
//  208 } // miqRemoveIndirectPacket
//  209 
//  210 //-------------------------------------------------------------------------------------------------------
//  211 //  BOOL miqFindIndirectPacket(ADDRESS *pDestAddr, BOOL isExtAddr)
//  212 //
//  213 //  DESCRIPTION:
//  214 //      Searches through the indirect packet queue for a match on the given address.
//  215 //
//  216 //  ARGUMENTS:
//  217 //      ADDRESS *pDestAddr
//  218 //          A pointer to the address to search for
//  219 //      BOOL isExtAddr
//  220 //          TRUE if pDestAddr points to an extended address
//  221 //
//  222 //  RETURN VALUE:
//  223 //      MAC_TX_PACKET
//  224 //          A packet was found a packet pointer is returned, if no packet is found NULL is returned
//  225 //-------------------------------------------------------------------------------------------------------

        RSEG NEAR_CODE:CODE:NOROOT(0)
//  226 ROOT MAC_TX_PACKET *miqFindIndirectPacket(ADDRESS *pDestAddr, BOOL isExtAddr) {
miqFindIndirectPacket:
        CFI Block cfiBlock2 Using cfiCommon0
        CFI Function miqFindIndirectPacket
        FUNCALL miqFindIndirectPacket, msupCompareExtendedAddress
        LOCFRAME XSTACK, 10, STACK
        ARGFRAME XSTACK, 10, STACK
        MOV	A,#-0xa
        LCALL	?FUNC_ENTER_XDATA
        CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
        CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
        CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
        CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
        CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
        CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-6)))
        CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-10)))
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 10)
        ; Saved register size: 10
        ; Auto size: 0
        MOV	?V0 + 0,R2
        MOV	?V0 + 1,R3
//  227     UINT8 temp;
//  228     BYTE destAddrMode = isExtAddr ? DEST_ADDR_EXT : DEST_ADDR_SHORT;
        MOV	A,R1
        JZ	??miqFindIndirectPacket_0
        MOV	?V0 + 2,#0xc
        SJMP	??miqFindIndirectPacket_1
??miqFindIndirectPacket_0:
        MOV	?V0 + 2,#0x8
//  229     MAC_TX_PACKET *pIndirectPacket;
//  230 
//  231     // For each packet in the queue ...
//  232     temp = miqInfo.firstIndirectPacket;
??miqFindIndirectPacket_1:
        MOV	DPTR,#miqInfo
        SJMP	??miqFindIndirectPacket_2
//  233     while (temp != NO_PACKET) {
//  234         pIndirectPacket = &pMtxPacketPool[temp];
//  235 
//  236         // ... return the packet index if there's a match on the address mode ...
//  237         if ((destAddrMode == (pIndirectPacket->pHeader[1] & DEST_ADDR_BM)) && (pIndirectPacket->transmissionStarted != TRUE)) {
//  238 
//  239             // ... and the address itself
//  240             if (destAddrMode == DEST_ADDR_SHORT) {
//  241                 if (pDestAddr->Short == *((WORD   *) (pIndirectPacket->pHeader + 5))) {
//  242                     return pIndirectPacket;
//  243                 }
//  244             } else {
//  245                 if (msupCompareExtendedAddress((ADDRESS   *) pDestAddr, (ADDRESS   *) (pIndirectPacket->pHeader + 5))) {
??miqFindIndirectPacket_3:
        ; Setup parameters for call to function msupCompareExtendedAddress
        MOV	R2,?V0 + 0
        MOV	R3,?V0 + 1
        LCALL	msupCompareExtendedAddress
        MOV	A,R1
        JNZ	??miqFindIndirectPacket_4
//  246                     return pIndirectPacket;
//  247                 }
//  248             }
//  249         }
//  250 
//  251 
//  252         // Move to the next packet in the queue
//  253         temp = pIndirectPacket->nextPacket;
??miqFindIndirectPacket_5:
        MOV	A,R6
        ADD	A,#-0x73
        MOV	DPL,A
        MOV	A,R7
        ADDC	A,#0x0
        MOV	DPH,A
??miqFindIndirectPacket_2:
        MOVX	A,@DPTR
        MOV	R2,A
        MOV	A,#-0x1
        XRL	A,R2
        JZ	??miqFindIndirectPacket_6
        MOV	A,R2
        MOV	B,#-0x6d
        MUL	AB
        ADD	A,#(pMtxPacketPool & 0xff)
        MOV	R6,A
        MOV	A,B
        ADDC	A,#((pMtxPacketPool >> 8) & 0xff)
        MOV	R7,A
        MOV	DPL,R6
        MOV	DPH,R7
        INC	DPTR
        INC	DPTR
        INC	DPTR
        INC	DPTR
        MOVX	A,@DPTR

⌨️ 快捷键说明

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