구조 데이터는 Flash에 저장되며 요소 위치 오프셋 문제 분석

문제의 배경 : 오늘 저는 저장된 데이터가 구조 변수 인 Flash 스토리지를 디버깅했는데 구조 변수의 일부 요소가 역으로 오프셋되는 것을 발견했습니다!
구체적인 이유 : 예를 들어 다음과 같은 구조 변수 테스트는 플래시에 저장되어 5 바이트가 아닌 6 바이트를 차지한다. 이유는 구조가 바이트 정렬 개념을 가지고 있기 때문이다. 가장 많은 메모리를 차지하는 데이터 유형이 차지하는 것이 표준이며 모든 멤버는 메모리를 할당 할 때이 길이와 정렬되어야합니다. 다음의 구조체 변수 테스트를 예로 들어 보겠습니다. 그 요소에서 a와 c는 2 바이트입니다. b를 정렬해야하면 null 바이트가 자동으로 추가됩니다.

typedef struct{
	uint16_t a;
	uint8_t  b;
	uint16_t c;
}TEST_T;
TEST_T test ;

구조가 아무리 복잡하더라도 바이트 정렬에 대해서는 논의하지 않을 것입니다. 많은 예가 있습니다.이 기록은 이러한 기본 상식을 설명하므로 이전 생각과 일치하지 않는 결과를 초래할 수 있습니다.

솔루션 : Flash 공간 낭비를 피하려면 구조 변수를 정의 할 때 __attribute__ 기능 만 추가하면됩니다 (예 : 다음).

typedef struct{
	uint16_t a;
	uint8_t  b;
	uint16_t c;
}__attribute__ ((__packed__))TEST_T;
TEST_T test ;

추천

출처blog.csdn.net/weixin_43704402/article/details/113847071