2013-06-17 5 views
5

私は組み込みシステムでの開発には新しく、プログラムメモリ(この場合は16kB)をほとんど使用していないので使い慣れていません。プログラム内のどこからでもアクセスできるグローバル変数、配列、関数を作成できるようにしたいのですが、は1つの場所にしか存在しませんメモリ内にあります。私の現在のアプローチは、単にヘッダファイル(例えば、#include "spi.h")を含めることによって使用できる静的なクラスメンバーとメソッドを使用することです。メモリに複数のコードコピーを作成することを避ける

私は何をしようとしているのですか?

ここではクラスの例を示します。私が理解するところでは、_callbackのような変数と.cppのcall()のような関数の定義はspi.oにしか現れないので、それらはメモリに一度しか現れませんが、混乱するかもしれません。

spi.h:

#ifndef SPI_H_ 
#define SPI_H_ 

#include "msp430g2553.h" 

class SPI { 
public: 
    typedef void (*voidCallback)(void); 

    static voidCallback _callback; 
    static char largeArray[1000]; 
    static __interrupt void USCIA0TX_ISR(); 
    static void call(); 

    static void configure(); 
    static void transmitByte(unsigned char byte, voidCallback callback); 
}; 

#endif /* SPI_H_ */ 

spi.cpp:

#include "spi.h" 

SPI::voidCallback SPI::_callback = 0; 
char SPI::largeArray[] = /* data */ ; 

void SPI::configure() { 
    UCA0MCTL = 0; 
    UCA0CTL1 &= ~UCSWRST;     
    IE2 |= UCA0TXIE; 

} 

void SPI::transmitByte(unsigned char byte, voidCallback callback) { 
    _callback = callback; 
    UCA0TXBUF = byte; 
} 

void SPI::call() { 
    SPI::_callback(); 
} 

#pragma vector=USCIAB0TX_VECTOR 
__interrupt void SPI::USCIA0TX_ISR() 
{ 
    volatile unsigned int i; 
    while (UCA0STAT & UCBUSY); 
    SPI::call(); 
} 
+0

単にヘッダを含めて「SPI」を使用するだけです。[Singleton pattern](http://stackoverflow.com/questions)/1008019/c-singleton-design-pattern)では、ハードウェアを扱う周辺機器が1つしかなく、オブジェクトが許可されていないオブジェクトが1つしかないことが一般的です。また、[工場パターン](http://stackoverflow.com/questions/5120768/how-to-implement-the-factory-pattern-in-c-correctly)を使用して、特定の数のオブジェクトを許可することもできますSPIのチャンネル) – Abdurahman

答えて

10

データメンバーとあなたが書いたクラスのメンバ関数は、専用メモリで一度定義されます。また、ではなく、がstaticとマークされている場合、メンバ関数はとなり、メモリ内では一度定義されます。非静的データメンバーは、作成するオブジェクトごとに一度だけメモリに作成されるため、SPIオブジェクトを1つだけ作成すると、静的でないデータメンバーのコピーが1つだけ取得されます。短いバージョン:あなたは問題ではない問題を解決しています。

1

静的は、コードの倍増には影響しません。メンバーvarsにのみ影響します。あなたの例では、おそらく_callback var(エラーとして呼び出す)以外の静的な非静的メモリの使用には0の違いがあります。そして、クラスが複数回作成された場合、その1つの変数は2倍になります。

使用していないときにコードがメモリに存在しないようにするには、オーバーレイや何らかの動的リンク処理を調べます。 DLLタイプのコードは、おそらく16Kの主要な過度の使用ですが、圧縮されたコードをオーバーレイするとあなたを助けるかもしれません。

また、ライブラリからコードにリンクされていることに注意してください。無害な関数呼び出しから.mapファイルを徹底的に調べてください。例えば、それが唯一のものであれば、1つのprintf()呼び出しがあらゆる種類のvargsのものにリンクします。ソフトウェア浮動小数点の場合と同じです(デフォルトではFPユニットがない場合)

+0

申し訳ありませんが、 "エラーとして呼び出す"は、私が尋ねた別の質問からの残り物でした。私は、私が何を話しているかを説明するために、例の大きな配列で質問を更新しました。 – JustcallmeDrago

+0

新しいケースでは、(疑わしい)安全性のためにシングルトンタイプのオブジェクトにすることを除いて、それを静的と宣言する理由はありません。繰り返しますが、マップファイルを調べて、どこから膨らんでいるのか、そこから戦っているのかを知ることができます。 –

関連する問題