2013-06-25 2 views
1

C 언어로 된 임베디드 시스템을 프로그래밍하고 있으며 두 개의 상수 멤버 "val"과 "ptr"이있는 구조체를 정의합니다.상수 멤버가있는 구조체에 대한 메모리 할당

typedef struct{ 
const u8 val; 
u8 *const ptr; 
}TEST; 

이러한 유형 변수를 전역 변수로 선언하면 변수가 ROM이나 RAM에 저장됩니까?

TEST var; 

감사

테스트 인스턴스가 읽기/쓰기 메모리에 갈 필요
+0

ROM에 저장해야하는 이유는 무엇입니까? 메모리는 스택 또는 힙 중 하나에 할당됩니다. 메모리 할당은 언어마다 다르므로 사용하는 언어를 언급하십시오. – Narendra

+0

나는 C 언어로 임베디드 시스템을 프로그래밍하고 있는데, "u8 var"을 선언하면 ROM에, "const u8 var"을 선언하면 ROM에 모든 변수가 RAM에 저장됩니다. 그러나 위에서 언급 한 것처럼 전역 구조 변수를 선언 할 때 상수 멤버가있는 구조가 해당 멤버를 RAM 또는 ROM에 배치할지 여부는 확실하지 않습니다. 고맙습니다. – user2518461

+0

적절한 사람들이 귀하를 안내 할 수 있도록 질문에 적절한 태그를 추가하십시오. – Narendra

답변

2

- 그것의 모든 멤버 CONST에도 불구하고 TEST 인스턴스가 const가 아닌 것입니다. GCC는 구조체를 읽기/쓰기 인 .data로 내보내고 링커 스크립트는이를 적절한 메모리 유형에 넣어야합니다.

C에서 'const'는 저장소가 실제로 변경 불가능하다는 것을 보장하지 않습니다. 이는 C 표준을 엄격하게 수행하는 프로그램에 'const'항목이 수정되지 않는다는 것을 의미합니다.

데이터를 ROM에 저장하려면 .rodata 섹션을 ROM에 저장하는 적절한 링커 스크립트가 필요합니다.

+0

나는이 괜찮은 대답에 두 가지를 추가 할 것이다. 하나는 소스 내에서 링커 스크립트에 정의 된 적절한 섹션에 변수를 저장하도록 컴파일러 관련 키워드 (예 : gcc의 "속성 섹션")를 사용해야하고 다른 하나는 "const" 조금 분명히해야합니다. 예를 들어 일반적으로 const에 대한 포인터를 내용을 수정하지 않아야하는 함수에 전달할 수 있으며 "const volatile"명백한 모순이 언급 될만한 가치가 있습니다. – Jubatian

관련 문제