2017-01-24 4 views
3

맞춤 보드 (LPC1788) 용 임베디드 소프트웨어를 개발 중입니다. 내 목표는 임베디드 시스템 용 C 프로그래밍과 관련된 기술과 경험을 향상시키는 것입니다.LPC1788 - 부트 로더 및 공유 라이브러리

사용자 응용 프로그램이있는 경우이를 시작하는 USB 부트 로더를 구현했습니다. 그렇지 않으면 USB를 통해 응용 프로그램을 쉽게로드하는 데 사용됩니다. 내 USB 부트 로더는 정적 라이브러리 board.a을 사용하며 사용자 응용 프로그램도 마찬가지입니다.

사용자 응용 프로그램에서 부트 로더의 이진 파일에 연결된 board.a을 참조하는 트릭이 있습니까?

즉, board.a 코드와 데이터를 한 번만 입력하여 플래시 메모리 공간을 최적화하고 싶습니다.

NB : 나는 (GNU이 빌더를 확인/NXP MCU 도구)는 그냥 운영 체제에서 공유 라이브러리를 사용하여 같은 팔 - 없음 - EABI-GCC (GNU ARM 임베디드 툴체인)

+2

나는 쉬운 방법이 없다고 생각하지만, 미래에 라이브러리 board.a가 향상 될 것이라고 가정하고, userApp 역시 개선합니다. 부트 로더를 건드리지 않고도 향상된 라이브러리로 새 앱을 업로드 할 수 있습니다. 이것은 정상적인 작동 방식입니다. 즉, 부트 로더를 한 번만 플래시하고 앱을 한 번 또는 여러 번 깜박입니다. 나는 도서관을 공유하는 것은 좋은 생각이 아니라고 생각한다. – linuxfan

+0

네, 부트 로더를 업그레이드하기 위해 board.a 강제 업그레이드에 대해 완전히 이유가 있습니다 (비정상 작동). 방금 공간을 최적화하고 싶었습니다. 고마워요 :) – Abderrezak

+0

이론상 나는 이것이 작동하지 않는 이유가 보이지 않습니다. 그러나 그것은 당신의 toolchain (컴파일러/링커)에 의존하므로, 질문을 편집하고 그 세부 사항을 추가하십시오. – user694733

답변

2

를 호출 LPCXpresso를 사용합니다. 시스템 설계는 부트 로더가 응용 프로그램으로 분기 할 때 예를 들어 레지스터 중 하나 (예 : r0)를 사용하여 "공유"라이브러리의 주소를 포함하거나 포인터 배열에 대한 포인터를 포함 할 수 있습니다 그것들은 공유하려는 board.a 내의 개별 기능에 대한 주소입니다. 함수는 어쨌든 링크/사용 관점의 주소 일 뿐이므로 응용 프로그램의 함수 포인터를 주소 공간의 이미 제자리에있는 함수와 일치시키는 문제입니다 (플래시라고 가정). 공유 라이브러리는 라이브러리와 스텁을 가지고 있기 때문에 이러한 운영 체제에서 실행되는 응용 프로그램에는 보이지 않습니다.

+0

다른 방법으로 링커를 사용하여 공유 코드를 부트 로더와 응용 프로그램 모두에 의해 링크 될 때 동일한 위치에 놓으려고 할 수 있습니다. 예를 들어이 코드는 플래시의 오프셋 0x2000에 있지만 프로그램이 다운로드 할 때 부트 로더는 해당 범위의 주소를 무시한다는 링커 스크립트 항목 (인텔 헥스 또는 모토로라 레코드 형식 또는 elf 또는 기타를 사용한다고 가정) ,이 방법은 링커 스크립트를위한 한 줄 또는 두 개 이상의 작업이 없습니다 (라이브러리 대신 작동해야 할 수도 있음). –

+0

답변 해 주셔서 감사합니다. 지금은 저에게 더 분명합니다. 제발, 같은 주소로 링크 라이브러리를 강제하는 방법을 알려주십시오. 임베디드 개발 (HAL, C, 링커, 디자인, RTOS ...)에 대한 지식을 어떻게 향상시킬 수 있습니까? – Abderrezak