【IoT】STM32FLASH와RAM사용상황보기(RO-data,RW-data,ZI-data)
Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116
1) 코드가 차지하는 공간입니다.
2) RO-data는 const형과 같이 Read Only가 상수만 읽는 크기입니다.
3) RW-data는 (Read Write)가 초기화한 읽기 및 쓰기 변수의 크기입니다.
4) ZI-data는 (Zero Initialize) 초기화되지 않은 읽기 및 쓰기 변수의 크기이며, ZI-data는 코드에 포함되지 않습니다. 초기화되지 않기 때문입니다.
1.1 Flash 사용
FLASH에서 쓰기 작업을 할 때 사용되는 공간은 다음과 같습니다.
Code+RO Data+RW Data
1.2 RAM 메모리 사용량(스택 제외)
프로그램이 실행될 때 칩 내부 RAM에 사용되는 공간은 다음과 같습니다.
RW Data + ZI Data
예:
Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952
Code, RO-data,RW-data ..............flash
RW-data, ZIdata ..............RAM
참고: 초기화 시 RW-data가 플래시에서 RAM으로 복사
생성된 맵 파일은list 폴더에 있음(KEIL)
Total RO Size (Code + RO Data) 18568 ( 18.13kB)
Total RW Size (RW Data + ZI Data) 4212 ( 4.11kB)
Total ROM Size (Code + RO Data + RW Data) 18828 ( 18.39kB)
2. ARM 이미지 파일의 구성
ARM 이미지 파일이란 ROM에 기록된 bin 파일을 지칭하며 이미지 파일이라고도 부른다.
Image 파일은 RO와 RW 데이터를 포함하는데 Image 파일에 ZI 데이터가 포함되지 않는 이유는 ZI 데이터가 모두 0이기 때문에 포함할 필요가 없다. 프로그램이 실행되기 전에 ZI 데이터가 있는 구역을 일률적으로 삭제하면 되고 포함은 오히려 저장 공간을 낭비하기 때문이다.
RO의 지령과 상수, 그리고 RW에서 초기화된 변수는 ZI처럼'무중생유'할 수 없다.
3. ARM 프로그램의 실행 과정
ROM에 기록된 이미지 파일은 실제 실행 중인 ARM 프로그램과 완전히 같지 않습니다.
따라서 ARM 프로그램이 어떻게 ROM의 이미지에서 실제 운행 상태에 이르는지 이해할 필요가 있다.
RO의 명령에는 적어도 다음과 같은 기능이 있어야 한다.
1) RW를 ROM에서 RAM으로 옮긴다. RW는 변수이기 때문에 변수는 ROM에 존재할 수 없다.
2) ZI가 있는 RAM 구역을 모두 삭제한다. ZI 구역이 Image에 없기 때문에 컴파일러가 제시한 ZI 주소와 크기에 따라 해당하는 RAM 구역을 제거해야 한다.
ZI에서도 변수이다. 같은 이치이다. 변수는 ROM에 존재할 수 없다. 프로그램이 실행되는 초기 단계에서 RO의 명령이 이 두 가지 작업을 완성한 후에야 C 프로그램이 변수에 정상적으로 접근할 수 있다.
그렇지 않으면 변수가 없는 코드만 실행할 수 있습니다.
예:
1)RO
다음 두 단락의 프로그램을 보면 그들 사이에 문장이 하나 모자랐는데, 이 문장은 바로 문자의 상수를 설명하는 것이다.
따라서 우리가 말한 바와 같이 그들 사이는 RO 데이터에서 한 바이트만 차이가 날 것이다.
Prog1:
#include
void main(void)
{
;
}
Prog2
:
#include
const char a = 5;
void main(void)
{
;
}
Prog1이 컴파일된 정보는 다음과 같습니다.
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog2가 컴파일한 정보는 다음과 같습니다.
================================================================================
Code RO Data RW Data ZI Data Debug
948 61 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1009 ( 0.99kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
================================================================================
이러한 두 프로그램을 컴파일한 정보는 다음과 같습니다.
Prog1과 Prog2의 RO는 코드와 RO Data 두 가지 데이터를 포함한다.
이들의 유일한 차이점은 Prog2의 ROData가 Prog1보다 1바이트 많다는 것이다.
만약 증가하는 것이 하나의 명령이지 상수가 아니라면, 결과는 코드 데이터의 크기에 차이가 있어야 한다.
2)RW
마찬가지로 두 프로그램을 보면 그들 사이에는'이미 초기화된 변수'하나만 차이가 난다. 앞서 말한 바와 같이 이미 초기화된 변수는 RW에 포함되어야 하기 때문에 두 프로그램 사이에는 RW 크기가 차이가 있어야 한다.
Prog3:
#include
void main(void)
{
;
}
Prog4:
#include
char a = 5;
void main(void)
{
;
}
Prog3 컴파일된 정보는 다음과 같습니다.
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog4 컴파일된 정보는 다음과 같습니다.
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 1 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
================================================================================
Prog3과 Prog4 사이에는 RW Data 사이에만 1바이트의 차이가 있음을 알 수 있다. 이 바이트는 바로 초기화된 문자형 변수'a'가 일으킨 것이다.
3)ZI
다시 두 프로그램을 보면 그들 사이의 차이는 초기화되지 않은 변수'a'이다. 이전의 이해에서 이 두 프로그램 사이에는 ZI 크기만 차이가 있을 것이라고 추측할 수 있다.
Prog3:
#include
void main(void)
{
;
}
Prog4:
#include
char a;
void main(void)
{
;
}
Prog3 컴파일된 정보는 다음과 같습니다.
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog4 컴파일된 정보는 다음과 같습니다.
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 97 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
컴파일된 결과는 ZI 데이터만 1바이트 차이가 났을 것이라는 추측에 완전히 부합한다.
이 바이트는 바로 초기화되지 않은 문자형 변수 'a' 가 일으킨 것이다.
참고:
변수가 0으로 초기화되면 해당 변수는 초기화되지 않은 중국 변수와 마찬가지로 ZI 영역에 배치됩니다.
즉, ARM C 프로그램에서 초기화되지 않은 모든 변수는 자동으로 0으로 초기화됩니다.
요약:
1) C의 명령 및 상수가 컴파일된 후 RO 형식 데이터;
2) C에서 초기화되지 않거나 0으로 초기화되지 않은 변수는 ZI 형식 데이터로 컴파일됩니다.
3) C에서 0이 아닌 변수로 초기화된 후 RW 유형의 데이터를 컴파일합니다.
부록:
프로그램의 컴파일 명령(프로그램 이름이 tst.c인 경우):
armcc -c -o tst.o tst.c armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o
컴파일된 정보는 aa에 있습니다.맵 파일에서
ROM은 주로 NAND Flash, Nor Flash를 가리킨다
RAM은 주로 PSRAM, SDRAM, SRAM, DDRAM을 가리킨다
쉽게 말하면 불을 다 태울 때는:
FLASH: Code+RO Data+RW Data
실행 중:
RAM: RW Data + ZI Data, 물론 스택 공간이 필요합니다.
refer:
https://blog.csdn.net/xkzju2010/article/details/51323901