📄 osal_nv.s51
字号:
MOVX A,@DPTR
XRL A,#0xff
JNZ ??initNV_23
INC DPTR
MOVX A,@DPTR
XRL A,#0xff
??initNV_23:
JNZ ??initNV_21
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
XRL A,#0xff
JNZ ??initNV_24
INC DPTR
MOVX A,@DPTR
XRL A,#0xff
??initNV_24:
JNZ ??initNV_21
MOV A,#0x6
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
XRL A,#0xff
JNZ ??initNV_25
INC DPTR
MOVX A,@DPTR
XRL A,#0xff
??initNV_25:
JNZ ??initNV_21
// 386 {
// 387 writeWordD( pg, OSAL_NV_IEEE_OFFSET, (uint8 *)(&ieee) );
; Setup parameters for call to function writeWordD
MOV A,#0x8
LCALL ?XSTACK_DISP0_8
MOV R4,DPL
MOV R5,DPH
MOV R2,#-0x8
MOV R3,#0x7
MOV A,R6
MOV R1,A
MOV DPTR,#(??writeWordD & 0xffff)
MOV A,#((??writeWordD >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 388 }
// 389 }
// 390 } // for ( pg = OSAL_NV_PAGE_BEG; pg <= OSAL_NV_PAGE_END; pg++ )
??initNV_21:
INC R6
MOV A,R6
CLR C
SUBB A,#0x3e
JNC $+5
LJMP ??initNV_7 & 0xFFFF
// 391
// 392 /* First the old page is erased, and then the new page is put into use.
// 393 * So if a transfer was in progress, the new page will always not yet be
// 394 * marked as in use, since that is the last step to ending a transfer.
// 395 */
// 396 if ( newPg != OSAL_NV_PAGE_NULL )
MOV A,R7
JZ ??initNV_26
// 397 {
// 398 /* If there is already a fallow page reserved, keep it and put the newPg in use.
// 399 * An unfinished compaction will finish to the new reserve page and the old page
// 400 * will be erased and reserved.
// 401 */
// 402 if ( pgRes != OSAL_NV_PAGE_NULL )
MOV DPTR,#??pgRes
MOVX A,@DPTR
JZ ??initNV_27
// 403 {
// 404 setPageUse( newPg, TRUE );
; Setup parameters for call to function setPageUse
MOV R2,#0x1
MOV A,R7
MOV R1,A
MOV DPTR,#(??setPageUse & 0xffff)
MOV A,#((??setPageUse >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
SJMP ??initNV_28
// 405 }
// 406 else
// 407 {
// 408 pgRes = newPg;
??initNV_27:
MOV A,R7
MOVX @DPTR,A
// 409 }
// 410
// 411 /* If a page compaction was interrupted and the page being compacted is not
// 412 * yet erased, then there may be items remaining to xfer before erasing.
// 413 */
// 414 if ( oldPg != OSAL_NV_PAGE_NULL )
??initNV_28:
MOV A,?V0 + 1
JZ ??initNV_26
// 415 {
// 416 compactPage( oldPg );
; Setup parameters for call to function compactPage
MOV R1,A
MOV DPTR,#(??compactPage & 0xffff)
MOV A,#((??compactPage >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 417 }
// 418 }
// 419
// 420 return (pgRes != OSAL_NV_PAGE_NULL);
??initNV_26:
MOV DPTR,#??pgRes
MOVX A,@DPTR
JZ ??initNV_29
MOV R1,#0x1
SJMP ??initNV_30
??initNV_29:
MOV R1,#0x0
??initNV_30:
MOV A,#0x10
CFI EndBlock cfiBlock0
REQUIRE ?Subroutine66
; // Fall through to label ?Subroutine66
// 421 }
RSEG BANKED_CODE:CODE:NOROOT(0)
?Subroutine66:
CFI Block cfiBlock1 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 18)
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-9)))
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(-10)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V1 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)))
CFI Invalid
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 10)
CFI Valid
MOV R7,#0x2
LJMP ?BANKED_LEAVE_XDATA
CFI EndBlock cfiBlock1
// 422
// 423 /*********************************************************************
// 424 * @fn setPageUse
// 425 *
// 426 * @brief Set page header active/inUse state according to 'inUse'.
// 427 *
// 428 * @param pg - Valid NV page to verify and init.
// 429 * @param inUse - Boolean TRUE if inUse, FALSE if only active.
// 430 *
// 431 * @return none
// 432 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 433 static void setPageUse( uint8 pg, uint8 inUse )
??setPageUse:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function ??setPageUse
// 434 {
FUNCALL ??setPageUse, ??writeWord
LOCFRAME ISTACK, 2, STACK
LOCFRAME XSTACK, 8, STACK
ARGFRAME ISTACK, 2, STACK
ARGFRAME XSTACK, 8, 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: 8
MOV A,#-0x8
LCALL ?ALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 8)
// 435 osalNvPgHdr_t pgHdr;
// 436
// 437 pgHdr.active = OSAL_NV_ZEROED_ID;
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
// 438
// 439 if ( inUse )
MOV A,R2
JZ ??setPageUse_1
// 440 {
// 441 pgHdr.inUse = OSAL_NV_ZEROED_ID;
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
CLR A
SJMP ??setPageUse_2
// 442 }
// 443 else
// 444 {
// 445 pgHdr.inUse = OSAL_NV_ERASED_ID;
??setPageUse_1:
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOV A,#-0x1
??setPageUse_2:
LCALL ??Subroutine29_0 & 0xFFFF
// 446 }
// 447
// 448 writeWord( pg, OSAL_NV_PAGE_HDR_OFFSET, (uint8*)(&pgHdr) );
??CrossCallReturnLabel_81:
MOV R2,#0x0
MOV R3,#0x0
MOV DPTR,#(??writeWord & 0xffff)
MOV A,#((??writeWord >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 449 }
MOV A,#0x8
LCALL ?DEALLOC_XSTACK8
CFI EndBlock cfiBlock2
REQUIRE ?Subroutine67
; // Fall through to label ?Subroutine67
RSEG BANKED_CODE:CODE:NOROOT(0)
?Subroutine67:
CFI Block cfiBlock3 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+-5
CFI DPL0 Frame(CFA_SP, 4)
CFI DPH0 Frame(CFA_SP, 5)
POP DPH
CFI CFA_SP SP+-4
CFI DPH0 SameValue
POP DPL
CFI CFA_SP SP+-3
CFI DPL0 SameValue
LJMP ?BRET
CFI EndBlock cfiBlock3
// 450
// 451 /*********************************************************************
// 452 * @fn initPage
// 453 *
// 454 * @brief Walk the page items; calculate checksums, lost bytes & page offset.
// 455 *
// 456 * @param pg - Valid NV page to verify and init.
// 457 * @param id - Valid NV item Id to use function as a "findItem".
// 458 * If set to NULL then just perform the page initialization.
// 459 *
// 460 * @return If 'id' is non-NULL and good checksums are found, return the offset
// 461 * of the data corresponding to item Id; else OSAL_NV_ITEM_NULL.
// 462 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 463 static uint16 initPage( uint8 pg, uint16 id )
??initPage:
CFI Block cfiBlock4 Using cfiCommon0
CFI Function ??initPage
// 464 {
FUNCALL ??initPage, ??setItem
LOCFRAME XSTACK, 25, STACK
ARGFRAME XSTACK, 25, STACK
FUNCALL ??initPage, ??readHdr
LOCFRAME XSTACK, 25, STACK
ARGFRAME XSTACK, 25, STACK
FUNCALL ??initPage, ??calcChkF
LOCFRAME XSTACK, 25, STACK
ARGFRAME XSTACK, 25, STACK
FUNCALL ??initPage, ??findItem
LOCFRAME XSTACK, 25, STACK
ARGFRAME XSTACK, 25, STACK
FUNCALL ??initPage, ??setItem
LOCFRAME XSTACK, 25, STACK
ARGFRAME XSTACK, 25, STACK
MOV A,#-0xf
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 V6 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-13)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-14)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-15)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 15)
; Saved register size: 15
; Auto size: 10
MOV A,#-0xa
LCALL ?ALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 25)
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
LCALL ?Subroutine35 & 0xFFFF
??CrossCallReturnLabel_93:
MOV ?V0 + 6,R1
// 465 uint16 offset = OSAL_NV_PAGE_HDR_SIZE;
MOV ?V0 + 2,#0x8
MOV ?V0 + 3,#0x0
// 466 uint16 sz, lost = 0;
MOV R6,#0x0
MOV R7,#0x0
SJMP ??initPage_1
// 467 osalNvHdr_t hdr;
// 468
// 469 do
// 470 {
// 471 readHdr( pg, offset, (uint8 *)(&hdr) );
// 472
// 473 if ( hdr.id == OSAL_NV_ERASED_ID )
// 474 {
// 475 break;
// 476 }
// 477 offset += OSAL_NV_HDR_SIZE;
// 478 sz = ((hdr.len + (OSAL_NV_WORD_SIZE-1)) / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE;
// 479
// 480 // A bad 'len' write has blown away the rest of the page.
// 481 if ( (offset + sz) > OSAL_NV_PAGE_FREE )
// 482 {
// 483 lost += (OSAL_NV_PAGE_FREE - offset + OSAL_NV_HDR_SIZE);
// 484 offset = OSAL_NV_PAGE_FREE;
// 485 break;
// 486 }
// 487
// 488 if ( hdr.id != OSAL_NV_ZEROED_ID )
// 489 {
// 490 if ( hdr.chk == calcChkF( pg, offset, hdr.len ) )
// 491 {
// 492 /* This trick allows function to do double duty for findItem() without
// 493 * compromising its essential functionality at powerup initialization.
// 494 */
// 495 if ( id != OSAL_NV_ITEM_NULL )
// 496 {
// 497 /* This trick allows asking to find the old/transferred item in case
// 498 * of a successful new item write that gets interrupted before the
// 499 * old item can be zeroed out.
// 500 */
// 501 if ( (id & 0x7fff) == hdr.id )
// 502 {
// 503 if ( (((id & 0x8000) == 0) && (hdr.stat == OSAL_NV_ERASED_ID)) ||
// 504 (((id & 0x8000) != 0) && (hdr.stat != OSAL_NV_ERASED_ID)) )
// 505 {
// 506 return offset;
// 507 }
// 508 }
// 509 }
// 510 // When invoked from the osal_nv_init(), find and zero any duplicates.
// 511 else if ( hdr.stat == OSAL_NV_ERASED_ID )
// 512 {
// 513 /* The trick of setting the MSB of the item Id causes the logic
// 514 * immediately above to return a valid page only if the header 'stat'
// 515 * indicates that it was the older item being transferred.
// 516 */
// 517 uint16 off = findItem( (hdr.id | 0x8000) );
// 518
// 519 if ( off != OSAL_NV_ITEM_NULL )
// 520 {
// 521 setItem( findPg, off, eNvZero ); // Mark old duplicate as invalid.
// 522 }
// 523 }
// 524 }
// 525 else
// 526 {
// 527 setItem( pg, offset, eNvZero ); // Mark bad checksum as invalid.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -