MicroC 프로파일을 사용하여 메모리 관리

MicroC 프로파일은 ROM에 메모리 할당 기능을 포함하여 메모리 분석 방식을 애플리케이션에 통합하기 위한 메커니즘을 제공합니다.
주: 애플리케이션이 반드시 컴파일 시 초기화를 사용하도록 지정한 경우에만 이 기능을 사용할 수 있습니다(컴파일 시 초기화 사용 참조).

메모리 분석 방식 코드 생성 사용

애플리케이션에 메모리 분석 방식 코드 생성을 사용하거나 사용하지 않으려면 C_CG::Configuration::EnableSegmentedMemory 특성을 사용하십시오.

특정 메모리 세그먼트에 속성 지정

속성은 다음 특성을 사용하여 특정 메모리 세그먼트에 지정됩니다.

속성 레벨 특성이긴 하지만 이러한 속성을 사용할 수 있는 가장 효율적인 방법은 다음과 같습니다.

  1. 사용할 각 메모리 세그먼트에 대해 속성에 적용할 수 있는 스테레오타입을 작성하십시오.
  2. 작성한 새 스테레오타입에 이러한 속성 값을 제공하십시오.
  3. 해당 메모리 세그먼트에 지정될 모든 속성에 스테레오타입을 적용하십시오.

다음과 같이 메모리 세그먼트 특성을 사용하십시오.

생성된 코드에 메모리 세그먼트 특성이 미치는 영향

MemorySegmentName 특성에 세그먼트 이름을 제공하는 경우, 생성된 코드는 이름이 클래스 이름 및 메모리 세그먼트 이름을 연결하는 새 구조체를 포함합니다. 이 구조체는 이 메모리 세그먼트에 지정된 속성을 모두 포함합니다.

속성은 관련 메모리 세그먼트 구조체에 선언되기 때문에 모델의 주어진 클래스에 정의한 속성이 이러한 다수의 메모리 세그먼트 구조체 간에 분배되는 상황이 발생할 수 있습니다. 모델의 클래스 유형을 나타내기 위해 생성된 구조체는 이러한 속성을 가리키는 포인터를 포함합니다.

프롤로그 특성(스펙 및 구현)에 입력된 코드는 메모리 세그먼트에 지정된 데이터 구조 목록 앞에 생성됩니다. 예를 들면, 다음과 같습니다.
#pragma data_seg("ROM")
에필로그 특성(스펙 및 구현)에 입력된 코드는 메모리 세그먼트에 지정된 데이터 구조 목록 다음에 생성됩니다. 예를 들면, 다음과 같습니다.
#pragma data_seg(DEFAULT)

클래스의 세그먼트화된 데이터에 액세스

모델의 클래스에 대해 정의된 속성이 생성된 코드에서 서로 다른 메모리 세그먼트 구조체 간에 분배될 수 있으므로 Rational Rhapsody는 데이터가 지정된 메모리 세그먼트를 지정하지 않고 이 데이터에 액세스할 수 있도록 매크로를 제공합니다. 매크로에 사용되는 형식은 C_CG::Attribute::SegmentedAttributeMacroName 특성 값을 통해 결정됩니다.

예를 들어, $class_$attribute 특성의 기본값을 보존하는 경우 생성된 코드는 #define file_0_variable_0 file_0_Seg1.variable_0과 같습니다.

주: 제공된 매크로는 클래스 내부에서만 사용됩니다. 클래스 외부에서 속성에 액세스하려면 액세서/뮤테이터 오퍼레이션을 사용할 수 있습니다. 또한 매크로 구현을 외부적으로 노출하는 것(예를 들어, public 인라인 오퍼레이션 내에서)은 허용되지 않습니다.

특정 메모리 세그먼트에 관계 및 플로우 포트 지정

또한 MicroC 프로파일을 사용하여 특정 메모리 세그먼트에 모든 관계 및 플로우 포트를 지정할 수 있습니다.

