使用 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
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
/******************************************************************
檔案路徑: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

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

/*********************************************************************
	檔案路徑:DefaultComponent\DefaultConfig\file_0.c
*********************************************************************/

回饋