본문 바로가기
카테고리 없음

Simulink Embeded Coder : Storage Class

by 리치마마 2024. 11. 19.

저장 클래스(Storage Class)란?

저장 클래스는 Simulink 모델 데이터를 생성된 코드에서 어떻게 나타낼지, 어디에 배치할지 제어하는 설정입니다.
모델의 매개변수, 신호, 상태 데이터를 코드에 표현하거나, 불필요한 최적화를 방지해 데이터를 유지할 수 있도록 도와줍니다.

왜 저장 클래스를 설정해야 하나요?

  • 생성된 코드의 구조를 제어: 데이터를 전역 변수로 만들지, 구조체의 필드로 만들지 등을 결정.
  • 최적화 방지: Simulink는 사용되지 않는 데이터를 제거할 수 있지만, 저장 클래스를 설정하면 데이터를 유지.
  • 외부 코드와의 연동: 외부에서 정의된 데이터를 Simulink 코드에서 사용하거나, Simulink 데이터를 외부 코드에서 사용할 수 있도록 설정.

어떻게 설정하나요?

1. 모델 데이터에 저장 클래스 적용

  • Code Mappings Editor를 사용:
    • Simulink의 Code > Code Mappings 메뉴에서 데이터를 선택하고 저장 클래스를 설정.
  • API 사용:
    • get_param 및 set_param 명령어를 사용해 데이터에 저장 클래스를 프로그래밍적으로 설정.

2. 외부 데이터에 저장 클래스 적용

  • Model Explorer에서 설정.
  • Custom Storage Class Designer를 사용해 새로운 저장 클래스를 정의할 수도 있음.

저장 클래스의 기본값

  • 기본적으로, 저장 클래스는 Auto로 설정됩니다.
  • Auto로 설정되면 Simulink는 최적화를 통해 필요 없다고 판단되는 데이터를 제거하거나 데이터 표현 방식을 변경할 수 있습니다.

저장 클래스의 종류

저장 클래스는 Simulink에서 제공하는 기본 클래스와 Embedded Coder를 사용하는 경우 추가로 사용할 수 있는 클래스가 있습니다.

1. Simulink에서 제공하는 기본 클래스

목적 저장클래스 설명
최적화를 활성화 Auto 데이터를 필요에 따라 최적화하여 코드에서 제거 가능.
데이터를 기본 구조체의 필드로 표현 Default 데이터를 구조체의 필드로 저장. 최적화 방지를 원하지 않는 경우 적합.
데이터를 최적화에서 제거하지 않음 Model Default 모델의 데이터 카테고리에서 기본 설정을 따름.
데이터를 독립된 전역 변수로 선언 ExportedGlobal 전역 변수로 데이터 선언 및 정의.
외부에서 정의한 데이터를 참조 ImportedExtern 외부에서 정의된 전역 변수에 대해 Simulink에서 선언만 수행.

2. Embedded Coder에서 제공하는 추가 클래스

목적 저장클래스 설명
데이터를 별도 파일에서 내보내기 ExportToFile 데이터 정의를 파일로 내보냄.
데이터를 파일에서 가져오기 ImportFromFile 외부 파일에 정의된 데이터를 사용.
데이터에 const나 volatile 속성 부여 Const, Volatile 데이터가 상수(const)이거나, 변경 가능성을 명시(volatile)하도록 설정.
데이터를 구조체 필드로 표현 Struct, Bitfield 데이터를 구조체로 표현하여 코드 구조를 명확히 함.
데이터를 함수 호출로 액세스 GetSet 함수 호출을 통해 데이터를 읽거나 씀.

 

주요 저장 클래스 개요

1. Auto

  • 기본 값으로, 데이터의 표현 방식과 최적화 여부를 코드 생성기가 자동으로 처리합니다.
  • 최적화된 코드 생성이 필요할 때 적합합니다.
  • 제거 가능성: 사용하지 않는 데이터는 코드에서 제거될 수 있습니다.

2. Default

  • 모델의 데이터 카테고리(예: 신호, 상태)에 기본 저장 클래스를 설정합니다.
  • 제거되지 않은 데이터는 표준 데이터 구조의 필드로 나타납니다.

3. Model Default

  • 특정 데이터에 모델 기본 저장 클래스를 적용하여 최적화를 방지합니다.
  • 데이터 이름은 Simulink 모델에서의 이름과 동일하게 유지됩니다.

4. ExportedGlobal

  • 데이터를 전역 변수로 정의하여 외부 코드에서 접근 가능하게 만듭니다.
  • 코드 생성 시 전역 변수 선언 및 정의가 함께 포함됩니다.
  • 최적화로 데이터가 제거되지 않습니다.

5. ImportedExtern / ImportedExternPointer

  • 외부 코드가 정의한 전역 변수를 참조하거나 포인터로 접근할 때 사용합니다.
  • 코드에서 변수를 선언하지만 초기화하지 않습니다.
  • 외부 코드에서 변수 초기화를 처리해야 합니다.

6. Struct / Bitfield

  • 데이터를 구조체 또는 비트필드로 저장하여 가독성과 메모리 효율성을 높입니다.
  • 구조체 이름 또는 필드 이름을 직접 지정할 수 있습니다.

7. Const / Volatile / ConstVolatile

  • 데이터를 상수, 휘발성 변수 또는 둘 다로 선언합니다.
  • 컴파일러 최적화를 방지하거나 메모리 접근 방식을 제어할 때 유용합니다.

8. FileScope

  • 데이터를 정적(static) 변수로 선언하여 파일 내에서만 접근 가능하도록 제한합니다.
  • 데이터 교환 인터페이스(C API, MAT 파일 로깅 등)에는 사용이 제한됩니다.

9. Reusable

  • 동일한 변수를 여러 독립적인 신호 경로에 재사용하여 메모리를 절약합니다.
  • 특정 계산 경로의 중간 계산 결과를 저장하는 데 유용합니다.

10. GetSet

  • 데이터를 직접 액세스하지 않고, 사용자 정의 접근 함수를 통해 읽거나 씁니다.
  • 데이터 보호 및 접근 로직 추가가 가능합니다.

초보자를 위한 실용적인 팁

  1. 전역 변수로 데이터를 유지하려면?
    • ExportedGlobal을 선택하세요. 생성된 코드에서 데이터를 전역 변수로 쉽게 확인할 수 있습니다.
  2. 구조체로 데이터를 깔끔하게 관리하려면?
    • Struct 클래스를 사용하세요. 데이터가 구조체 필드로 표현되어 코드 가독성이 좋아집니다.
  3. 데이터가 제거되지 않도록 방지하려면?
    • Model Default를 사용하면 데이터를 최적화에서 제거하지 않습니다.
  4. 외부 코드와 연동하려면?
    • 외부 변수는 ImportedExtern을, 외부 파일에 저장된 데이터는 ImportFromFile을 사용하세요.
  5. 상수 데이터를 설정하려면?
    • Const 클래스를 사용하면 데이터가 읽기 전용으로 설정됩니다.