c++ - 避免在内存中创建多个代码拷贝

标签 c++ memory-management embedded

我是嵌入式系统开发的新手,不习惯使用非常小的程序内存(在本例中为 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();
}

最佳答案

你写的类的数据成员和成员函数只会在内存中定义一次。如果它们标记为静态,则成员函数将仍然仅在内存中定义一次。对于您创建的每个对象,非静态数据成员将在内存中创建一次,因此如果您只创建一个 SPI 对象,您只会获得其非静态数据成员的一个拷贝。简短版本:您解决的不是问题。

关于c++ - 避免在内存中创建多个代码拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17156539/

相关文章:

c++ - 如何在 C++ 中创建高效的多线程任务调度程序?

c++ - C++ 类的内存布局是否会受到地址空间布局随机化的影响

embedded - 带有 PA0 按钮的 STM32F303VCT6 外部中断不会触发 LED

embedded - 如何将静态库 CppUTests 添加到我的项目 atmel studio

c++ - 名称查找问题,GCC 和 clang 不同意

c# - 启动外部应用程序并在任务栏上最大化(全屏)

C++ auto on int16_t 强制转换为整数

c++ - 没有 ->Release() 的 DirectX

python - 如何减少 Twisted 服务器的内存使用量?

c - 如何在跨文件预处理时获取唯一值