5

我是在嵌入式系统上开发的新手,不习惯使用很少的程序内存(在这种情况下为 16kB)。我希望能够创建全局变量、数组和函数,这些变量、数组和函数可以从程序中的任何位置访问,而它们只存在于内存中的一个位置。我目前的方法是使用静态类成员和方法,我可以通过简单地包含头文件(例如#include "spi.h")来使用它们。

对于我正在尝试做的事情,最好的方法是什么?

这是一个示例类。据我了解,.cpp 中的变量_callback和函数定义等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();
}
4

2 回答 2

10

您编写的类的数据成员和成员函数只会在内存中定义一次。如果它们没有被标记为静态,成员函数仍然只会在内存中定义一次。将为您创建的每个对象在内存中创建一次非静态数据成员,因此如果您只创建一个SPI对象,您只会获得其非静态数据成员的一份副本。简短版本:您正在解决一个非问题。

于 2013-06-17T20:55:51.940 回答
1

根据 Pete 的说法,静态不会影响代码加倍,只会影响成员变量。在您的示例中,除了 _callback var (您将其称为错误)之外,静态非静态内存使用量之间的差异为 0。并且只有在多次创建类时,一个变量才会加倍。

如果您希望代码在不使用时不存在于内存中,请查看覆盖或某种动态链接过程。DLL 类型代码对于 16K 来说可能是主要的过度杀伤,但使用压缩代码覆盖可能会对您有所帮助。

另外,请注意库中代码中的额外链接。仔细检查您的 .map 文件是否因无害的函数调用而导致代码膨胀。例如,单个 printf() 调用将链接各种 vargs 的东西,如果它是唯一使用它的东西。软件浮点也一样(如果默认情况下没有 FP 单元。)

于 2013-06-17T21:14:57.327 回答