我是开发嵌入式系统的新手,并不习惯使用非常少的程序存储器(在这种情况下为16kB)。我希望能够创建全局变量,数组和函数,我可以从程序中的任何位置访问,而仅存在于内存中的一个位置。我目前的方法是使用静态类成员和方法,只需包含头文件即可使用(例如#include "spi.h"
)。
我正在尝试做什么的最佳方法是什么?
这是一个示例类。根据我的理解,.cpp中的_callback
等变量和call()
等函数定义只会出现在spi.o中,因此它们只会在内存中出现一次,但我可能会混淆。< / p>
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 :(得分:10)
您编写的类的数据成员和成员函数将仅在内存中定义一次。如果它们不标记为静态,则成员函数仍然仅在内存中定义一次。对于您创建的每个对象,将在内存中创建一次非静态数据成员,因此,如果您只创建一个SPI
对象,则只能获得其非静态数据成员的一个副本。简短版本:你正在解决一个无问题。
答案 1 :(得分:1)
根据Pete的说法,static不会影响代码加倍,只会影响成员变量。在您的示例中,静态非静态内存使用之间存在0差异,除了_callback var(您将其称为错误)。并且如果类被多次创建,那么一个变量只会加倍。
如果您希望代码在不使用时不存在于内存中,请查看叠加层或某种动态链接过程。 DLL类型代码对于16K可能是主要的过度杀伤,但是使用压缩代码的覆盖可能会帮助你。
另外,请注意库中代码的额外链接。仔细检查.map文件,查看无关函数调用的代码膨胀情况。例如,单个printf()调用将链接各种vargs内容,如果它是唯一使用它的东西。软件浮点也相同(如果默认情况下没有FP单元。)