2013-06-17 3 views
5

Я новичок в разработке встроенных систем и не использую очень маленькую программную память (в данном случае 16 КБ). Я хотел бы иметь возможность создавать глобальные переменные, массивы и функции, к которым я могу получить доступ из любой точки программы, тогда как существует только в одном месте в памяти. Мой текущий подход заключается в использовании статических членов класса и методов, которые я могу использовать, просто включив заголовочный файл (например, #include "spi.h").Избегайте создания нескольких копий кода в памяти

Каков наилучший подход к тому, что я пытаюсь сделать?

Вот пример класса. Из того, что я понимаю, такие переменные, как _callback и определения функций, такие как call() в .cpp, будут отображаться только в 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(); 
} 
+0

, чтобы просто включить заголовок и начать использовать «SPI», просто используйте [Singleton pattern] (http://stackoverflow.com/questions/1008019/c-singleton-design-pattern), во встроенных встроено то, что у вас есть одно периферийное устройство и только один объект для работы с оборудованием, но больше не допускается использование объектов. , также вы можете использовать [заводской шаблон] (http://stackoverflow.com/questions/5120768/how-to-implement-the-factory-pattern-in-c-correctly), чтобы можно было, например, указать определенное количество объектов (SPI) – Abdurahman

ответ

10

Члены данных и функции-члены класса вы написали, будет определен только один раз в памяти. И если они не помечены как статические, функции-члены будут еще будут определены только один раз в памяти. Нестатические члены данных будут созданы в памяти один раз для каждого создаваемого объекта, поэтому, если вы создаете только один объект SPI, вы получаете только одну копию своих нестатических данных. Короткая версия: вы решаете проблему без проблем.

1

Как и в случае с Пит, статический не влияет на удвоение кода, только членские вары. В вашем примере существует 0 разница между использованием статической нестатической памяти, за исключением, возможно, для _callback var (который вы вызываете как ошибку.) И эта одна переменная будет только удваиваться, если класс был создан более одного раза.

Если вы хотите, чтобы код не существовал в памяти, когда он не используется, посмотрите на наложения или какой-то динамический процесс связывания. Код типа DLL, вероятно, будет серьезным переполнением для 16K, но наложения со сжатым кодом могут помочь вам.

Кроме того, остерегайтесь дополнительных ссылок в коде из библиотек. Внимательно изучите ваши файлы .map для раздувания кода из безобидных вызовов функций. Например, один вызов printf() будет связываться во всех видах варгов, если это единственное, что его использует. То же самое для программной плавающей запятой (если у вас нет блока FP по умолчанию.)

+0

Извините, «вызывать как ошибку» остался в стороне от другого вопроса, который я задал. Я обновил вопрос с помощью примера большого массива, чтобы проиллюстрировать, о чем я говорю. – JustcallmeDrago

+0

В вашем новом случае по-прежнему нет причин объявлять его статичным, за исключением того, чтобы сделать его однотипным объектом для (сомнительной) безопасности. Опять же, вам лучше изучить свой файл карты, чтобы узнать, откуда вы надуваетесь, и сражаться с ним. –

Смежные вопросы