2011-12-15 5 views
5

ARM 코어 텍스 M3의 내부 플래시를 저장하고자하는 구성 구조가 있습니다. 사양에 따르면 내부 플래시의 데이터 저장은 32 비트로 정렬되어야합니다. 부울이 많고 구조체에 문자가 있기 때문에 8 비트를 저장하는 데 32 비트를 사용하고 싶지 않습니다 ... __packed 전 처리기 pragma를 사용하여 구조체를 패킹하기로 결정한 다음 전체 구조체로 저장할 때 , 구조체 크기가 4 (4 바이트 = 32 비트)로 나눌 수 있는지 확인해야합니다. 필요한 경우 패딩 바이트를 추가하여 수행합니다. 현재 개발 중에 구조를 많이 변경하고 32 비트와 정렬되도록하기 위해 항상 패딩 바이트를 변경해야합니다. 현재 구조는 내가 뭘하는지 달성하기 위해 더 나은 방법이 있나요이내부 플래시 메모리의 C 구조체 정렬

typedef __packed struct 
{ 
uint8_t status; 
uint16_t delay; 
uint32_t blabla; 
uint8_t foo[5]; 
uint8_t padding[...] // this has to be changed every time I alter the structure. 
} CONFIG; 

을 slike 보면? 임베디드 프로그래밍의 새로운 점은 실수를 저 지르지 않기 위해서입니다.

편집 :주의 사항 : 데이터는 내장 플래시의 말에 유지, 그래서 작동하지 않습니다 패딩 ...

+1

귀하의 이해가 정확하지 않다고 생각했습니다. 플래시 메모리의 명령어는 정렬되어야하며 컴파일러가이를 보장해야합니다. 그러나 팔에 정렬되지 않은 상태로 저장된 데이터는 팔 대뇌 m3 코어로 관리 할 수 ​​있습니다. 어떤 회사의 MCU를 사용합니까? –

답변

4

를 생략하는 것은 아마도이는 아이디어입니다 :

typedef __packed struct { 
    uint8_t status; 
    uint16_t delay; 
    uint32_t blabla; 
    uint8_t foo[5]; 
} CONFIG; 

typedef __packed struct { 
    CONFIG cfg; 
    uint8_t padding[4 - (sizeof(CONFIG) % 4)] 
} CONFIGWRAPPER; 
+0

사실 내가 그것을 생각할 때. 이미 정렬 된 경우에는 4 바이트를 추가하지 않습니다. – stdcall

4

해결 방법 1 : 노동 조합 내부에 넣어 수

union 
{ 
    CONFIG config; 
    uint8_t total_size[32]; 
} my_union; 
+0

재미 있습니다. sizeof (CONFIG)가 total_size의 크기보다 작다고 가정 해 봅시다. 그리고 내가 노조에 설정을했다. sizeof (my_union)은 무엇이 될까요? – stdcall

+0

'CONFIG'가'total_size'보다 작 으면'sizeof (my_union)'은'total_size'의 크기가 될 것입니다. 구체적으로는 32. – Lindydancer

1

해결 방법 2 : 당신의 구조와 문자의 배열을 포함 당신은 플래시의 끝에서 (32)과 같은 특정 위치에서 구성 데이터를 배치 할 IAR-특정 기능 #pragma location를 사용할 수 있습니다. 당신이 어떤 방법으로 패드 구조를 필요로하지 않을 그런 식으로 : 당신이 자연 경계에 정렬되지 않은 데이터로 끝날 경우

첫째
/* Fictitious end of flash location. */ 
#pragma location=0x1234FFE0 
struct [... your struct goes here ...] 
3

, 포장 정렬이 보통은 피할 수, 일부 CPU는 단지를 발행합니다 트랩에 액세스하려고 할 때

먼저 정렬 순서에 따라 멤버를 저장하여 컴파일러에서 정렬을위한 간격을 추가하지 않도록합니다 (또는 추가 할 경우 끝에 추가합니다). 가능한 경우, 1. 회원에게 원하는 정렬 요구 사항을 갖게하십시오. - 컴파일러가 적어도 많은 정렬을 구조체에 제공하도록 강제합니다.

이렇게하려면 플랫폼 및 컴파일러의 정렬 요구 사항에 대한 지식이 필요합니다. 그런 다음이 구조체는 (이 경우 4 바이트 aligment을 필요로하는 컴파일러에게 패딩 배열을 제거 얻고,

typedef struct 
{ 
uint8_t status; 
uint16_t delay; 
uint32_t blabla; 
uint8_t foo[5]; 
uint8_t padding[...]; 
} CONFIG; 

typedef struct 
{ 
uint32_t blabla; 
uint16_t delay; 
uint8_t status; 
uint8_t foo[5]; 
} CONFIG; 

을 변경 그것은 가능성이 이미 것이다 첫 번째 멤버는 4 바이트를 가지고로 또는 더 많은 정렬 요구 사항). 예 : gcc 사용 attribute((__aligned__(4))

그런 다음 구조에 sizeof() 및 alignof()를 사용하는 작은 프로그램 인 정렬 요구 사항을 검증하는 작은 테스트 프로그램을 작성하십시오. 정렬 할 구조체에 대한 명령어를 추가해야합니다. 해당 프로그램을 빌드/패키징의 일부로 실행하십시오.

+0

우수 답변입니다. 당신은 당신이 전역 (컴파일 도메인으로 하드웨어를 고려) 도메인을 컴파일 구조체로 무엇을하려고하고 싶은 경우 샘플 테스트 프로그램이 성공 또는 실패에 중요합니다, 당신은이 단계를 건너 뛸 수 없습니다. –