📄 mac_tx.s51
字号:
// 370 * @return none
// 371 **************************************************************************************************
// 372 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 373 void macTxStartQueuedFrame(void)
macTxStartQueuedFrame:
CFI Block cfiBlock12 Using cfiCommon0
CFI Function macTxStartQueuedFrame
// 374 {
FUNCALL macTxStartQueuedFrame, halAssertHandler
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL macTxStartQueuedFrame, ??txGo
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 375 halIntState_t s;
// 376
// 377 MAC_ASSERT(!macRxActive && !macRxOutgoingAckFlag); /* queued frames should not transmit in middle of a receive */
MOV DPTR,#macRxActive
MOVX A,@DPTR
JNZ ??macTxStartQueuedFrame_0
MOV DPTR,#macRxOutgoingAckFlag
MOVX A,@DPTR
JZ ??macTxStartQueuedFrame_1
??macTxStartQueuedFrame_0:
; Setup parameters for call to function halAssertHandler
MOV DPTR,#(halAssertHandler & 0xffff)
MOV A,#((halAssertHandler >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 378
// 379 /*
// 380 * Critical sections around the state change prevents any sort of race condition
// 381 * with macTxFrame(). This guarantees function txGo() will only be be called once.
// 382 */
// 383 HAL_ENTER_CRITICAL_SECTION(s);
??macTxStartQueuedFrame_1:
MOV C,0xa8.7
CLR A
MOV 0xE0 /* A */.0,C
CLR 0xa8.7
// 384 if (macTxActive == MAC_TX_ACTIVE_QUEUED)
MOV DPTR,#macTxActive
MOVX A,@DPTR
XRL A,#0x2
JNZ ??macTxStartQueuedFrame_2
// 385 {
// 386 macTxActive = MAC_TX_ACTIVE_GO;
MOV A,#-0x7d
LCALL ?Subroutine2 & 0xFFFF
// 387 HAL_EXIT_CRITICAL_SECTION(s);
// 388 txGo();
??CrossCallReturnLabel_5:
LCALL ?BCALL ; Banked call to: DPTR()
SJMP ??macTxStartQueuedFrame_3
// 389 }
// 390 else
// 391 {
// 392 HAL_EXIT_CRITICAL_SECTION(s);
??macTxStartQueuedFrame_2:
MOV 0xa8.7,C
// 393 }
// 394 }
??macTxStartQueuedFrame_3:
SJMP ??Subroutine3_0
CFI EndBlock cfiBlock12
RSEG BANKED_CODE:CODE:NOROOT(0)
?Subroutine2:
CFI Block cfiCond13 Using cfiCommon0
CFI NoFunction
CFI Conditional ??CrossCallReturnLabel_5
CFI DPL0 Frame(CFA_SP, 4)
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
CFI Block cfiCond14 Using cfiCommon0
CFI (cfiCond14) NoFunction
CFI (cfiCond14) Conditional ??CrossCallReturnLabel_4
CFI (cfiCond14) R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI (cfiCond14) VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI (cfiCond14) V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI (cfiCond14) R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI (cfiCond14) ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI (cfiCond14) ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI (cfiCond14) ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI (cfiCond14) DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI (cfiCond14) DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI (cfiCond14) CFA_SP SP+0
CFI (cfiCond14) CFA_XSP16 add(XSP16, 9)
CFI Block cfiPicker15 Using cfiCommon1
CFI (cfiPicker15) NoFunction
CFI (cfiPicker15) Picker
MOVX @DPTR,A
MOV 0xa8.7,C
; Setup parameters for call to function txGo
; Setup parameters for call to function txGo
MOV DPTR,#(??txGo & 0xffff)
MOV A,#((??txGo >> 16) & 0xff)
RET
CFI EndBlock cfiCond13
CFI EndBlock cfiCond14
CFI EndBlock cfiPicker15
// 395
// 396
// 397 /**************************************************************************************************
// 398 * @fn macTxChannelBusyCallback
// 399 *
// 400 * @brief This callback is executed if a CSMA transmit was attempted but the channel
// 401 * was busy.
// 402 *
// 403 * @param none
// 404 *
// 405 * @return none
// 406 **************************************************************************************************
// 407 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 408 void macTxChannelBusyCallback(void)
macTxChannelBusyCallback:
CFI Block cfiBlock16 Using cfiCommon0
CFI Function macTxChannelBusyCallback
// 409 {
FUNCALL macTxChannelBusyCallback, halAssertHandler
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL macTxChannelBusyCallback, ??txComplete
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL macTxChannelBusyCallback, ??txCsmaPrep
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL macTxChannelBusyCallback, ??txCsmaGo
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 410 MAC_ASSERT((macTxType == MAC_TX_TYPE_SLOTTED_CSMA) || (macTxType == MAC_TX_TYPE_UNSLOTTED_CSMA));
MOV DPTR,#macTxType
MOVX A,@DPTR
JZ ??macTxChannelBusyCallback_0
XRL A,#0x1
JZ ??macTxChannelBusyCallback_0
; Setup parameters for call to function halAssertHandler
MOV DPTR,#(halAssertHandler & 0xffff)
MOV A,#((halAssertHandler >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 411
// 412 /* clear channel assement failed, follow through with CSMA algorithm */
// 413 nb++;
??macTxChannelBusyCallback_0:
MOV DPTR,#??nb
MOVX A,@DPTR
INC A
MOVX @DPTR,A
// 414 if (nb > macPib.maxCsmaBackoffs)
MOV DPTR,#(macPib + 27)
MOVX A,@DPTR
PUSH A
CFI CFA_SP SP+-6
MOV DPTR,#??nb
MOVX A,@DPTR
MOV R2,A
POP A
CFI CFA_SP SP+-5
CLR C
SUBB A,R2
JNC ??macTxChannelBusyCallback_1
// 415 {
// 416 txComplete(MAC_CHANNEL_ACCESS_FAILURE);
; Setup parameters for call to function txComplete
MOV R1,#-0x1f
MOV DPTR,#(??txComplete & 0xffff)
MOV A,#((??txComplete >> 16) & 0xff)
SJMP ??macTxChannelBusyCallback_2
// 417 }
// 418 else
// 419 {
// 420 macTxBe = MIN(macTxBe+1, macPib.maxBe);
??macTxChannelBusyCallback_1:
MOV DPTR,#macTxBe
MOVX A,@DPTR
MOV R0,A
MOV A,#0x1
ADD A,R0
INC R0
CLR A
ADDC A,#0x0
MOV R1,A
MOV DPTR,#(macPib + 39)
MOVX A,@DPTR
MOV R2,A
MOV A,R0
SUBB A,R2
MOV A,R1
SUBB A,#0x0
CLR C
XRL A,PSW
RLC A
JNC ??macTxChannelBusyCallback_3
MOV DPTR,#macTxBe
MOVX A,@DPTR
INC A
MOV R2,A
??macTxChannelBusyCallback_3:
MOV A,R2
MOV DPTR,#macTxBe
MOVX @DPTR,A
// 421 txCsmaPrep();
; Setup parameters for call to function txCsmaPrep
MOV DPTR,#(??txCsmaPrep & 0xffff)
MOV A,#((??txCsmaPrep >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 422 txCsmaGo();
; Setup parameters for call to function txCsmaGo
MOV DPTR,#(??txCsmaGo & 0xffff)
MOV A,#((??txCsmaGo >> 16) & 0xff)
??macTxChannelBusyCallback_2:
LJMP ?Subroutine5 & 0xFFFF
CFI EndBlock cfiBlock16
// 423 }
// 424 }
// 425
// 426
// 427 /**************************************************************************************************
// 428 * @fn macTxDoneCallback
// 429 *
// 430 * @brief This callback is executed when transmit completes.
// 431 *
// 432 * @param none
// 433 *
// 434 * @return none
// 435 **************************************************************************************************
// 436 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 437 void macTxDoneCallback(void)
macTxDoneCallback:
CFI Block cfiBlock17 Using cfiCommon0
CFI Function macTxDoneCallback
// 438 {
FUNCALL macTxDoneCallback, ??txComplete
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
FUNCALL macTxDoneCallback, macCspTxRequestAckTimeoutCallback
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
MOV A,#-0x9
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 V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 9)
; Saved register size: 9
; Auto size: 0
// 439 halIntState_t s;
// 440
// 441 /*
// 442 * There is a small chance this function could be called twice for a single transmit.
// 443 * To prevent logic from executing twice, the state variable macTxActive is used as
// 444 * a gating mechanism to guarantee single time execution.
// 445 */
// 446 HAL_ENTER_CRITICAL_SECTION(s);
MOV C,0xa8.7
CLR A
MOV 0xE0 /* A */.0,C
MOV R6,A
CLR 0xa8.7
// 447 if (macTxActive == MAC_TX_ACTIVE_GO)
MOV DPTR,#macTxActive
MOVX A,@DPTR
XRL A,#0x83
JNZ ??macTxDoneCallback_0
// 448 {
// 449 /* see if ACK was requested */
// 450 if (!txAckReq)
MOV DPTR,#??txAckReq
MOVX A,@DPTR
JNZ ??macTxDoneCallback_1
// 451 {
// 452 macTxActive = MAC_TX_ACTIVE_DONE;
MOV A,#-0x7c
MOV DPTR,#macTxActive
MOVX @DPTR,A
// 453 HAL_EXIT_CRITICAL_SECTION(s);
MOV 0xa8.7,C
// 454
// 455 /* ACK was not requested, transmit is complete */
// 456 txComplete(MAC_SUCCESS);
; Setup parameters for call to function txComplete
MOV R1,#0x0
MOV DPTR,#(??txComplete & 0xffff)
MOV A,#((??txComplete >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
SJMP ??macTxDoneCallback_2
// 457 }
// 458 else
// 459 {
// 460 /*
// 461 * ACK was requested - must wait to receive it. A timer is set
// 462 * to expire after the timeout duration for waiting for an ACK.
// 463 * If an ACK is received, the function macTxAckReceived() is called.
// 464 * If an ACK is not received within the timeout period,
// 465 * the function macTxAckTimeoutCallback() is called.
// 466 */
// 467 macTxActive = MAC_TX_ACTIVE_LISTEN_FOR_ACK;
??macTxDoneCallback_1:
MOV A,#-0x7b
MOV DPTR,#macTxActive
MOVX @DPTR,A
// 468 MAC_RADIO_TX_REQUEST_ACK_TIMEOUT_CALLBACK();
; Setup parameters for call to function macCspTxRequestAckTimeoutCallback
MOV DPTR,#(macCspTxRequestAckTimeoutCallback & 0xffff)
MOV A,#((macCspTxRequestAckTimeoutCallback >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 469 HAL_EXIT_CRITICAL_SECTION(s);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -