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

📄 osal_nv.s51

📁 用IAR开发的ZIGBEE网络路由例子
💻 S51
📖 第 1 页 / 共 5 页
字号:
        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 + -