이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
S-Function과 코드 생성
S-Function을 사용하면 시뮬레이션 및 코드 생성을 위한 Simulink®의 지원 범위를 확장할 수 있습니다. 예를 들어, 다음과 같은 용도로 사용할 수 있습니다:
사용자 지정 알고리즘 표현
기존의 외부 코드를 Simulink 모델 및 생성된 코드와 연동합니다.
하드웨어와 연동하기 위한 장치 드라이버를 구현한다
임베디드 시스템을 위한 고도로 최적화된 코드 생성
Simulink 시뮬레이션의 일환으로 서브시스템에 대해 생성된 코드를 검증합니다.
S-Function을 작성하기 위한 애플리케이션 프로그래밍 인터페이스(API)를 사용하면 Simulink 환경에서 매우 유연하게 범용 알고리즘을 구현할 수 있습니다. 코드 생성을 위한 모델에서 S-Function을 사용하려는 경우, 유연성의 정도는 달라질 수 있습니다. 예를 들어, 코드 생성기와 함께 사용하는 S-Function에서는 MATLAB® 작업 공간에 접근할 수 없습니다. 이 토픽에서는 S-Function을 사용할 때 유의해야 할 사항에 대해 설명합니다. 그러나 이 토픽에서 소개한 기법을 활용하면, 생성된 코드와 호환되는 대부분의 응용 분야를 위한 S-Function을 만들 수 있습니다.
S-Function은 모델 내에서 복잡한 알고리즘을 구현하는 데 있어 범용적이고 유연한 해결책을 제공하지만, 그 기반이 되는 API는 메모리 및 연산 자원 측면에서 오버헤드를 초래합니다. 대부분의 경우, 실시간 신속 프로토타이핑 시스템에는 이러한 추가 자원이 충분히 활용 가능합니다. 하지만 실시간 임베디드 애플리케이션에서는 종종 추가 리소스를 확보할 수 없는 경우가 있습니다. 코드 생성기와 함께 제공되는 Target Language Compiler 기술을 사용하여 S-Function을 인라인 처리하면 메모리 및 연산 부하를 최소화할 수 있습니다. 기존의 외부 코드를 위한 S-Function을 제작하는 경우, 레거시 코드 툴을 사용하여 S-Function과 관련 TLC 파일을 생성하는 것을 고려해 보십시오.
이 토픽을 다루기 위해서는 다음 개념들을 이해하고 계신 것으로 가정합니다:
Level-2 S-functions
TLC(Target Language Compiler) 스크립팅
코드 생성기가 C/C++ 코드를 생성하고 빌드하는 방식
참고
이 정보는 코드 생성 사용자를 위한 것입니다. 현재 코드 생성기를 사용하지 않더라도, S-Function을 작성할 때는 다음 지침을 따르십시오. 특히 범용 S-Function을 만드는 경우에는 더욱 그렇습니다.
S-Function의 종류
시뮬레이션 및 코드 생성을 위해 S-Function을 구현할 수 있는 예시로는 다음과 같은 것들이 있습니다:
“저는 효율성에는 관심이 없습니다. “제 알고리즘을 한 번만 작성하면 Simulink와 코드 생성 제품에서 자동으로 작동하게 하고 싶습니다.”
“Simulink 및 코드 생성 제품에, 내장 블록처럼 보이며 효율적인 코드를 생성하는 고도로 최적화된 알고리즘을 구현하고 싶습니다.”
“연동해야 할 손으로 직접 작성한 코드가 많이 있습니다.” “Simulink 및 코드 생성 제품에서 제 함수를 효율적으로 호출하고 싶습니다.”
각각 앞서 언급한 상황들은 다음과 같은 MathWorks® 용어와 대응됩니다:
비인라인 S-Function
인라인 S-Function
외부 코드용 자동 생성 S-Function
비인라인 S-Function
비인라인 S-Function은 Simulink 엔진과 생성된 코드에서 동일하게 처리되는 C 또는 C++ MEX S-Function입니다. 일반적으로 S-Function API에 따라 알고리즘을 한 번 구현하면 됩니다. Simulink 엔진과 생성된 코드는 모델 실행 중에 S-Function 루틴(예: mdlOutputs)을 호출합니다.
인라인 처리되지 않은 S-Function 블록의 각 인스턴스마다 추가적인 메모리 및 연산 리소스가 필요합니다. 그러나 알고리즘을 모델 및 코드 생성 애플리케이션에 통합하는 이러한 작업 방식은 효율성이 중요하지 않은 프로젝트의 프로토타이핑 단계에서 흔히 볼 수 있는 방식이다. 효율성을 희생함으로써 얻는 이점은 모델의 파라미터와 구조를 신속하게 변경할 수 있다는 점입니다.
인라인이 아닌 S-Function을 작성할 때는 TLC 코딩이 필요하지 않습니다. 비인라인 S-Function은 빌드 프로세스에서 기본 설정으로 간주됩니다. 즉, 모델 내에서 MEX S-Function을 빌드한 후에는 Ctrl+B를 눌러 모델을 빌드하기 전에 별도의 준비 작업이 필요하지 않습니다.
makefile을 생성할 때, 인라인 처리되지 않은 S-Function 파일의 이름과 위치에 대해서는 몇 가지 제한 사항이 있습니다. Write Noninlined S-Function 항목을 참조하십시오.
인라인 S-Function
S-Function이 Simulink 환경에서 작동하도록 하기 위해 일부 오버헤드 코드가 생성됩니다. 코드 생성기가 S-Function이 포함된 모델( 파일이 없는 경우)로부터 코드를 생성할 때, 생성된 코드에 이러한 오버헤드 코드 중 일부를 포함시킵니다. 실시간 코드를 최적화하고 일부 오버헤드 코드를 제거하려면 S-Function을 인라인 처리(또는 삽입)해야 합니다. 이를 위해서는 생성된 코드에서 오버헤드 코드를 제거하는 TLC (sfunction.tlc) 파일을 작성해야 합니다. Target Language Compiler는 sfunction.tlc 파일을 처리하여 생성된 코드 내에서 S-Function 알고리즘을 인라인 처리하는 방법을 정의합니다.sfunction.tlc
참고
inline이라는 용어를 C++의 inline 키워드와 혼동하지 마십시오. 인라인이란 일반적인 S-Function API 루틴(예: mdlOutputs) 호출 대신 텍스트를 직접 지정하는 것을 의미합니다. 예를 들어, TLC 파일을 사용하여 S-Function을 인라인 처리할 경우, 생성된 코드에는 일반적으로 S-Function 루틴 내에 포함되는 C/C++ 코드와 빌드 과정에서 제외된 S-Function 자체가 포함됩니다.
완전히 인라인 처리된 S-Function은 알고리즘(블록)을 내장 블록과 구별할 수 없을 정도로 생성된 코드에 통합합니다. 일반적으로 완전히 인라인 처리된 S-Function의 경우, 알고리즘을 두 번 구현해야 합니다. 한 번은 Simulink 모델(C/C++ MEX S-Function)용으로, 다른 한 번은 코드 생성(TLC 파일)용으로 구현해야 합니다. TLC 파일의 복잡도는 알고리즘의 복잡도와 코드 생성에서 달성하고자 하는 효율성 수준에 따라 달라집니다. TLC 파일의 구조는 단순한 것부터 복잡한 것까지 다양합니다. S-Function 인라인 처리 항목을 참조하십시오.
레거시 코드 또는 사용자 지정 코드를 위한 자동 생성 S-Function
모델 내에서 직접 작성한 C/C++ 코드를 호출해야 하는 경우, Simulink 레거시 코드 툴을 사용하는 것을 고려해 보십시오. 레거시 코드 툴은 사용자가 레거시 코드 툴 데이터 구조에 레지스터한 정보를 바탕으로, 완전히 인라인 처리된 S-Function과 이에 대응하는 TLC 파일을 자동으로 생성할 수 있습니다.
자세한 내용은 Integrate C Functions Using Legacy Code Tool와 Import Calls to External Code into Generated Code with Legacy Code Tool를 참조하십시오.
비인라인 및 인라인 S-Function 구현에 필요한 파일
이 토픽에서는 비인라인 및 인라인 S-Function을 생성하는 데 필요한 파일과 함수에 대해 간략히 설명합니다.
비인라인 S-Function의 경우 일반적으로 C 또는 C++ MEX S-Function 소스 코드(
또는sfunction.c)가 필요합니다. C 또는 C++ MEX S-Function 소스 코드 파일을 제공하지 않고 인라인 처리되지 않은 S-Function을 구현하려면, 라이브러리나 오브젝트 파일을 S-Function 모듈로 포함시켜야 합니다. 자세한 내용은 S-Function에 대한 추가 소스 파일 지정 항목과 Use rtwmakecfg.m API to Customize Generated Makefiles 항목을 참조하십시오.sfunction.cpp완전히 인라인 처리된 S-Function에는
파일이 필요합니다. 완전히 인라인 처리된 S-Function은 파라미터화된 S-Function에 대해 최적의 코드를 생성합니다. 이 S-Function은 모델 실행 중에 변경되지 않는 고정된 S-Function 파라미터에 따라 특정 모드로 작동합니다. 주어진 작동 모드에 대해,sfunction.tlc파일은 해당 모드의 알고리즘을 구현하기 위해 생성되는 정확한 코드를 명시합니다. 예를 들어, Write Fully Inlined S-Functions with mdlRTW Routine에 포함된 직접 인덱스 룩업 테이블 S-Function에는 두 가지 작동 모드가 있습니다. 하나는 간격이 균일한sfunction.tlcx-data용이고, 다른 하나는 간격이 불규칙한x-data용입니다.참고
레거시 또는 사용자 지정 C/C++ 코드를 호출하기 위해 생성된 완전 인라인 처리된 S-Function의 경우에도
파일이 필요하며, 이 파일은 레거시 코드 툴(Legacy Code Tool)에 의해 생성됩니다.sfunction.tlc
완전히 인라인 처리된 S-Function의 경우, S-Function MEX 파일 내에 mdlRTW 루틴을 또는 sfunction.c에 배치해야 할 수도 있습니다. sfunction.cppmdlRTW 루틴을 사용하면 에 정보를 저장할 수 있습니다. model.rtw는 모델을 지정하는 레코드 파일로, 코드 생성기는 코드를 생성할 때 model.rtw를 실행하기 전에 이 파일을 처리하기 위해 Target Language Compiler를 호출합니다.sfunction.tlc
TLC 파일에 조정할 수 없는 파라미터를 추가하려는 경우 mdlRTW 루틴을 포함하는 것이 유용합니다. 이러한 파라미터는 S-Function의 특정 인스턴스에서 어떤 작동 모드가 활성화되어 있는지 판단하는 데 사용됩니다. 이 정보를 바탕으로, S-Function에 대한 TLC 파일은 해당 작동 모드에 대해 매우 효율적이고 최적화된 코드를 생성할 수 있습니다.
코드 생성을 지원하는 S-Function 작성 지침
코드 생성을 통해 C/C++ MEX, MATLAB 언어 및 Fortran MEX S-Function을 사용할 수 있습니다.
인라인용 TLC 파일을 제공하면 코드 생성을 위해 S-Function을 인라인으로 처리할 수 있습니다. Target Language Compiler의 S-Function 인라인 처리를 참조하십시오. MATLAB 및 Fortran MEX S-Function은 인라인 처리되어야 합니다. C/C++ MEX S-Function은 코드 효율성을 위해 인라인 처리되거나, 인라인 처리되지 않을 수 있습니다.
레거시 코드나 사용자 지정 코드를 호출하기 위한 완전 인라인 처리된 C MEX S-Function을 자동으로 생성하려면 레거시 코드 툴을 사용하십시오. 자세한 내용은 Integrate C Functions Using Legacy Code Tool와 Import Calls to External Code into Generated Code with Legacy Code Tool를 참조하십시오.
코드 효율성이 최우선 고려 사항이 아닌 경우, 예를 들어 신속 프로토타이핑을 진행하는 경우에는 C/C++ MEX S-Function을 인라인 처리하지 않도록 선택할 수 있습니다. 자세한 내용은 Write Noninlined S-Function 항목을 참조하십시오.