C_CG::Configuration::EnableSegmentedMemory プロパティーを 使用して、アプリケーションのメモリー・セグメンテーション・コードの生成を有効または無効にします。
属性は、以下のプロパティーを使用して特定のメモリー・セグメントに割り当てられます。
これらは属性レベルのプロパティーですが、これらのプロパティーを使用する最も効果的な方法は、以下のとおりです。
メモリー・セグメントのプロパティーは以下のように使用します。
struct myClass {
uint8 attr1;
...
struct myClass_Seg1 <far> * itsSeg1;
struct myClass_Seg2 <far> * itsSeg2;
...
}
このコード・サンプルで、<far> は、FarPointerQualifier プロパティーを
使用して指定した任意のコードに置き換えられます。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 プロファイルを使用すると、すべての関係およびフロー・ポートを特定のメモリー・セグメントに割り当てることができます。
関係およびフロー・ポートを特定のメモリー・セグメントに割り当てるには、以下のようにします。
この例では、メモリー・セグメンテーション・プロパティーに指定した値が 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 |
#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
*****************************************************************/
/*## 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 *********************************************************************/