저장 클래스(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
- 데이터를 직접 액세스하지 않고, 사용자 정의 접근 함수를 통해 읽거나 씁니다.
- 데이터 보호 및 접근 로직 추가가 가능합니다.
초보자를 위한 실용적인 팁
- 전역 변수로 데이터를 유지하려면?
- ExportedGlobal을 선택하세요. 생성된 코드에서 데이터를 전역 변수로 쉽게 확인할 수 있습니다.
- 구조체로 데이터를 깔끔하게 관리하려면?
- Struct 클래스를 사용하세요. 데이터가 구조체 필드로 표현되어 코드 가독성이 좋아집니다.
- 데이터가 제거되지 않도록 방지하려면?
- Model Default를 사용하면 데이터를 최적화에서 제거하지 않습니다.
- 외부 코드와 연동하려면?
- 외부 변수는 ImportedExtern을, 외부 파일에 저장된 데이터는 ImportFromFile을 사용하세요.
- 상수 데이터를 설정하려면?
- Const 클래스를 사용하면 데이터가 읽기 전용으로 설정됩니다.