.본문
.text 세그먼트에는 실제 코드가 포함되어 있으며 마이크로 컨트롤러 용 플래시 메모리로 프로그래밍되어 있습니다. 연속적이지 않은 여러 플래시 메모리 블록이있는 경우 하나 이상의 텍스트 세그먼트가있을 수 있습니다. 예를 들어 메모리 상단에 위치한 시작 벡터 및 인터럽트 벡터, 0에서 시작하는 코드; 부트 스트랩과 메인 프로그램을위한 별도의 섹션.
.bss 및 .data
함수 나 프로 시저 외부에 할당 할 수있는 세 가지 유형의 데이터가 있습니다. 첫 번째는 초기화되지 않은 데이터 (기록적으로 0으로 초기화 된 데이터도 포함하는 .bss라고 함)이고 두 번째는 초기화되지 않은 (비 bss) 또는 .data입니다. "bss"라는 이름은 60 년 전에 어셈블러에서 사용 된 "Block Started by Symbol"에서 유래했습니다. 이 두 영역은 모두 RAM에 있습니다.
프로그램이 컴파일 될 때 변수는이 두 가지 일반 영역 중 하나에 할당됩니다. 연결 단계 동안 모든 데이터 항목이 함께 수집됩니다. 초기화해야하는 모든 변수는 초기 값을 유지하기 위해 프로그램 메모리의 일부를 따로 보관하고 main ()이 호출되기 직전에 변수는 일반적으로 crt0이라는 모듈에 의해 초기화됩니다. bss 섹션은 동일한 시작 코드에 의해 모두 0으로 초기화됩니다.
몇 개의 마이크로 컨트롤러를 사용하면 RAM의 첫 페이지 (처음 256 개 위치, 때로는 0 페이지라고 함)에 액세스 할 수있는 더 짧은 명령어가 있습니다. 이러한 프로세서의 컴파일러는 near
변수를 지정 하는 것과 같은 키워드를 예약 할 수 있습니다. 마찬가지로 포인터 레지스터를 통해 특정 영역 만 참조 할 수있는 마이크로 컨트롤러도 있으며 (추가 명령 필요) 이러한 변수가 지정 far
됩니다. 마지막으로 일부 프로세서는 메모리 섹션을 비트 단위로 지정할 수 있으며 컴파일러는이를 키워드로 지정할 수 bit
있습니다.
따라서 이러한 변수가 수집되는 .nearbss 및 .neardata 등과 같은 추가 세그먼트가있을 수 있습니다.
.rodata
함수 나 프로 시저 외부의 세 번째 유형의 데이터는 초기화 된 변수와 비슷하지만 읽기 전용이며 프로그램에서 수정할 수 없다는 점이 다릅니다. C 언어에서 이러한 변수는 const
키워드를 사용하여 표시됩니다 . 일반적으로 프로그램 플래시 메모리의 일부로 저장됩니다. 때로는 .rodata (읽기 전용 데이터) 세그먼트의 일부로 식별되기도합니다. Harvard 아키텍처를 사용하는 마이크로 컨트롤러 에서 컴파일러는 특수 변수를 사용하여 이러한 변수에 액세스해야합니다.
스택 및 힙
스택과 힙은 모두 RAM에 배치됩니다. 프로세서의 아키텍처에 따라 스택이 커지거나 커질 수 있습니다. 자라면 RAM의 맨 아래에 배치됩니다. 자라면 RAM 끝에 배치됩니다. 힙은 변수에 할당되지 않은 나머지 RAM을 사용하고 스택의 반대 방향으로 커집니다. 스택 및 힙의 최대 크기는 일반적으로 링커 매개 변수로 지정할 수 있습니다.
스택에 배치 된 변수는 키워드없이 함수 나 프로 시저 내에 정의 된 모든 변수 static
입니다. 한 번은 자동 변수 ( auto
키워드) 라고 했지만 해당 키워드는 필요하지 않습니다. 역사적으로, auto
그것은 C보다 먼저 B 언어의 일부 였으므로 존재했습니다. 기능 매개 변수도 스택에 배치됩니다.
다음은 RAM의 일반적인 레이아웃입니다 (특별한 페이지 0 섹션이 없다고 가정).
EEPROM, ROM 및 NVRAM
플래시 메모리가 등장하기 전에 프로그램과 const 데이터 (.text 및 .rodata 세그먼트)를 저장하는 데 EEPROM (전기적으로 지울 수있는 프로그램 가능 읽기 전용 메모리)이 사용되었습니다. 이제는 사용 가능한 EEPROM의 양이 적습니다 (예 : 2KB-8KB 바이트). 일반적으로 전원을 껐다 켜도 유지해야하는 구성 데이터 또는 기타 소량의 데이터를 저장하는 데 사용됩니다. 주기. 이들은 프로그램에서 변수로 선언되지 않고 대신 마이크로 컨트롤러의 특수 레지스터를 사용하여 작성됩니다. EEPROM은 별도의 칩으로 구현할 수도 있고 SPI 또는 I²C 버스를 통해 액세스 할 수도 있습니다.
ROM은 출고시 프로그래밍 된 것 (사용자가 프로그래밍 할 수 없음)을 제외하고는 기본적으로 Flash와 동일합니다. 매우 큰 장치에만 사용됩니다.
NVRAM (비 휘발성 RAM)은 EEPROM의 대안이며 일반적으로 외부 IC로 구현됩니다. 일반 RAM은 배터리 백업시 비 휘발성으로 간주 될 수 있습니다. 이 경우 특별한 액세스 방법이 필요하지 않습니다.
플래시 메모리에 데이터를 저장할 수 있지만 플래시 메모리는 삭제 / 프로그램주기 (1000 ~ 10,000)의 수가 제한되어 있으므로 실제로 설계되지 않았습니다. 또한 한 번에 메모리 블록을 지워야하므로 몇 바이트 만 업데이트하는 것이 불편합니다. 코드 및 읽기 전용 변수를위한 것입니다.
EEPROM의 소거 / 프로그램주기 (100,000 ~ 1,000,000)에 대한 제한이 훨씬 높으므로이 목적에 훨씬 좋습니다. 마이크로 컨트롤러에 사용 가능한 EEPROM이 있고 충분히 큰 경우 비 휘발성 데이터를 저장하려는 위치입니다. 그러나 쓰기 전에 먼저 블록을 삭제해야합니다 (일반적으로 4KB).
EEPROM이 없거나 너무 작 으면 외부 칩이 필요합니다. 32KB EEPROM 은 66 ¢에 불과 하며 1,000,000 번까지 지우거나 쓸 수 있습니다. 같은 수의 지우기 / 프로그램 작업을 갖는 NVRAM은 훨씬 비쌉니다 (x10). NVRAM은 일반적으로 EEPROM보다 읽기 속도가 빠르지 만 쓰기 속도가 느립니다. 한 번에 1 바이트 또는 블록 단위로 기록 될 수 있습니다.
이 두 가지에 대한 더 나은 대안은 본질적으로 무한 쓰기 사이클 (100 조)을 가지며 쓰기 지연이없는 FRAM (강유전체 RAM)입니다. NVRAM과 거의 같은 가격이며 32KB에 약 5 달러입니다.