주요 콘텐츠

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

장치 드라이버 System object의 구조

장치 드라이버 블록은 ARM® Cortex®-A 기반 하드웨어 보드에 배포될 때 사용자 지정 C/C++ 코드를 생성하는 MATLAB System 블록의 특수한 형태입니다. 장치 드라이버 블록을 생성하면, 사용자는 지원 패키지에서는 제공되지 않는 통신 프로토콜이나 하드웨어 라이브러리 등 하드웨어 보드의 기능에 손쉽게 액세스할 수 있습니다.

Simulink® 장치 드라이버 블록은 포트 유형에 따라 다음 두 그룹 중 하나로 분류할 수 있습니다:

  • 소스 블록에는 출력 포트만 있습니다. 시뮬레이션에서 소스 블록은 미리 정해진 신호를 출력합니다. 이 신호는 난수 생성기, 저장된 배열 또는 상수 값을 통해 생성할 수 있습니다. 코드 생성 후, 해당 소스 블록은 블록이 나타내는 I/O 장치에서 캡처한 데이터를 출력합니다. 예를 들어, 디지털 읽기 블록의 생성된 코드는 디지털 I/O 핀의 논리 상태를 출력합니다.

  • 싱크 블록에는 입력 포트만 있습니다. 시뮬레이션에서 싱크 블록은 Terminator 블록의 역할을 합니다. 코드 생성 후, 싱크 블록은 입력 포트 신호에 따라 I/O 장치를 설정하고 업데이트합니다. 예를 들어, 디지털 쓰기 블록의 생성된 코드는 디지털 I/O 핀의 논리 상태를 입력 포트 신호와 동일하게 설정하고 업데이트합니다.

장치 드라이버 블록의 동작을 정의하려면 System object™를 사용합니다. 그런 다음 MATLAB System 블록을 사용하여 해당 객체를 참조하고 모델에 포함시킵니다. 각 System object는 setupImpl, stepImplreleaseImpl 메서드를 사용하여 드라이버 블록의 코드 초기화, 핀 출력 동작 및 코드 종료를 정의합니다. stepImpl의 조건문 덕분에, 장치 드라이버 블록은 시뮬레이션 모드로 작동합니다. 이 모드를 사용하면 테스트할 때나 하드웨어 보드에 액세스할 수 없을 때, 호스트 컴퓨터에서 전체 모델을 실행할 수 있습니다. System object는 빌드 아티팩트를 추가하는 기능도 제공합니다. 이러한 아티팩트에는 소스 파일, 포함 경로, 공유 라이브러리, 전처리기 정의 등이 포함되며, 이는 Simulink가 생성한 코드에 반영됩니다. 이러한 아티팩트는 블록의 포트 속성을 자동으로 정의하고 블록 마스크를 생성합니다.

클래스 정의

System object 코드의 맨 위에서 System object의 이름과 상속받는 클래스를 정의합니다.

classdef classname < matlab.System & coder.ExternalDependency & matlab.system.mixin.Propagates

	...

end

모든 System object는 matlab.System를 상속받아야 합니다. 또한, 장치 드라이버 System object는 생성된 코드에 빌드 아티팩트를 추가하는 API를 제공하는 coder.ExternalDependency를 상속받습니다. matlab.system.mixin.Propagates 클래스는 System object의 출력 크기, 데이터형 및 복잡도를 정의하기 위한 API를 제공합니다. matlab.system.mixin.CustomIcon와 같은 다른 클래스들을 상속받을 수도 있습니다. 이 클래스를 사용하여 MATLAB System 블록에 표시될 이름과 아이콘을 지정할 수 있습니다.

생성자 메서드

Digital Write 블록 만들기Digital Read 블록 만들기 가이드에서 사용되는 System object 템플릿 클래스는 표준 생성자 메서드를 사용합니다:

methods
   % Constructor
   function obj = classname(varargin)
      coder.allowpcode('plain');
      setProperties(obj,nargin,varargin);
   end

   ...

end

초기화, 출력 및 종료 방법

이 메서드들은 초기화, 출력 및 종료 시에 어떤 동작이 수행되는지를 정의합니다. setupImpl를 사용하여 하드웨어 주변기기를 초기화하십시오. 하드웨어 주변기기에서 데이터를 읽거나 쓰려면 stepImpl를 사용하십시오. 사용 중인 하드웨어 리소스를 해제하려면 releaseImpl를 사용하십시오. 이 세 가지 방법은 장치 드라이버 블록의 동작을 정의하는 핵심 요소입니다.

methods (Access=protected)
   function setupImpl(obj)
      % Implement tasks that need to be performed only once
   end

   function stepImpl(obj,u)
      % Device driver output
   end

   function releaseImpl(obj)
      % Termination code
   end
end

입력 및 출력 신호의 속성

이 코드 섹션에서는 블록의 입력 또는 출력 개수와 데이터형 및 크기를 정의합니다. 예를 들어, 싱크 블록의 getNumInputsImpl 메서드는 입력 포트 수를 설정합니다. 마찬가지로, 소스 블록의 getNumOutputsImpl 메서드는 출력 포트 수를 설정합니다.

methods (Access=protected)
   % Simulink functions
   function isInputSizeMutableImpl(~,~)
      flag = false;
   end

   ...

   function num = getNumInputsImpl(~)
      num = 1;
   end

   function num = getNumOutputsImpl(~)
      num = 0;
   end
end

아티팩트 빌드

빌드 아티팩트는 장치 드라이버 코드를 컴파일하는 데 필요한 소스 파일 위치, 포함 경로, 공유 라이브러리, 라이브러리 검색 경로 및 전처리기 정의 등을 지정합니다. getDescriptiveName 메서드를 사용하여 System object에 식별 문자열을 정의하십시오. 코드 생성 엔진은 이 문자열을 사용하여 오류를 보고합니다. isSupportedContext 메서드를 사용하여 코드 생성 컨텍스트를 지정하십시오. 장치 드라이버 블록에서는 실시간 워크숍(rtw) 코드 생성 컨텍스트만 적용되므로, 이 함수는 항상 'rtw'를 지정합니다. updateBuildInfo 메서드를 사용하여 System object를 빌드하는 데 필요한 소스 파일, 헤더 파일, 포함 경로, 라이브러리 및 정의 항목을 지정하십시오.

methods (Static)
   
   function name = getDescriptiveName()
      name = 'decriptive name';
   end

   function tf = isSupportedContext(context)
      tf = context.isCodeGenTarget('rtw');
   end

   function updateBuildInfo(buildInfo, context)
        if context.isCodeGenTarget('rtw')
            % Update buildinfo
            srcDir = fullfile(fileparts(mfilename('fullpath')),'src'); %#ok<NASU>
            includeDir = fullfile(fileparts(mfilename('fullpath')),'include');
            addIncludePaths(buildInfo,includeDir);
            % Use the following API's to add include files, sources and
            % linker flags
            %addIncludeFiles(buildInfo,'source.h',includeDir);
            %addSourceFiles(buildInfo,'source.c',srcDir);
            %addLinkFlags(buildInfo,{'-lSource'});
            %addLinkObjects(buildInfo,'sourcelib.a',srcDir);
            %addCompileFlags(buildInfo,{'-D_DEBUG=1'});
            %addDefines(buildInfo,'MY_DEFINE_1')
   end
end

참고 항목

|