避免在内存中创建多个代码副本
Avoid creating multiple copies of code in memory
我是嵌入式系统开发的新手,不习惯只有很少的程序内存(在这种情况下为16kB)可以使用。我希望能够创建全局变量,数组和函数,我可以从程序中的任何地方访问,而只存在于内存中的一个地方。我目前的方法是使用静态类成员和方法,我可以通过简单地包括头文件(例如#include "spi.h"
)来使用。
对于我正在尝试做的事情,什么是最好的方法?
下面是一个示例类。据我所知,变量如_callback
和函数定义如。cpp中的call()
只会出现在spi中。所以它们在记忆中只会出现一次,但我可能会混淆。
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();
}
您编写的类的数据成员和成员函数将只在内存中定义一次。如果没有被标记为static,则成员函数将仍然只在内存中定义一次。对于您创建的每个对象,将在内存中创建一次非静态数据成员,因此,如果您只创建一个SPI
对象,则只获得其非静态数据成员的一个副本。简而言之:你在解决一个无关紧要的问题。
根据Pete的说法,静态不会影响代码翻倍,只会影响成员变量。在您的示例中,除了_callback变量(您将其作为错误调用)之外,静态和非静态内存使用之间没有任何区别。并且只有当类被创建了不止一次时,这个变量才会加倍。
如果您希望代码在不使用时不存在于内存中,请查看覆盖或某种动态链接过程。对于16K来说,DLL类型的代码可能会过多,但是使用压缩代码的覆盖可能会对您有所帮助。
还要注意库中的额外链接代码。仔细检查您的.map文件,看看是否因为无害的函数调用而导致代码膨胀。例如,一个单独的printf()调用将链接所有类型的变量,如果它是唯一使用它的东西。对于软件浮点数也是如此(如果默认情况下没有FP单元)
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 用于制作文件副本的代码
- 该代码调用副本或移动构造函数
- C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中
- 使用矢量push_back代码创建对象副本时遇到问题
- 内联函数,始终 n+1 个代码副本,其中'n'是调用次数
- 我的代码正在制作 2D 数组元素的重复副本.代码中有什么问题?
- NewDirectByteBuffer是否在本机代码中创建副本
- 这段带有副本C++08的代码出错
- 我的代码是在创建对象的深层副本还是浅层副本
- 这段代码创建了多少个变量C的副本
- 避免在内存中创建多个代码副本
- 此代码将执行多少个副本
- 为什么这个代码可以消除副本
- 在汇编代码中查找不必要的缓冲区副本