私は組み込みシステムでの開発には新しく、プログラムメモリ(この場合は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();
}
単にヘッダを含めて「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