마이크로컨트롤러에 버전 정보를 추가하는 일반적인 방법

+ 별 공개 계정을 팔로우 하고 흥미로운 콘텐츠를 절대 놓치지 마세요.

eeae5ab9812e535fc18795fa69b3f27f.gif

저자 | StrongHuang

WeChat 공개 계정 | 삽입된 열

당사의 제품은 고객의 요구와 제안에 따라 수시로 업그레이드(버그 최적화, 기능 추가 및 삭제)가 이루어지는데 이때 소프트웨어 버전이 매우 중요합니다.

개발 프로젝트에서 소프트웨어에 버전 정보를 주로 추가하는지 궁금합니다. 최근 몇몇 친구들이 관련 문제에 대해 논의하고 있는 것을 보고 간략하게 공유하고자 합니다.

실제로 여러 가지 방법이 있지만, 지정된 저장영역(플래시)에 소프트웨어 버전 정보를 기록하는 것이 기본 원칙이며 , 그 중 가장 일반적인 방법을 소개합니다.

구현

이 기사에서는 일반적이고 기본적인 팁을 공유합니다. Keil MDK 환경에서는 소프트웨어 코드를 통해 Flash에 지정된 주소를 직접 매핑하고 저장합니다.

포함: 소프트웨어 버전, 컴파일 날짜, 컴파일 시간, 코드는 다음과 같습니다:

#define VERINFO_ADDR_BASE   (0x0800FF00) //存放FLASH的地址


const char Software_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Software: 1.0.0";
const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;

모두가 이 코드를 이해할 수 있나요? 

원리는 매우 간단하며 플래시 주소를 작성하는 다른 유사한 방법이 있습니다(여기에서는 아직 논의되지 않음).

여기에는 아래에 설명된 몇 가지 중요한 지식 포인트가 포함되어 있습니다.

__속성__ 구문

"속성"으로 번역되는 속성은 C 언어의 키워드이며 구문 형식은 다음과 같습니다.

__attribute__ ((attribute-list))

__attribute__는 함수 속성(Function Attribute), 변수 속성(Variable Attribute), 타입 속성(Type Attribute)을 설정할 수 있습니다.

이 부분을 깊게 이해할 필요는 없고 사용법만 알면 됩니다. 더 깊은 이해를 위해 온라인에는 많은 학습 리소스가 있습니다.

C 언어 표준 정의

코드에서:

const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;

날짜와 시간을 나타내는 __DATE__ 및 __TIME__이 표시됩니다. 

사실 이 두 가지는 C 언어의 특별한 표준 정의입니다.

__DATE__ : "2021년 4월 13일"과 같은 컴파일 타임의 날짜 문자열

__TIME__ : 컴파일 당시의 시간 문자열(예: "20:00:00")

이 두 가지 외에도 실제로 다음과 같은 유사한 표준 정의가 많이 있습니다.

__FILE__  : 컴파일 중인 파일의 파일 이름

__LINE__  : 컴파일 중인 파일의 줄 번호

__STDC__ : 파일이 표준 C 프로그램인지 확인

이 부분에 대해서는 내 기사: C 언어의 여러 특수 표준 정의 및 사용을 참조할 수 있습니다.

[항상 컴파일 ] 버전 파일

Keil MDK에서는 기본적으로 소스 파일이 수정되지 않고 한 번만 컴파일됩니다.

따라서 버전, 날짜 및 시간을 올바르게 컴파일하려면 Always compile 을 설정해야 합니다 .

다음과 같이 설정합니다:

bcf1c91792ef8256d89423941fd3447f.png

펌웨어 크기

생성된 Hex 파일은 사용되지 않은 Falsh를 0x00으로 채웁니다. 예:

cf8dec456eaeb020f6d8b48aec66f91b.png

0x00을 채운 후에는 이 hex가 상대적으로 커지므로 hex 펌웨어 크기를 줄이는 방법에는 두 가지가 있습니다.

1. FLASH가 저장되는 주소는 적절한 위치에 설정되어야 하며 코드 크기가 1K에 불과하면 주소를 50K만큼만 오프셋하게 되는데 이는 너무 많은 오프셋입니다.

#define VERINFO_ADDR_BASE   (0x0800FF00) //存放FLASH的地址

2. 인터넷에서 "ROM 크기"를 수정하는 방법도 있습니다.

3b01ecb5e89857b80616b5a0053a814a.png

잠시 후 0x00이 실제로 제거된 것을 발견했습니다.

ce001cbf4bf0d0cd919894a3515b5538.png

이 두 가지 방법에는 실제로 일정한 위험이 있으며, 코드 양이 계속 증가하면 문제가 발생할 수 있습니다. 따라서 누구나 플래시 주소를 주로 설정해야 합니다.

여기에 Hex 파일 형식에 대한 기사가 실제로 있는데, bin, hex, axf 및 elf 파일 형식에 대한 이해하기 기사를 읽는 것이 좋습니다.

------------   ------------

b6fd59a167d2fbbcf4fa0ea9264c5cae.gif

●'내장 도구 ' 열

●칼럼 "임베디드 개발"

●칼럼 "Keil Tutorial"

●포함된 열 선택 튜토리얼

공식 계정을 팔로우하고 " 그룹 추가 "라고 답하면 규정에 따라 기술 교류 그룹에 가입할 수 있으며, " 1024 "라고 답하면 더 많은 콘텐츠를 볼 수 있습니다.

15513c68dbd94374db95f16379d9ca7a.jpeg

b844ed6b71e3e94d5d96bf82ceee3033.png

더 많은 공유 내용을 보려면 " 원문 읽기 "를 클릭하세요.

추천

출처blog.csdn.net/ybhuangfugui/article/details/132820020