주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

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을 구현할 수 있는 예시로는 다음과 같은 것들이 있습니다:

  1. “저는 효율성에는 관심이 없습니다. “제 알고리즘을 한 번만 작성하면 Simulink와 코드 생성 제품에서 자동으로 작동하게 하고 싶습니다.”

  2. “Simulink 및 코드 생성 제품에, 내장 블록처럼 보이며 효율적인 코드를 생성하는 고도로 최적화된 알고리즘을 구현하고 싶습니다.”

  3. “연동해야 할 손으로 직접 작성한 코드가 많이 있습니다.” “Simulink 및 코드 생성 제품에서 제 함수를 효율적으로 호출하고 싶습니다.”

각각 앞서 언급한 상황들은 다음과 같은 MathWorks® 용어와 대응됩니다:

  1. 비인라인 S-Function

  2. 인라인 S-Function

  3. 외부 코드용 자동 생성 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이 포함된 모델(sfunction.tlc 파일이 없는 경우)로부터 코드를 생성할 때, 생성된 코드에 이러한 오버헤드 코드 중 일부를 포함시킵니다. 실시간 코드를 최적화하고 일부 오버헤드 코드를 제거하려면 S-Function을 인라인 처리(또는 삽입)해야 합니다. 이를 위해서는 생성된 코드에서 오버헤드 코드를 제거하는 TLC (sfunction.tlc) 파일을 작성해야 합니다. Target Language Compiler는 sfunction.tlc 파일을 처리하여 생성된 코드 내에서 S-Function 알고리즘을 인라인 처리하는 방법을 정의합니다.

참고

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 ToolImport Calls to External Code into Generated Code with Legacy Code Tool를 참조하십시오.

비인라인 및 인라인 S-Function 구현에 필요한 파일

이 토픽에서는 비인라인 및 인라인 S-Function을 생성하는 데 필요한 파일과 함수에 대해 간략히 설명합니다.

  • 비인라인 S-Function의 경우 일반적으로 C 또는 C++ MEX S-Function 소스 코드(sfunction.c 또는 sfunction.cpp)가 필요합니다. C 또는 C++ MEX S-Function 소스 코드 파일을 제공하지 않고 인라인 처리되지 않은 S-Function을 구현하려면, 라이브러리나 오브젝트 파일을 S-Function 모듈로 포함시켜야 합니다. 자세한 내용은 S-Function에 대한 추가 소스 파일 지정 항목과 Use rtwmakecfg.m API to Customize Generated Makefiles 항목을 참조하십시오.

  • 완전히 인라인 처리된 S-Function에는 sfunction.tlc 파일이 필요합니다. 완전히 인라인 처리된 S-Function은 파라미터화된 S-Function에 대해 최적의 코드를 생성합니다. 이 S-Function은 모델 실행 중에 변경되지 않는 고정된 S-Function 파라미터에 따라 특정 모드로 작동합니다. 주어진 작동 모드에 대해, sfunction.tlc 파일은 해당 모드의 알고리즘을 구현하기 위해 생성되는 정확한 코드를 명시합니다. 예를 들어, Write Fully Inlined S-Functions with mdlRTW Routine에 포함된 직접 인덱스 룩업 테이블 S-Function에는 두 가지 작동 모드가 있습니다. 하나는 간격이 균일한 x-data용이고, 다른 하나는 간격이 불규칙한 x-data용입니다.

    참고

    레거시 또는 사용자 지정 C/C++ 코드를 호출하기 위해 생성된 완전 인라인 처리된 S-Function의 경우에도 sfunction.tlc 파일이 필요하며, 이 파일은 레거시 코드 툴(Legacy Code Tool)에 의해 생성됩니다.

완전히 인라인 처리된 S-Function의 경우, S-Function MEX 파일 내에 mdlRTW 루틴을 sfunction.c 또는 sfunction.cpp에 배치해야 할 수도 있습니다. mdlRTW 루틴을 사용하면 model.rtw에 정보를 저장할 수 있습니다. model.rtw는 모델을 지정하는 레코드 파일로, 코드 생성기는 코드를 생성할 때 sfunction.tlc를 실행하기 전에 이 파일을 처리하기 위해 Target Language Compiler를 호출합니다.

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 ToolImport Calls to External Code into Generated Code with Legacy Code Tool를 참조하십시오.

  • 코드 효율성이 최우선 고려 사항이 아닌 경우, 예를 들어 신속 프로토타이핑을 진행하는 경우에는 C/C++ MEX S-Function을 인라인 처리하지 않도록 선택할 수 있습니다. 자세한 내용은 Write Noninlined S-Function 항목을 참조하십시오.

참고 항목

도움말 항목