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

注: 提供されているマクロは、クラス内での使用に限定されます。クラス外からの属性へのアクセスには、アクセサー/ミューテーター操作を使用できます。また、マクロに関する実装を外部 (例えば、パブリック・インライン操作内など) に公開することは許可されていません。

関係およびフロー・ポートの特定メモリー・セグメントへの割り当て

また、MicroC プロファイルを使用すると、すべての関係およびフロー・ポートを特定のメモリー・セグメントに割り当てることができます。

注: フロー・ポートおよび関係の特定メモリー・セグメントへの 割り当ては、直接フロー・ポートおよび直接関係に限り適用されます (つまり、C_CG::Configuration::DirectFlowPorts プロパティーおよび C_CG::Configuration::DirectRelations プロパティーを True に 設定する必要があります)。

関係およびフロー・ポートを特定のメモリー・セグメントに割り当てるには、以下のようにします。

メモリー・セグメントの使用例

この例では、メモリー・セグメンテーション・プロパティーに指定した値が Rational Rhapsody で 生成されたコードにどのように反映されるかを示します。

プロパティー名 プロパティー値
C_CG::Configuration::DefaultROMSegmentName ROM
C_CG::Configuration::FarPointerQualifier far
最初のセグメントの場合 (モデル内の file_0 の variable_0 に適用されるステレオタイプ):  
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
2 番目のセグメントの場合 (モデル内の file_0 の variable_1 に適用されるステレオタイプ):  
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
*********************************************************************/

フィードバック