현재 PC : 0x18122C9E인 경우
addr/line__|code_____|label____|mnemonic________________|comment
ST:18122C90|4010 and r0,r2
ST:18122C92|40C8 lsr r0,r1
ST:18122C94|40CB lsr r3,r1
ST:18122C96|1A18 sub r0,r3,r0
ST:18122C98|2801 cmp r0,#0x1
ST:18122C9A|D103 bne 0x18122CA4
| {
1552| gc_sm (UP_EV);
ST:18122C9C|2002 mov r0,#0x2
ST:18122C9E|FE6BF7FF____________bl______0x18122978_______;_gc_sm
ST:18122CA2|E002 b 0x18122CAA
| }
| else
| {
1556| gc_sm (STAY_EV);
ST:18122CA4|2001 mov r0,#0x1
ST:18122CA6|FE67F7FF bl 0x18122978 ; gc_sm
| }
| #endif /* hieonn #if 0 */
| }
|
|
| /* Check the page status it should be marked erased. */
R0~R15의 값
N _ R0 2 R8 0 SP> 0000030D
Z _ R1 6 R9 0 -1C 0000030F
C C R2 FFFFFFC0 R10 0 -18 00002842
V _ R3 14 R11 0 -14 01D63EE0
I _ R4 01D64160 R12 01803AD0 -10 00000000
F _ R5 01D63EE0 R13 01803AD0 -0C 0000030D
T T R6 01D64120 R14 18122C5D -08 00000004
J _ R7 18B5E7D4 PC 18122C9E -04 1812434D
usr SPSR CPSR 20000030 FP> 00900C0C
Q _ +04 00000004
이때, Stack Pointer (R13) : 01803AD0
___address__|________0________4________8________C_0123456789ABCDEF
SD:01803A70| 00000000 00000000 00000000 00000000 ................
SD:01803A80| 00000000 00000000 00000000 00000000 ................
SD:01803A90| 00000000 00000000 00000000 00000000 ................
SD:01803AA0| 00000000 00000000 00000000 00000000 ................
SD:01803AB0| 00000000 00000000 00000000 00000000 ................
SD:01803AC0| 00000000 00000000 00000000 00000000 ................
SD:01803AD0|>0000030D 0000030F 00002842 01D63EE0 ........B(...>..
SD:01803AE0| 00000000 0000030D 00000004 1812434D ............MC..
SD:01803AF0| 00900C0C 00000004 03000004 0000030C ................
SD:01803B00| 0000030E 00000000 00000000 00000000 ................
SD:01803B10| 00000004 00000001 30730000 00000000 ..........s0....
SD:01803B20| 00000200 00000036 00000000 00000000 ....6...........
SD:01803B30| 01D6371C 00901FE8 00901F68 0000081C .7......h.......
SD:01803B40| 01D6381C 01D6379C FFFFFFF1 0000030E .8...7..........
SD:01803B50| 01D6379C 01D6371C 00000A73 01DA6B00 .7...7..s....k..
SD:01803B60| 00000000 18014B03 000004C4 01DA6B00 .....K.......k..
SD:01803B70| 00000A73 180136FD 0000030E 01D63EE0 s....6.......>..
SD:01803B80| 00000025 01D76B00 00000004 01D638E4 %....k.......8..
0x1803AD0 : 0x30D
PC값 0x18122C9E
> opcode는 bl 0x18122978
0x18122978 : void gc_sm(..) 함수의 시작 지점인 push {r14} 지점을 가르킴
> PC > Jump > gc_sm()함수가 호출
> 돌아 갈 주소 r14 : 0x18122CA2을 의미하는 0x18122CA3 (Thumb mode)
_addr/line__|code_____|label____|mnemonic________________|comment
|
|void gc_sm (curr_gc_event_type curr_event)
1452|{
ST:18122978|B500 gc_sm: push {r14}
| curr_gc_state next_status;
| curr_gc_state old_status;
|
1456| old_status = curr_status; /* save the current status */
ST:1812297A|4B6E________________ldr_____r3,0x18122B34
ST:1812297C|7819 ldrb r1,[r3]
|
1458| if (curr_status == INIT_ST)
ST:1812297E|2900 cmp r1,#0x0
ST:18122980|D101 bne 0x18122986
1459| curr_status = STAY_ST;
ST:18122982|2101 mov r1,#0x1
ST:18122984|7019 strb r1,[r3]
|
1461| switch (curr_status)
ST:18122986|7819 ldrb r1,[r3]
ST:18122988|2901 cmp r1,#0x1
ST:1812298A|D005 beq 0x18122998
ST:1812298C|2902 cmp r1,#0x2
ST:1812298E|D101 bne 0x18122994
push {r14} > R14 : 0x1822CA3 > gc_sm()함수를 실행하고 나서 돌아가야 할곳
> push > SP : R13-0x4 > 0x1803ACC
> 0x1803ACC : R14 값 0x18122CA3
N _ R0 2 R8 0 SP> 18122CA3
Z _ R1 6 R9 0 FP> 0000030D
C C R2 FFFFFFC0 R10 0 +04 0000030F
V _ R3 14 R11 0 +08 00002842
I _ R4 01D64160 R12 01803AD0 +0C 01D63EE0
F _ R5 01D63EE0 R13 01803ACC +10 00000000
T T R6 01D64120 R14 18122CA3 +14 0000030D
J _ R7 18B5E7D4 PC 1812297A +18 00000004
usr SPSR CPSR 20000030 +1C 1812434D
Q _ +20 00900C0C
___address__|________0________4________8________C_0123456789ABCDEF
SD:01803A70| 00000000 00000000 00000000 00000000 ................
SD:01803A80| 00000000 00000000 00000000 00000000 ................
SD:01803A90| 00000000 00000000 00000000 00000000 ................
SD:01803AA0| 00000000 00000000 00000000 00000000 ................
SD:01803AB0| 00000000 00000000 00000000 00000000 ................
SD:01803AC0| 00000000 00000000 00000000>18122CA3 ................
//SD : 01803ACC
SD:01803AD0| 0000030D 0000030F 00002842 01D63EE0 ........B(...>..
SD:01803AE0| 00000000 0000030D 00000004 1812434D ............MC..
SD:01803AF0| 00900C0C 00000004 03000004 0000030C ................
SD:01803B00| 0000030E 00000000 00000000 00000000 ................
SD:01803B10| 00000004 00000001 30730000 00000000 ..........s0....
SD:01803B20| 00000200 00000036 00000000 00000000 ....6...........
SD:01803B30| 01D6371C 00901FE8 00901F68 0000081C .7......h.......
SD:01803B40| 01D6381C 01D6379C FFFFFFF1 0000030E .8...7..........
SD:01803B50| 01D6379C 01D6371C 00000A73 01DA6B00 .7...7..s....k..
SD:01803B60| 00000000 18014B03 000004C4 01DA6B00 .....K.......k..
SD:01803B70| 00000A73 180136FD 0000030E 01D63EE0 s....6.......>..
SD:01803B80| 00000025 01D76B00 00000004 01D638E4 %....k.......8..
Stack에 돌아 갈 주소 : r14 : 0x18122CA3를 쌓고서, 일을 시작
(FD stack)
gc_sm(..) 종료 > 0x18122CA2 (thumb) 로 돌아옴
> pop {pc}
> Stack에 들어 있던, R14 값 > PC에
> Stack Pointer를 +0x4
_addr/line__|code_____|label____|mnemonic________________|comment
| {
1552| gc_sm (UP_EV);
ST:18122C9C|2002 mov r0,#0x2
ST:18122C9E|FE6BF7FF bl 0x18122978 ; gc_sm
ST:18122CA2|E002________________b_______0x18122CAA
| }
| else
| {
1556| gc_sm (STAY_EV);
ST:18122CA4|2001 mov r0,#0x1
ST:18122CA6|FE67F7FF bl 0x18122978 ; gc_sm
| }
| #endif /* hieonn #if 0 */
| }
|
|
| /* Check the page status it should be marked erased. */
ST:18122CAA|6A68 ldr r0,[r5,#0x24]
ST:18122CAC|9901 ldr r1,[r13,#0x4]
ST:18122CAE|6843 ldr r3,[r0,#0x4]
ST:18122CB0|2200 mov r2,#0x0
ST:18122CB2|4798 blx r3
N _ R0 2 R8 0 SP> 0000030D
Z _ R1 010E R9 0 -1C 0000030F
C _ R2 18B5E7D4 R10 0 -18 00002842
V _ R3 18B5E7D4 R11 0 -14 01D63EE0
I _ R4 01D64160 R12 01803AD0 -10 00000000
F _ R5 01D63EE0 R13 01803AD0 -0C 0000030D
T T R6 01D64120 R14 18122995 -08 00000004
J _ R7 18B5E7D4 PC 18122CA2 -04 1812434D
usr SPSR CPSR 30 FP> 00900C0C
Q _ +04 00000004
___address__|________0________4________8________C_0123456789ABCDEF
SD:01803A70| 00000000 00000000 00000000 00000000 ................
SD:01803A80| 00000000 00000000 00000000 00000000 ................
SD:01803A90| 00000000 00000000 00000000 00000000 ................
SD:01803AA0| 00000000 00000000 00000000 00000000 ................
SD:01803AB0| 00000000 00000000 00000000 00000000 ................
SD:01803AC0| 00000000 00000000 00000000 18122CA3 ................
SD:01803AD0|>0000030D 0000030F 00002842 01D63EE0 ........B(...>..
// 총 16byte 4byte * 4
// 그래서 다음 SD (stack dump가) 01803AD0 > 01803AE0 // 16*1 = 16
SD:01803AE0| 00000000 0000030D 00000004 1812434D ............MC..
SD:01803AF0| 00900C0C 00000004 03000004 0000030C ................
SD:01803B00| 0000030E 00000000 00000000 00000000 ................
SD:01803B10| 00000004 00000001 30730000 00000000 ..........s0....
SD:01803B20| 00000200 00000036 00000000 00000000 ....6...........
SD:01803B30| 01D6371C 00901FE8 00901F68 0000081C .7......h.......
SD:01803B40| 01D6381C 01D6379C FFFFFFF1 0000030E .8...7..........
SD:01803B50| 01D6379C 01D6371C 00000A73 01DA6B00 .7...7..s....k..
SD:01803B60| 00000000 18014B03 000004C4 01DA6B00 .....K.......k..
r14 :0x18122CA2
R13 (SP) : 0x1803AD0
원래 0으로 채워져 있던 순백의 Stack 영역에 push,pop
push 했던 자리 > 다시 0x0으로 X
> SP만 옮김 > 값 : Clear X
> 특정 Stack에서 가장 많이 사용된 양 : 0x0가 아닌 주소가 바로 Stack을 최대로 많이 사용 했을 때의 값
> System여러개 사용 > Stack의 값 모니터링
>최대로 많이 사용 되었을 때의 Stack의 크기를 알 수 있음.
일단 줄 수 있는 만큼 크게 Stack을 줌 > Test
적당한 Stack 크기를 잡음 // Stack 최대 사용 test
> 최대 크기를 전체 Stack의 크기의 3/4 인 System
> Stack이 모자라서 Overflow나는 일 X
ex)
Stack의 start 번지 : 0x1000,
가장 많이 push를 해서 쌓았을 때의 주소 : 0x400
> 0x1000-0x400 = 0xC00
// 16진수 계산은 10진수로 변환 후 해야함
0xC00 : 전체 Stack Size의 3/4을 차지하게 하려면 0xC00 X 4/3 = 0x1000
//0xC00 이 3/4 차지 > 4/3 을 곱하면 전체 크기를 알 수 있음
>, 0x1000부터 ~ 0x2000 까지를 Stack으로 잡으면 문제 없음
// 전체크기 0x1000 = 4096
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
linked list, Queue (0) | 2024.12.11 |
---|---|
함수 포인터와 실행 주소 변경 (0) | 2024.12.08 |
stack 메모리 dump (0) | 2024.12.07 |
stack : 함수를 불렀을때 (1) | 2024.12.06 |
stack initialization (0) | 2024.12.05 |