이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
코드 생성을 통해 생성된 코드를 공유 라이브러리로 패키징하기
Embedded Coder® 라이선스를 보유하고 있다면, 모델 컴포넌트에서 생성된 소스 코드를 공유 라이브러리(Windows® 동적 링크 라이브러리(.dll), UNIX® 공유 객체(.so) 또는 Macintosh OS X 동적 라이브러리(.dylib))로 빌드하여, 쉽게 배포하고 공유할 수 있습니다. 사용자나 다른 사람은 공유 라이브러리를 Windows, UNIX 또는 Macintosh OS X 개발 컴퓨터에서 실행되는 애플리케이션에 통합할 수 있습니다. 생성된 .dll, .so 또는 .dylib 파일은 서로 다른 애플리케이션 간에 공유할 수 있으며, 이를 사용하는 애플리케이션을 재컴파일할 필요 없이 업그레이드할 수 있습니다.
생성된 공유 라이브러리 정보
코드 생성기를 시스템 타깃 파일인 ert_shrlib.tlc를 사용하도록 구성하여 공유 라이브러리를 빌드합니다. 해당 시스템 타깃 파일의 내보내기를 위한 코드 생성:
데이터형으로서의
ExportedGlobal유형 변수 및 신호데이터로서의 실시간 모델 구조 (
)model_M모델 코드 실행에 필수적인 함수들
생성된 공유 라이브러리에 포함된 심볼 목록을 보려면:
Windows에서는 https://www.dependencywalker.com에서 다운로드할 수 있는 Dependency Walker 유틸리티를 사용하십시오.
UNIX에서는
nm -D를 사용하십시오.model.soMacintosh OS X에서는
nm -g를 사용하십시오.model.dylib
공유 라이브러리를 생성하고 사용하려면:
모델 코드의 공유 라이브러리 버전을 생성합니다
공유 라이브러리 파일을 불러와 사용할 수 있는 애플리케이션 코드를 작성합니다.
모델 코드의 공유 라이브러리 버전 생성
모델 코드의 공유 라이브러리 버전을 생성하려면:
모델을 열고
ert_shrlib.tlc시스템 타깃 파일을 사용하도록 구성하십시오.
ert_shrlib.tlc시스템 타깃 파일을 선택하면 빌드 과정에서 모델 코드의 공유 라이브러리 버전이 현재 작업 폴더에 생성됩니다. 이 선택 사항은 코드 생성기가 모델에 대해 생성하는 코드를 변경하지 않습니다.모델을 빌드합니다.
빌드가 완료된 후, 모델 하위 폴더에 생성된 코드를 확인하고 현재 폴더에 있는
.dll,.so또는.dylib파일을 살펴봅니다.
공유 라이브러리를 사용하기 위한 애플리케이션 코드 작성
애플리케이션 코드가 공유 라이브러리 파일을 불러와 그 함수와 데이터에 액세스하는 방법을 설명하기 위해, MathWorks는 SharedLibraryCode 모델을 제공합니다. 모델을 확인하려면 MATLAB® 명령 창에서 다음 명령을 실행하십시오:
openExample('SharedLibraryCode');모델에서 파란색 버튼을 클릭하여 스크립트를 실행합니다. 스크립트는 다음을 수행합니다.
모델을 기반으로 공유 라이브러리 파일을 생성합니다(예: 64비트 버전의 경우
SharedLibraryCode_win64.dll, 32비트 버전의 경우 Windows).공유 라이브러리 파일을 불러와 사용하는 예제 애플리케이션인
SharedLibraryCode_app를 컴파일하고 링크합니다.예제 애플리케이션을 실행합니다.
팁
이식성을 고려할 때 명시적 링크를 사용하는 것이 바람직합니다. 그러나 Windows 시스템에서는 ert_shrlib 시스템 타깃 파일이 암시적 링크를 지원하기 위해 .lib 파일을 생성하고 유지합니다.
암시적 링크를 사용하려면, 생성된 헤더 파일을 생성된 C 파일과 함께 사용할 수 있도록 약간의 수정이 필요합니다. 예를 들어, Visual C++®를 사용하고 있다면, 공유 라이브러리 파일에서 암시적으로 가져올 데이터 앞에 __declspec(dllimport)를 선언하십시오.
이 모델은 다음의 예제 애플리케이션 파일을 사용합니다:
| 파일 | 설명 |
|---|---|
SharedLibraryCode_app.h | 애플리케이션 헤더 파일 예시 |
SharedLibraryCode_app.c | 모델을 위해 생성된 공유 라이브러리 파일을 불러와 사용하는 예제 애플리케이션 |
run_SharedLibraryCode_app.m | 예제 애플리케이션을 컴파일, 링크 및 실행하는 스크립트 |
모델 창에 있는 흰색 버튼을 클릭하면 각 파일을 볼 수 있습니다. 또한, 스크립트를 실행하면 관련 소스 파일과 생성된 코드 파일이 현재 폴더에 저장됩니다. 이 파일들은 사용자 고유의 ERT 공유 라이브러리 파일을 위한 애플리케이션 코드를 작성할 때 템플릿으로 사용할 수 있습니다.
다음 섹션에서는 예제 애플리케이션 파일의 키 내용을 발췌하여 소개합니다.
애플리케이션 헤더 파일 예시
예제 애플리케이션의 헤더 파일인 SharedLibraryCode_app.h에는 모델의 외부 입력 및 출력에 대한 유형 선언이 포함되어 있습니다.
#ifndef _APP_MAIN_HEADER_
#define _APP_MAIN_HEADER_
typedef struct {
int32_T Input;
} ExternalInputs_SharedLibraryCode;
typedef struct {
int32_T Output;
} ExternalOutputs_SharedLibraryCode;
#endif /*_APP_MAIN_HEADER_*/C 언어 애플리케이션 예제 코드
예제 애플리케이션 SharedLibraryCode_app.c에는 공유 라이브러리 파일을 동적으로 불러오기 위한 다음 코드가 포함되어 있습니다. 플랫폼에 따라 코드가 Windows 또는 UNIX 라이브러리 명령을 호출한다는 점에 유의하십시오.
#if (defined(_WIN32)||defined(_WIN64)) /* WINDOWS */
#include <windows.h>
#define GETSYMBOLADDR GetProcAddress
#define LOADLIB LoadLibrary
#define CLOSELIB FreeLibrary
#else /* UNIX */
#include <dlfcn.h>
#define GETSYMBOLADDR dlsym
#define LOADLIB dlopen
#define CLOSELIB dlclose
#endif
int main()
{
void* handleLib;
...
#if defined(_WIN64)
handleLib = LOADLIB("./SharedLibraryCode_win64.dll");
#else
#if defined(_WIN32)
handleLib = LOADLIB("./SharedLibraryCode_win32.dll");
#else /* UNIX */
handleLib = LOADLIB("./SharedLibraryCode.so", RTLD_LAZY);
#endif
#endif
...
return(CLOSELIB(handleLib));
}다음 코드 예제는 C 애플리케이션이 모델에서 내보낸 데이터와 함수에 접근하는 방법을 보여줍니다. 사용자 정의 초기화, 단계 및 종료 코드를 추가할 수 있는 후크에 주목하십시오.
int32_T i;
...
void (*mdl_initialize)(boolean_T);
void (*mdl_step)(void);
void (*mdl_terminate)(void);
ExternalInputs_SharedLibraryCode (*mdl_Uptr);
ExternalOutputs_SharedLibraryCode (*mdl_Yptr);
uint8_T (*sum_outptr);
...
#if (defined(BORLANDCDLL))
/* Exported symbols contain leading underscores when DLL is linked with
BORLANDC */
mdl_initialize =(void(*)(boolean_T))GETSYMBOLADDR(handleLib ,
"_SharedLibraryCode_initialize");
mdl_step =(void(*)(void))GETSYMBOLADDR(handleLib ,
"_SharedLibraryCode_step");
mdl_terminate =(void(*)(void))GETSYMBOLADDR(handleLib ,
"_SharedLibraryCode_terminate");
mdl_Uptr =(ExternalInputs_SharedLibraryCode*)GETSYMBOLADDR(handleLib ,
"_SharedLibraryCode_U");
mdl_Yptr =(ExternalOutputs_SharedLibraryCode*)GETSYMBOLADDR(handleLib ,
"_SharedLibraryCode_Y");
sum_outptr =(uint8_T*)GETSYMBOLADDR(handleLib , "_sum_out");
#else
mdl_initialize =(void(*)(boolean_T))GETSYMBOLADDR(handleLib ,
"SharedLibraryCode_initialize");
mdl_step =(void(*)(void))GETSYMBOLADDR(handleLib ,
"SharedLibraryCode_step");
mdl_terminate =(void(*)(void))GETSYMBOLADDR(handleLib ,
"SharedLibraryCode_terminate");
mdl_Uptr =(ExternalInputs_SharedLibraryCode*)GETSYMBOLADDR(handleLib ,
"SharedLibraryCode_U");
mdl_Yptr =(ExternalOutputs_SharedLibraryCode*)GETSYMBOLADDR(handleLib ,
"SharedLibraryCode_Y");
sum_outptr =(uint8_T*)GETSYMBOLADDR(handleLib , "sum_out");
#endif
if ((mdl_initialize && mdl_step && mdl_terminate && mdl_Uptr && mdl_Yptr &&
sum_outptr)) {
/* === user application initialization function === */
mdl_initialize(1);
/* insert other user defined application initialization code here */
/* === user application step function === */
for(i=0;i<=12;i++){
mdl_Uptr->Input = i;
mdl_step();
printf("Counter out(sum_out): %d\tAmplifier in(Input): %d\tout(Output): %d\n",
*sum_outptr, i, mdl_Yptr->Output);
/* insert other user defined application step function code here */
}
/* === user application terminate function === */
mdl_terminate();
/* insert other user defined application termination code here */
}
else {
printf("Cannot locate the specified reference(s) in the shared library.\n");
return(-1);
}응용 스크립트 예시
애플리케이션 스크립트 run_SharedLibraryCode_app는 모델을 불러와 재구성한 다음, 모델의 공유 라이브러리 타깃 파일을 컴파일하고 링크하며 실행합니다. SharedLibraryCode 파일을 열고 흰색 버튼을 클릭하여 소스 코드를 확인하면 스크립트 소스 파일을 볼 수 있습니다. 이 스크립트는 사용자의 개발 환경에 적용될 수 있는 컴파일, 링크 및 실행을 위한 플랫폼별 문자형 벡터를 생성합니다. 스크립트를 실행하려면 파란색 버튼을 클릭합니다.
참고
terminate 함수를 연속으로 두 번 호출하는 것은 유효하지 않습니다. terminate 함수는 포인터를 지우고 NULL로 설정합니다. 이 함수를 두 번째로 호출하면 null 포인터의 참조가 해제되어 프로그램이 오류가 발생합니다.
공유 라이브러리의 제한 사항
공유 라이브러리 빌드 시 다음과 같은 제한 사항이 적용됩니다:
ert_shrlib.tlc시스템 타깃 파일에 대한 코드 생성은 다음 내용을 데이터로 내보냅니다:ExportedGlobal유형의 변수 및 신호실시간 모델 구조 (
)model_M
함수 호출 서브시스템을 포함하는 모델의 경우,
ert_shrlib.tlc시스템 타깃 파일에 대한 코드 생성은 initialize 및 terminate 진입점 함수와 관련된 심볼만 공유 라이브러리로 내보냅니다.ert_shrlib.tlc시스템 타깃 파일에 대한 코드 생성은 C 언어만 지원하며(C++은 지원하지 않음),ert_shrlib.tlc를 선택하면 모델 파라미터 언어가 비활성화됩니다.생성된 공유 라이브러리를 사용하여 모델 시뮬레이션을 재구성하려면, 애플리케이션 개발자는 원래 애플리케이션에서 시스템과 공유 라이브러리 함수 호출 간의 타이밍을 유지해야 합니다. 시뮬레이션 결과와 통합 결과를 비교할 수 있도록 타이밍을 일관되게 유지해야 합니다. 모델 구성 파라미터 Support: continuous time 및 단일 출력/업데이트 함수가 활성화된 모델에서 공유 라이브러리를 생성하는 경우, 시뮬레이션 시 추가로 고려해야 할 사항이 있습니다. 자세한 내용은 Single output/update function의 종속성을 참조하십시오.