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

📄 osal_nv.lst

📁 cc2430应用实例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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           */

   \                                 In segment BANKED_CODE, align 1, keep-with-next
    463          static uint16 initPage( uint8 pg, uint16 id )
   \                     ??initPage:
    464          {
   \   000000   74F1         MOV     A,#-0xf
   \   000002   12....       LCALL   ?BANKED_ENTER_XDATA
   \   000005                ; Saved register size: 15
   \   000005                ; Auto size: 10
   \   000005   74F6         MOV     A,#-0xa
   \   000007   12....       LCALL   ?ALLOC_XSTACK8
   \   00000A   85..82       MOV     DPL,?XSP + 0
   \   00000D   85..83       MOV     DPH,?XSP + 1
   \   000010   12....       LCALL   ?Subroutine35 & 0xFFFF
   \                     ??CrossCallReturnLabel_93:
   \   000013   89..         MOV     ?V0 + 6,R1
    465            uint16 offset = OSAL_NV_PAGE_HDR_SIZE;
   \   000015   75..08       MOV     ?V0 + 2,#0x8
   \   000018   75..00       MOV     ?V0 + 3,#0x0
    466            uint16 sz, lost = 0;
   \   00001B   7E00         MOV     R6,#0x0
   \   00001D   7F00         MOV     R7,#0x0
   \   00001F   8037         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.
   \                     ??initPage_2:
   \   000021                ; Setup parameters for call to function setItem
   \   000021   7C01         MOV     R4,#0x1
   \   000023   AA..         MOV     R2,?V0 + 2
   \   000025   AB..         MOV     R3,?V0 + 3
   \   000027   A9..         MOV     R1,?V0 + 6
   \                     ??initPage_3:
   \   000029   90....       MOV     DPTR,#(??setItem & 0xffff)
   \   00002C   74..         MOV     A,#((??setItem >> 16) & 0xff)
   \   00002E   12....       LCALL   ?BCALL               ; Banked call to: DPTR()
    528                }
    529              }
    530          
    531              if ( hdr.id == OSAL_NV_ZEROED_ID )
   \                     ??initPage_4:
   \   000031   7402         MOV     A,#0x2
   \   000033   12....       LCALL   ?XSTACK_DISP0_8
   \   000036   E0           MOVX    A,@DPTR
   \   000037   7002         JNZ     ??initPage_5
   \   000039   A3           INC     DPTR
   \   00003A   E0           MOVX    A,@DPTR
   \                     ??initPage_5:
   \   00003B   700F         JNZ     ??initPage_6
    532              {
    533                lost += (OSAL_NV_HDR_SIZE + sz);
   \   00003D   7408         MOV     A,#0x8
   \   00003F   25..         ADD     A,?V0 + 0
   \   000041   F8           MOV     R0,A
   \   000042   E4           CLR     A
   \   000043   35..         ADDC    A,?V0 + 1
   \   000045   F9           MOV     R1,A
   \   000046   EE           MOV     A,R6
   \   000047   28           ADD     A,R0
   \   000048   FE           MOV     R6,A
   \   000049   EF           MOV     A,R7
   \   00004A   39           ADDC    A,R1
   \   00004B   FF           MOV     R7,A
    534              }
    535              offset += sz;
   \                     ??initPage_6:
   \   00004C   E5..         MOV     A,?V0 + 2
   \   00004E   25..         ADD     A,?V0 + 0
   \   000050   F5..         MOV     ?V0 + 2,A
   \   000052   E5..         MOV     A,?V0 + 3
   \   000054   35..         ADDC    A,?V0 + 1
   \   000056   F5..         MOV     ?V0 + 3,A
    536          
    537            } while ( TRUE );
   \                     ??initPage_1:
   \   000058                ; Setup parameters for call to function readHdr
   \   000058   7402         MOV     A,#0x2
   \   00005A   12....       LCALL   ?XSTACK_DISP0_8
   \   00005D   AC82         MOV     R4,DPL
   \   00005F   AD83         MOV     R5,DPH
   \   000061   AA..         MOV     R2,?V0 + 2
   \   000063   AB..         MOV     R3,?V0 + 3
   \   000065   A9..         MOV     R1,?V0 + 6
   \   000067   90....       MOV     DPTR,#(??readHdr & 0xffff)
   \   00006A   74..         MOV     A,#((??readHdr >> 16) & 0xff)
   \   00006C   12....       LCALL   ?BCALL               ; Banked call to: DPTR()
   \   00006F   7402         MOV     A,#0x2
   \   000071   12....       LCALL   ?XSTACK_DISP0_8
   \   000074   E0           MOVX    A,@DPTR
   \   000075   64FF         XRL     A,#0xff
   \   000077   7004         JNZ     ??initPage_7
   \   000079   A3           INC     DPTR
   \   00007A   E0           MOVX    A,@DPTR
   \   00007B   64FF         XRL     A,#0xff
   \                     ??initPage_7:
   \   00007D   603C         JZ      ??initPage_8
   \   00007F   E5..         MOV     A,?V0 + 2
   \   000081   2408         ADD     A,#0x8
   \   000083   F5..         MOV     ?V0 + 2,A
   \   000085   E5..         MOV     A,?V0 + 3
   \   000087   3400         ADDC    A,#0x0
   \   000089   F5..         MOV     ?V0 + 3,A
   \   00008B   7404         MOV     A,#0x4
   \   00008D   12....       LCALL   ?XSTACK_DISP0_8
   \   000090   12....       LCALL   ?Subroutine10 & 0xFFFF
   \                     ??CrossCallReturnLabel_32:
   \   000093   F5..         MOV     ?V0 + 0,A
   \   000095   74FF         MOV     A,#-0x1
   \   000097   59           ANL     A,R1
   \   000098   F5..         MOV     ?V0 + 1,A
   \   00009A   E5..         MOV     A,?V0 + 0
   \   00009C   25..         ADD     A,?V0 + 2
   \   00009E   F8           MOV     R0,A
   \   00009F   E9           MOV     A,R1
   \   0000A0   12....       LCALL   ?Subroutine47 & 0xFFFF
   \                     ??CrossCallReturnLabel_124:
   \   0000A3   4037         JC      ??initPage_9
   \   0000A5   E4           CLR     A
   \   0000A6   2E           ADD     A,R6
   \   0000A7   F8           MOV     R0,A
   \   0000A8   7408         MOV     A,#0x8
   \   0000AA   3F           ADDC    A,R7
   \   0000AB   F9           MOV     R1,A
   \   0000AC   E8           MOV     A,R0
   \   0000AD   C3           CLR     C
   \   0000AE   95..         SUBB    A,?V0 + 2
   \   0000B0   FE           MOV     R6,A
   \   0000B1   E9           MOV     A,R1
   \   0000B2   95..         SUBB    A,?V0 + 3
   \   0000B4   FF           MOV     R7,A
   \   0000B5   75..F8       MOV     ?V0 + 2,#-0x8
   \   0000B8   75..07       MOV     ?V0 + 3,#0x7
    538          
    539            pgOff[pg - OSAL_NV_PAGE_BEG] = offset;
   \                     ??initPage_8:
   \   0000BB   E5..         MOV     A,?V0 + 6
   \   0000BD   12....       LCALL   ??Subroutine45_0 & 0xFFFF
   \                     ??CrossCallReturnLabel_118:
   \   0000C0   E5..         MOV     A,?V0 + 2
   \   0000C2   F0           MOVX    @DPTR,A
   \   0000C3   A3           INC     DPTR
   \   0000C4   E5..         MOV     A,?V0 + 3
   \   0000C6   12....       LCALL   ?Subroutine32 & 0xFFFF
    540            pgLost[pg - OSAL_NV_PAGE_BEG] = lost;
   \                     ??CrossCallReturnLabel_89:
   \   0000C9   EE           MOV     A,R6
   \   0000CA   F0           MOVX    @DPTR,A
   \   0000CB   A3           INC     DPTR
   \   0000CC   EF           MOV     A,R7
   \   0000CD   F0           MOVX    @DPTR,A
    541          
    542            return OSAL_NV_ITEM_NULL;
   \   0000CE   7A00         MOV     R2,#0x0
   \   0000D0   7B00         MOV     R3,#0x0
   \                     ??initPage_10:
   \   0000D2   740A         MOV     A,#0xa
   \   0000D4   12....       LCALL   ?DEALLOC_XSTACK8
   \   0000D7   7F07         MOV     R7,#0x7
   \   0000D9   02....       LJMP    ?BANKED_LEAVE_XDATA
   \                     ??initPage_9:
   \   0000DC   7402         MOV     A,#0x2
   \   0000DE   12....       LCALL   ?XSTACK_DISP0_8
   \   0000E1   E0           MOVX    A,@DPTR
   \   0000E2   7002         JNZ     ??initPage_11
   \   0000E4   A3           INC     DPTR
   \   0000E5   E0           MOVX    A,@DPTR
   \                     ??initPage_11:
   \   0000E6   7003         JNZ     $+5
   \   0000E8   02....       LJMP    ??initPage_4 & 0xFFFF
   \   0000EB                ; Setup parameters for call to function calcChkF
   \   0000EB   7404         MOV     A,#0x4
   \   0000ED   12....       LCALL   ?XSTACK_DISP0_8
   \   0000F0   12....       LCALL   ?Subroutine14 & 0xFFFF
   \                     ??CrossCallReturnLabel_36:
   \   0000F3   AA..         MOV     R2,?V0 + 2
   \   0000F5   AB..         MOV     R3,?V0 + 3
   \   0000F7   A9..         MOV     R1,?V0 + 6
   \   0000F9   90....       MOV     DPTR,#(??calcChkF & 0xffff)
   \   0000FC   74..         MOV     A,#((??calcChkF >> 16) & 0xff)
   \   0000FE   12....       LCALL   ?BCALL               ; Banked call to: DPTR()
   \   000101   8A..         MOV     ?V0 + 4,R2
   \   000103   8B..         MOV     ?V0 + 5,R3
   \   000105   A8..   

⌨️ 快捷键说明

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