下面的例子是針對TI的ZStack-CC2530-2.5.0中的SerialApp例程(非官方例程)進行編譯剖析,通過檢視編譯輸出的MAP檔案來了解XDATA的大緻情況。
我們知道CC2530是8K的記憶體,這部分就是XDATA的大小,官方例程編譯完成已經用了7K左右的記憶體了,剩餘給我們使用的記憶體并不多。一旦我們想要擴大部分參數的時候,這點記憶體就顯得捉襟見肘了。
XDATA是用于靜态變量,包括全局變量和本地變量,如全局變量中的路由表,綁定表,以及協定棧使用的記憶體堆等,以及本地變量如ZDP_BUF等。下面羅列出幾個占用XDATA較多的靜态變量,開發者如果想要節省出部分XDATA用于自己的程式,需要評估自己的應用情況,酌情減少一些靜态變量,不要影響到自己原來功能的穩定性。
1.theHeap 2600 bytes.
Relative segment, address: XDATA 000011D3 - 00001BFA (0xa28 bytes), align: 0
Segment part 7. Intra module refs: osal_mem_alloc
osal_mem_free
osal_mem_init
LOCAL ADDRESS
===== =======
theHeap 000011D3
2.ZDP_Buf 80 bytes.
Relative segment, address: XDATA 000005DB - 0000062A (0x50 bytes), align: 0
Segment part 8. Intra module refs: ?Subroutine52
Segment part 10
ZDP_MgmtNwkUpdateNotify
ZDP_MgmtRtgRsp
ENTRY ADDRESS REF BY
===== ======= ======
ZDP_Buf 000005DB
3. app_AtProcess::buf 這是函數中的靜态緩沖 180 bytes.
Relative segment, address: XDATA 00000671 - 00000724 (0xb4 bytes), align: 0
Segment part 160. Intra module refs: ?Subroutine34
app_AtProcess
LOCAL ADDRESS
===== =======
app_AtProcess::buf 00000671
4.SerialApp_TxBuf 81 bytes.
Relative segment, address: XDATA 0000072A - 0000077A (0x51 bytes), align: 0
Segment part 23. Intra module refs: app_AuxDataSend
LOCAL ADDRESS
===== =======
SerialApp_TxBuf 0000072A
5.SerialApp_ChildBuf 44 bytes.
Relative segment, address: XDATA 000007CB - 000007F6 (0x2c bytes), align: 0
Segment part 30. Intra module refs: ?Subroutine25
app_MgrChildQuery
LOCAL ADDRESS
===== =======
SerialApp_ChildBuf 000007CB
6. dmaCh1234 32 bytes.
Relative segment, address: XDATA 00000807 - 00000826 (0x20 bytes), align: 0
Segment part 16. Intra module refs: HalDmaInit
ENTRY ADDRESS REF BY
===== ======= ======
dmaCh1234 00000807 AesDmaSetup (hal_aes)
HalUARTInitDMA (hal_uart)
HalUARTPollDMA (hal_uart)
Segment part 17 (hal_aes)
aesDmaInit (hal_aes)
7. HalLedStatusControl 37 bytes.
Relative segment, address: XDATA 00000831 - 00000855 (0x25 bytes), align: 0
Segment part 10. Intra module refs: ?Subroutine0
HalLedBlink
HalLedSet
HalLedUpdate
LOCAL ADDRESS
===== =======
HalLedStatusControl 00000831
8.dmaCfg 這邊用于序列槽緩沖等 529 bytes.
Relative segment, address: XDATA 00000867 - 00000A77 (0x211 bytes), align: 0
Segment part 26. Intra module refs: ?Subroutine10
?Subroutine14
?Subroutine16
?Subroutine18
?Subroutine4
?Subroutine7
HalUARTInitDMA
HalUARTIoctl
HalUARTIsrDMA
HalUARTOpenDMA
HalUARTPollDMA
HalUARTReadDMA
HalUARTRxAvailDMA
HalUARTWriteDMA
Segment part 59
LOCAL ADDRESS
===== =======
dmaCfg 00000867
9.macPib 60 bytes.
Relative segment, address: XDATA 00000A97 - 00000AD2 (0x3c bytes), align: 0
Segment part 9. Intra module refs: MAC_MlmeGetReq
MAC_MlmeSetReq
macPibReset
ENTRY ADDRESS REF BY
===== ======= ======
macPib 00000A97 MAC_MlmeResetReq (mac_beacon很多,不列了
10. AssociatedDevList 414 bytes.
Relative segment, address: XDATA 00000AF7 - 00000C94 (0x19e bytes), align: 0
Segment part 23.
ENTRY ADDRESS REF BY
===== ======= ======
AssociatedDevList 00000AF7 AssocFindEmpty (AddrMgr)
AssocGetNextNode (AddrMgr)
AssocGetWithAddress (AddrMgr)
AssocInit (AddrMgr)
AssocMatchDeviceStatus (AddrMgr)
AssocWriteNV (AddrMgr)
RTG_BcastAdd (AddrMgr)
Segment part 165 (AddrMgr)
Segment part 199 (AddrMgr)
Segment part 201 (AddrMgr)
Segment part 208 (AddrMgr)
Segment part 209 (AddrMgr)
Segment part 620 (nwk)
Segment part 625 (AddrMgr)
Segment part 738 (nwk)
Segment part 743 (nwk)
nwkNeighborFindRandom (nwk)
11.neighborTable 368 bytes.
Relative segment, address: XDATA 00000C95 - 00000E04 (0x170 bytes), align: 0
Segment part 30.
ENTRY ADDRESS REF BY
===== ======= ======
neighborTable 00000C95 AssocCheckDupNeighbors (AddrMgr)
RTG_AddRtgEntry (AddrMgr)
RTG_BcastAdd (AddrMgr)
Segment part 618 (nwk)
Segment part 633 (AddrMgr)
Segment part 695 (nwk)
Segment part 714 (nwk)
Segment part 719 (nwk)
Segment part 740 (nwk)
Segment part 748 (nwk)
Segment part 761 (nwk)
Segment part 762 (nwk)
Segment part 765 (nwk)
fun_printNBT (app_at)
nwkNeighborChangePANID (nwk)
nwkNeighborFindEmptySlot (nwk)
nwkNeighborFindRandom (nwk)
nwkNeighborUpdateNwkAddr (nwk)
12.rtgTable 280 bytes.
Relative segment, address: XDATA 00000E05 - 00000F1C (0x118 bytes), align: 0
Segment part 35.
ENTRY ADDRESS REF BY
===== ======= ======
rtgTable 00000E05 ?Subroutine33 (app_at)
NLME_GetRequest (AddrMgr)
RTG_AddRtgEntry (AddrMgr)
RTG_GetRtgEntry (AddrMgr)
RTG_TimerEvent (AddrMgr)
RTG_initRtgTable (AddrMgr)
RTG_nextHopIsBad (AddrMgr)
13.rtgSrcTable 72 bytes.
Relative segment, address: XDATA 00000F1D - 00000F64 (0x48 bytes), align: 0
Segment part 36.
ENTRY ADDRESS REF BY
===== ======= ======
rtgSrcTable 00000F1D RTG_AddSrcRtgEntry (AddrMgr)
RTG_GetRtgSrcIndex (AddrMgr)
Segment part 472 (AddrMgr)
Segment part 533 (AddrMgr)
Segment part 548 (AddrMgr)
14.rtgSrcRelayList 源路由轉發路徑 24 bytes.
Relative segment, address: XDATA 00000F65 - 00000F7C (0x18 bytes), align: 0
Segment part 37.
ENTRY ADDRESS REF BY
===== ======= ======
rtgSrcRelayList 00000F65 NLDE_ParseMsg (nwk)
RTG_ProcessRrec (AddrMgr)
15.rtDiscTable 64 bytes.
Relative segment, address: XDATA 00000F7D - 00000FBC (0x40 bytes), align: 0
Segment part 38.
ENTRY ADDRESS REF BY
===== ======= ======
rtDiscTable 00000F7D RTG_CheckRtDiscEntry (AddrMgr)
RTG_GetPrevHop (AddrMgr)
RTG_GetRtDiscEntry (AddrMgr)
RTG_TimerEvent (AddrMgr)
RTG_UpdateRtDiscEntry (AddrMgr)
Segment part 470 (AddrMgr)
16.bcastTable 168 bytes.
Relative segment, address: XDATA 00000FBD - 00001064 (0xa8 bytes), align: 0
Segment part 39.
ENTRY ADDRESS REF BY
===== ======= ======
bcastTable 00000FBD RTG_BcastAdd (AddrMgr)
RTG_BcastChk (AddrMgr)
RTG_BcastTimerHandler (AddrMgr)
RTG_Init (AddrMgr)
17.bcastHoldHandle 21 bytes.
Relative segment, address: XDATA 00001065 - 00001079 (0x15 bytes), align: 0
Segment part 40.
ENTRY ADDRESS REF BY
===== ======= ======
bcastHoldHandle 00001065 Segment part 600 (AddrMgr)
Segment part 636 (AddrMgr)
18.bcastHoldAckMask 84 bytes.
Relative segment, address: XDATA 0000107A - 000010CD (0x54 bytes), align: 0
Segment part 41.
ENTRY ADDRESS REF BY
===== ======= ======
bcastHoldAckMask 0000107A RTG_DataReq (AddrMgr)
Segment part 640 (AddrMgr)
19.BindingTable 56 bytes.
Relative segment, address: XDATA 000010CE - 00001105 (0x38 bytes), align: 0
Segment part 54.
ENTRY ADDRESS REF BY
===== ======= ======
BindingTable 000010CE ?Subroutine15 (BindingTable)
?Subroutine16 (BindingTable)
?Subroutine22 (BindingTable)
?Subroutine23 (BindingTable)
?Subroutine24 (BindingTable)
?Subroutine27 (BindingTable)
GetBindingTableEntry(BindingTable)
InitBindingTable (BindingTable)
Segment part 54 (BindingTable)
Segment part 64 (BindingTable)
bindAddEntry (BindingTable)
bindFind (BindingTable)
bindFindExisting (BindingTable)
bindNumOfEntries (BindingTable)