inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

전동킥보드로 배우는 임베디드 실전 프로젝트

Stm32f767 메모리맵 분석해보기

74. 포인터 크기는얼마인가요 ?

57

윤남경

작성한 질문수 36

0

메모리맵에서 code, data, txt는 각각 어떻게 분배되어 저장되나요 ? (ZI, ZW, RO/RW)

그리고 함수 포인터를 사용한다면 메모리상의 몇번지에 저장되어 있고, 그 크기가 얼마인지 어떻게 알수 있을까요 ? 만약 uint8_t라는 포인터 변수를 선언하면, *p+1은 주소 번지 1의 증가를 의미 하나요 ?

임베디드 stm32 hardware motordriver artwork

답변 1

0

제어쟁이

네, 이 부분은 메모리 구조를 같이 보면 이해하기 쉽습니다.

STM32 기준으로 일반적인 배치는 다음과 같습니다. 프로그램 코드인 .text와 상수 데이터인 .rodata는 보통 Flash 영역에 저장되며 RO(Read Only) 영역에 해당합니다. 초기값이 있는 전역/정적 변수인 .data는 초기값 자체는 Flash에 저장되어 있다가 부팅할 때 RAM으로 복사되어 RW(Read/Write) 영역에서 사용됩니다. 초기값이 없거나 0으로 초기화되는 전역/정적 변수는 .bss, 즉 ZI(Zero Initialized) 영역으로 RAM에 배치됩니다. Stack과 Heap 역시 RAM을 사용합니다. 정확한 주소와 크기는 Linker Script와 .map 파일을 보면 확인할 수 있습니다.

함수 포인터의 경우 void (*fp)(void)처럼 선언하면, fp에는 함수 자체가 저장되는 것이 아니라 함수의 주소가 저장됩니다. STM32F767처럼 32-bit Cortex-M MCU에서는 일반적으로 포인터 크기가 4Byte입니다. sizeof(fp)로 직접 확인할 수도 있습니다.

함수 코드는 보통 Flash의 .text 영역에 있고, 함수 포인터 변수 자체가 어디에 저장되는지는 선언 위치에 따라 달라집니다. 지역변수라면 주로 Stack, 전역/정적 변수라면 .data 또는 .bss에 위치합니다.

그리고 uint8_t *p에서 p + 1은 말씀하신 것처럼 주소가 1Byte 증가합니다. 포인터 연산은 가리키는 자료형의 크기만큼 이동하기 때문입니다. 따라서 uint32_t *p라면 p + 1 시 주소가 4Byte 증가합니다.

0

윤남경

자세한 설명과 답변 감사합니다.

제가 이해하기에는 결국 메모리 설정과 레지스터 설정이 핵심인것으로 이해 됩니다.

포인터에 익숙해지도록 노력이 필요하겠네요 .


Buck Converter design

0

56

2

uart 실습

0

66

1

VM 배선

0

61

2

듀티 조절 코드 질문

0

57

2

Query Regarding PCB Design and Manufacturing for Firmware Testing

0

60

3

홀카터 질문

0

48

1

C46~C48 크기

0

54

2

Teleplot 문의

0

53

1

MCU 선정 관련 문의

0

70

1

전류 센싱 문의

0

72

2

키트 구매 여부

0

77

3

소형모터 구동

0

52

2

stm 클럭설정

0

57

1

36. 전력은 900W가 될것 같습니다.

0

49

1

34.제너다이오드는 전류 분배기라고 생각하면 될까요 ?

0

42

0

33.제너다이오드와 tvs다이오드 모양이 동일합니다.

0

48

0

쓰로틀 V 변하지 않음

0

90

3

풀업 저항 크기와 커패시터 용량 선정 방법

0

70

2

86, data bit순서가 바뀌어야 할것 같습니다.

0

59

1

85. pwm사용에 기본구조 이해가 같이 요구되네요

0

60

1

dc모터 회전원리

0

66

2

83. volatile로 선언한 이유가 이해 안됩니다.

0

56

1

82. 16:50초 설명에 대한 오해 및 adc mode비교 자료

0

83

2

81. 소프트웨어 작성 방법론에 조언 부탁 드립니다.

0

76

2