2009年3月17日 星期二

uc-os ii 記憶體佔用分析-part1

Data: 2009/03/17

嘗試 庖丁解牛,一個個分析所塞入的變數 PART1

XDATA 0000H 0105H UNIT ?XD?OS_CORE
XDATA 0105H 00A2H UNIT ?XD?SERIAL
XDATA 01A7H 007CH UNIT ?XD?DEMO
XDATA 0223H 0049H UNIT ?XD?UCOS_II

1.XDATA 0000H 0105H UNIT ?XD?OS_CORE


一開始要分析有點困難,將m51中 有關 OS_CORE 獨立放於另一個檔案
MODULE OS_CORE
xxxxxxxxxxxx
ENDMOD OS_CORE

X:0000H SYMBOL OSTaskStatStk; 60 ->0x3c
X:003CH SYMBOL OSTCBTbl; 一個 tcb佔 20
X:00C8H SYMBOL OSIntExitY
X:00C9H SYMBOL OSTaskIdleStk


x:0003H SYMBOL prio
x:0004H SYMBOL ptos
x:0007H SYMBOL pbos
x:000AH SYMBOL id
x:000CH SYMBOL stk_size
x:000EH SYMBOL pext
x:0011H SYMBOL opt
------------------------------------
x:0000H SYMBOL ptcb
x:0003H SYMBOL x
x:0004H SYMBOL y
x:0005H SYMBOL bitx
x:0006H SYMBOL bity
x:0007H SYMBOL prio
上面只是一小部份,還有很多重複,程式如何做覆蓋分析的呢 ??
( X:0000H SYMBOL OSTaskStatStk)

60(stack)+20x7(tcb)+1+60(stack) = 261 =0x105 (0x00 ~ 0x104)

補充: 總共有 7 個 task
#define OS_MAX_TASKS 5
static OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];

/* 因為 OS_TASK_STAT_EN =1 ,故為 2
//#if OS_TASK_STAT_EN
//#define OS_N_SYS_TASKS 2 /* Number of system tasks */
//#else
//#define OS_N_SYS_TASKS 1
//#endif



2.XDATA 0105H 00A2H UNIT ?XD?SERIAL
0xa2 = 162
X:0105H PUBLIC inRxBuf
X:0108H PUBLIC outRxBuf
X:010BH PUBLIC inTxBuf
X:010EH PUBLIC outTxBuf

X:0111H PUBLIC RxBuf
X:0143H PUBLIC TxBuf

//unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收發緩衝區實體
//unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收發緩衝區讀寫指針

//#define LenTxBuf 100
//#define LenRxBuf 50

四個指針 4*3 =12
另外緩衝區 150
---------------------------TOTAL 162




3. XDATA 01A7H 007CH UNIT ?XD?DEMO
ultraedit ctrl+f "01A7H"

X:01A7H PUBLIC Fun_Sem
X:01AAH PUBLIC TaskStartStkyya
X:01E6H PUBLIC TaskStartStkyyb

--指針三個BYTe 0x1a7 -> 0x1a9
--0x1aa + 60 (stack size) = 0x1aa + 0x3c = 0x1e6
--另一段堆疊的底
--0x1e6 + 0x3c = 0x222

----------totol resource get from xram
60+60+3=123= 0x7b ...還少一個

繼續查 m51,有一個 0x222 為 err




4.XDATA 0223H 0049H UNIT ?XD?UCOS_II
0x223+0x49=0x26c (end)
又 0x49 = 73

--OS_EXT OS_EVENT OSEventTbl[OS_MAX_EVENTS];

// struct {
// void *OSEventPtr;
// INT8U OSEventTbl[OS_EVENT_TBL_SIZE];
// INT16U OSEventCnt; /* Count of used when event is a semaphore */
// INT8U OSEventType; /* OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_Q or OS_EVENT_TYPE_SEM */
// INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
// } OS_EVENT;

// #define OS_MAX_EVENTS 2

-- 8*2 =16 byte

有重複命名的嫌疑 ?? OSEventTbl[OS_MAX_EVENTS] v.s OSEventTbl[OS_EVENT_TBL_SIZE]

--OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];
又 #define OS_LOWEST_PRIO 6
---指針3 byte --> 3*7=21


X:0223H PUBLIC OSRdyGrp ;1
X:0224H PUBLIC OSCPUUsage ;1
X:0225H PUBLIC OSIdleCtrRun ;4
X:0229H PUBLIC OSLockNesting ;1
X:022AH PUBLIC OSTCBList ;3 pointer
X:022DH PUBLIC OSTCBFreeList ;3
X:0230H PUBLIC OSIntNesting ;1
X:0231H PUBLIC OSTime ;4
X:0235H PUBLIC OSTCBPrioTbl ;21
X:024AH PUBLIC OSCtxSwCtr ;4
X:024EH PUBLIC OSEventTbl ;16
X:025EH PUBLIC OSEventFreeList ;3
X:0261H PUBLIC OSIdleCtr ;4
X:0265H PUBLIC OSTaskCtr ;1
X:0266H PUBLIC OSStatRdy ;1
X:0267H PUBLIC OSIdleCtrMax ;4
X:026BH PUBLIC OSRdyTbl ;1
---------------------------------total--------73 =36+21+16

沒有留言:

張貼留言