주: 특정 메모리 세그먼트에 플로우 포트 및 관계를 지정하는 것은 직접 플로우 포트 및 직접 관계에만 적용됩니다(C_CG::Configuration::DirectFlowPortsC_CG::Configuration::DirectRelations 특성을 True로 설정해야 함을 의미).

특정 메모리 세그먼트에 관계 및 플로우 포트를 지정하려면 다음을 수행하십시오.

메모리 세그먼트 사용법 예제

다음 예제는 메모리 분석 방식 특성에 지정된 값이 Rational Rhapsody가 생성한 코드에 반영되는 방법을 표시합니다.

특성 이름 특성 값
C_CG::Configuration::DefaultROMSegmentName ROM
C_CG::Configuration::FarPointerQualifier far
for first segment (stereotype applied to variable_0 in file_0 model):  
C_CG::Attribute::MemorySegmentName Seg1
C_CG::Attribute::MemorySegmentSpecificationProlog #pragma DATA_SEG $seg
C_CG::Attribute::MemorySegmentSpecificationEpilog #pragma DATA_SEG DEFAULT
C_CG::Attribute::MemorySegmentImplementationProlog #pragma DATA_SEG $seg
C_CG:Attribute:MemorySegmentImplementationEpilog #pragma DATA_SEG DEFAULT
C_CG::Attribute::SegmentedAttributeMacroName $class_$attribute
for second segment (stereotype applied to variable_1 in file_0 in model):  
C_CG::Attribute::MemorySegmentName Seg2
C_CG::Attribute::MemorySegmentSpecificationProlog #pragma DATA_SEG "$seg"
C_CG::Attribute::MemorySegmentSpecificationEpilog #pragma DATA_SEG DEFAULT
C_CG::Attribute::MemorySegmentImplementationProlog #pragma DATA_SEG "$seg"
C_CG:Attribute:MemorySegmentImplementationEpilog #pragma DATA_SEG DEFAULT
C_CG::Attribute::SegmentedAttributeMacroName $class_$attribute

결과 코드

h 파일:
#ifndef file_0_H
#define file_0_H

/*## auto_generated */
#include "mxf\Ric.h"
/*## auto_generated */
#include "Default.h"
/*## package Default */

/*## class TopLevel::file_0 */
/*#[ ignore */
typedef struct file_0_Seg1_t {
    int variable_0;		/*## attribute variable_0 */
} file_0_Seg1_t;

#define file_0_variable_0 file_0_Seg1.variable_0
typedef struct file_0_Seg2_t {
    int variable_1;		/*## attribute variable_1 */
} file_0_Seg2_t;

#define file_0_variable_1 file_0_Seg2.variable_1

/*#[ ignore */
#pragma DATA_SEG Seg1

/*#]*/
extern struct file_0_Seg1_t file_0_Seg1;
/*#[ ignore */
#pragma DATA_SEG DEFAULT

/*#]*/

/*#[ ignore */
#pragma DATA_SEG "Seg2"

/*#]*/
extern struct file_0_Seg2_t file_0_Seg2;
/*#[ ignore */
#pragma DATA_SEG DEFAULT

/*#]*/
/*#]*/
/***    User explicit entries    ***/

#endif
/******************************************************************
File Path	: DefaultComponent\DefaultConfig\file_0.h
*****************************************************************/
c 파일:
/*## auto_generated */
#include "file_0.h"
/*## package Default */

/*## class TopLevel::file_0 */
/*#[ ignore */

/*#[ ignore */
#pragma DATA_SEG Seg1

/*#]*/
struct file_0_Seg1_t file_0_Seg1;
/*#[ ignore */
#pragma DATA_SEG DEFAULT

/*#]*/

#pragma DATA_SEG "Seg2"struct file_0_Seg2_t file_0_Seg2;
/*#[ ignore */
#pragma DATA_SEG DEFAULT

/*#]*/
/*#]*/

/*********************************************************************
	File Path	: DefaultComponent\DefaultConfig\file_0.c
*********************************************************************/

피드백