# 정수형 표현 방법
unsigned char a; -> [0, 255]
char a; -> [-128, 127]
카운트 업하면서 값 살펴보면 signed 는 128이 -1이 됨.
근데 메모리에서 살펴보면 둘 값은 똑같이 찍힘
∴ 메모리까지는 signed도 unsigned처럼 쭉 증가하지만, 값이 출력되는 과정에서 부호 판단하고 출력
# 변수 영역 (변수 표현을 위해 사용되는 메모리 영역)
함수, 전역변수 -> symbol -> mapfile 확인
지역변수 -> symol아니므로 mapfile에 기록 x
const 자료형으로 선언된 변수들은 나중에 값 수정이 안된다. 따라서 ROM영역에 할당됨
지역변수, 전역변수는 RAM, register에 할당됨
지역변수는 보통 레지스터에 할당되는데, 레지스터를 모두 사용하면 메모리(스택)에 할당된다
전역변수가 정의될때(메모리가 할당될 때)는 빌드될때이고, 지역변수가 정의될때는 코드 실행 시점.
# 계산 검증
987654321 / 10000 = 98765
987654321 % 10000 = 4321
# 빌드 과정
개발자가 c코드와 어셈블리어 코드를 작성
c코드가 어셈블러를 통해 어셈블리어 코드로 변경.
두 어셈블리 파일이 오브젝트 파일로 변경되고, 두 오브젝트 파일을 합치기 위해선 linker가 필요함
링커를 거친 파일이 *.elf (axf) 파일(무조건 만들어짐).
사용자가 선택적으로 bin, hex파일까지 만들 수 있음.
# 1. ELF (axf)
Debug Session을 누르면 ELF 파일이 선택되고 그 파일 내부에 포함된 bin에 해당하는 내용만 메모리에 다운로드.
bin을 제외한 나머지는 디버깅 정보로 디버거 S/W가 내부적으로 관리.
# 2. hex
아스키 형태의 텍스트로 구성됨
ELF파일로부터 추출
레코드로 이루어져있음
레코드(시작코드, 바이트 개수, 주소, 레코드 종류, 데이터, 체크섬)
# 3. bin
순수한 raw data들로 구성
ELF파일로부터 추출
ROM bInary
ROM에 있는 데이터들을 그대로 dump하여 파일로 가지고 있는 것과 같음
# bin 파일 구성
# Modular 연산자를 이용해 연산 속도 향상시키기
#include <stdio.h>
int main()
{
int a = 545654321;
int tmp2;
tmp2 = (a % 100000) ;
printf("strat number: %d \n", tmp2); // 54321
printf("%d \n", tmp2 / 10000);
tmp2 = tmp2 % 10000;
printf("%d \n", tmp2 / 1000);
tmp2 = tmp2 % 1000;
printf("%d \n", tmp2 / 100);
tmp2 = tmp2 % 100;
printf("%d \n", tmp2 / 10);
tmp2 = tmp2 % 10;
printf("%d \r\n", tmp2); //1
}
- 몇자리 숫자가 들어오든 10000자리 부터 1자리 까지 앞숫자만 출력할 것임
- 먼저 start number을 만들어줄건데, modular 연산자를 이용해 먼저 자릿수를 연산하기 쉽게 만들어주고, 작업해주면 편함
# 스택
- 스택은 8byte 단위로 움직인다
- 함수가 호출되면 RAM에 __initial_sp부터 주소는 감소하면서 스택은 증가한다
- FD모델 : Full Descending
- 스택 크기는 1024가 할당됨
# 이중함수 호출 시 스택 변화
Disassembly살펴보면,
main문에서 MyFunc2를 호출하면 초기 lr값(main 돌아가기 위한 lr) 저장됨
MyFunc2 내부에서 MyFunc함수를 또 만나면 lr값이 필요하기에 기존 lr (main문 돌아가기위한 lr)은 백업을 한다
-> PUSH {r4, lr}
MyFunc 작업이 끝나면 원래의 lr을 복구해야함
-> POP {r4, pc}
# PUSH, POP 원리
- 짝수개의 피연산자가 필요한 명령어 이므로, R0라는 무의미한 값을 넣어준다
# 포인터
- 포인터는 가리키는 대상의 메모리 주소 위치를 담고 있음
- 포인터 자체는 4B로 크기 고정 (주소값이므로)
int (*p) [4];
p = (int(*)[4]) 0x100
변수명 : P
타입 : int(*)[4]
p는 4B이고, p가 가리키는 배열은 16Byte
# 20,000,000 번지에 값 넣어보기
p = (int *) 0x20000000
//*p = 100
*(int*) 0x20000000 = 100 // 이 표현도 가능
'FW 심화 과정 > [2] STM32심화실습' 카테고리의 다른 글
0721 외부변수참조 / .h / CPU구조 / reg와argument / 슈도명령어 ~234 (0) | 2022.07.22 |
---|---|
0720 포인터,배열의 동작구조 / 함수포인터 / 구조체 / union ~176 (0) | 2022.07.22 |
0720 형식지정자(typedef) / 매크로 ~84 (0) | 2022.07.21 |
0718 16진수용량계산 / ROM,RAM / Keil (0) | 2022.07.18 |
0715 웹 서버 기반 하드웨어 제어 (0) | 2022.07.17 |
0715 인터럽트 / I2C를 이용한 가속도센서 (0) | 2022.07.17 |