2016-10-04 2 views
1

제목에 따르면 FLASH에서 더 많은 공간을 사용하는 것은 무엇입니까 (예 : STM32 μC)? 전역 변수를 선언하거나 함수 내에서 정적 변수를 선언 하시겠습니까? 아니면 평등 한 공간을 차지합니까? 두 변수 모두 내 이해에서 프로그램의 전체 런타임 동안 사용할 수 있습니다. 그들의 범위 만 다릅니다.FLASH에서 더 많은 공간을 사용합니까? 정적 변수 또는 전역 변수

+2

이러한 종류의 변수는 동일한 방식으로 작동합니다. 플래시 점령의 차이는 초기화되지 않은 (자동 초기화 된 '0') 변수와 초기화 된 변수입니다. 두 번째 경우에서 값은 대개 플래시의 '데이터 섹션'에 저장됩니다. – LPs

답변

4

초기화 된 전역 변수와 정적 변수를 가질 수 있습니다. 그것들은 일반적으로 플래시를 사용하지 않습니다. 왜냐하면 프로그램이 시작될 때 할당되고 제로화 된 메모리 위치에 배치되고 플래시에서 오지 않기 때문입니다.

값을 사용하여 변수를 초기화 할 수도 있습니다. 이 경우에는 초기화 된 데이터 세그먼트에 배치되므로 데이터 유형의 크기에 따라 플래시에서 공간을 차지하십시오.

함수 내의 정적 변수 코드로 초기화 할 수도 있습니다. 이 초기화는 런타임에 이루어져야하지만 한 번만 발생할 수 있으므로 실제로는 더 많은 코드를 생성하므로 거의 모든 경우에 데이터 크기보다 더 많은 공간이 필요합니다. 함수 반환 값). const가 아닌 전역 변수에 대해서도 거의 동일하게 수행 할 수 있습니다. 즉, 0- 초기화 된 orignally로두고 main()의 시작 부분에 할당 (예 :)을 지정해야합니다. 여기서 함수 범위의 정적 변수 초기화와 동일한 공간을 사용합니다. 코드는 다른 곳에서 사용됩니다.

결론 글로벌 변수와 함수 범위의 정적 변수는 모두 같은 양의 공간을 차지합니다.


위의 내용은 포함 된 컨텍스트에서 "전역 변수"또는 파일 범위 고정 변수로 가정합니다. 동적으로 링크 가능한 실행 파일에 전역 심볼을 내 보낸 경우 해당 심볼의 재배치 정보는 실행 바이너리에서 약간의 공간을 차지합니다. 그러나 주어진 예제 시스템이 재배치 가능한 실행 파일을 지원하거나 사용한다고 생각하지 않습니다.

1

"전체 런타임에서 사용 가능"에 대한 공식 용어는 정적 저장 기간입니다. 파일 범위 ("global")에서 선언 된 변수와 static으로 선언 된 모든 변수는 모두 정적 저장 기간을가집니다.

따라서 범위와 저장 기간 사이에는 관계가 있습니다. 범위는 변수가 가져올 저장 기간을 지정합니다. 그러나 범위와 메모리 사용 간에는 아무런 관련이 없습니다.

변수가 차지하는 공간은 해당 변수 유형의 크기에 따라 다릅니다. 범위와 저장 기간은 아무 관계가 없습니다.

대부분의 컴파일러/링커에

, 순식간에 끝낼 수있는 변수에 필요한 두 가지 일반적으로있다 :

그것은 const로 선언해야하며,
  • 그것은 정적 저장 기간
  • 이 있어야합니다

    이러한 조건이 충족되지 않으면 선언 된 범위와 관계없이 변수가 flash/nvm에 저장되지 않습니다.

    +0

    'const'가 아닌 경우 "변수가 flash/nvm에 저장되지 않습니다"라는 의미는 무엇입니까? 내 말은, 초기 값은 어딘가에서 오는 것이므로 데이터가 플래시로 직접로드되지 않으면 (RAM에로드 됨) 코드로 플래시에 저장해야합니다. 그렇다면 왜 코드가 더 많은 공간을 차지하고 시작 시간을 늘리기 때문에 값을 컴파일 할 때 알 수 있습니까? (참고로, 나는 임베디드 항목에 대한 전문가가 아니며, 이것은 심각한 질문이다.) – hyde

    +0

    @hyde const가 아니면, 읽기/쓰기 변수이다. 읽기/쓰기 변수는 플래시에서 할당 할 수 없습니다. 그러한 변수에 초기화 프로그램이 있으면 실제로 초기화 프로그램을 플래시에 저장하고 초기화 중에 변수에 기록합니다. – Lundin

    +0

    그렇다면 플래시 메모리가 CPU 주소 공간에 매핑되고 직접 액세스 될 때 const 변수는 "정상적인"/ 휘발성 RAM을 차지하지 않을 수도 있습니다. 그러나 질문의 ​​"더 많은 공간을 사용"은 소스 코드에서 변수를 정의하여 추가 된 초기화 데이터 나 코드를 포함한다고 해석합니다. – hyde

    0

    제목에서 말한 것처럼 FLASH에서 더 많은 공간을 차지하는 것은 무엇입니까 (예 : STM32 μC)? 전역 변수를 선언하거나 함수 내에서 정적 변수를 선언 하시겠습니까? 아니면 평등 한 공간을 차지합니까?

    STM32 빌드의 참조로 arm-none-eabi-gcc를 사용하면 플래시 공간을 전혀 차지하지 않습니다.

    const 선언되지 않은 전역 변수와 정적 변수는 시작 초기화가 필요한 경우 .data 섹션으로, 시작하지 않는 경우 .bss으로 이동합니다. 이 두 세그먼트는 링커 스크립트에 의해 SRAM에 저장됩니다. C++을 수행하고 있다면 정적 C++ 클래스는 .bss이됩니다. 당신이 그들을 선언 할 경우

    const 그들은 당신이 당신의 링커 스크립트는 플래시에 .text의 하위에 위치하는 찾을 수 있어야에 문의 경우 .rodata 섹션에 배치됩니다. 플래시는 일반적으로 SRAM보다 풍부하므로 가능하면 const을 사용하십시오.

    마지막으로 옵티마이 저는 인라이닝을 위해 스토리지를 제거하는 등 적절하게 조정 된 모든 것을 재 배열 할 수 있습니다.

    관련 문제