2016-04-13 32 views
0

Arduino programlama (Arduino Pro Mini 3.3v sürümü) için yeniyim, aşağıdaki gibi bir kod var. Ben 9DOF, OLED ekran ve arduino pro mini bir BLE koparma bağlanıyorum.arduino programlama: yeterli hafıza mesajı yok

Zaten bazı bellek optimizasyon ipuçlarını inceledim, ancak hala bir sorunum var. Aşağıdaki kodla bile, dinamik bellek için yalnızca 9 baytım kaldı. BTLEserial.begin();'u etkinleştirirsem, belleği kaybeder. Lütfen herhangi bir öneri takdir edilecektir.

#include <Wire.h> 
#include <SPI.h> 
#include <SparkFunLSM9DS1.h> 
#include "Adafruit_BLE_UART.h" 
#include <Adafruit_GFX.h> 
#include <Adafruit_SSD1306.h> 

#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET); 



LSM9DS1 imu; 


#define LSM9DS1_M 0x1E // Would be 0x1C if SDO_M is LOW 
#define LSM9DS1_AG 0x6B // Would be 0x6A if SDO_AG is LOW 

#define ADAFRUITBLE_REQ 10 
#define ADAFRUITBLE_RDY 2 
#define ADAFRUITBLE_RST 9 

Adafruit_BLE_UART BTLEserial = Adafruit_BLE_UART(ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST); 



void setup(void) { 

    Serial.begin(9600); 

    display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64) 

    display.display(); 
    delay(2000); 


    display.clearDisplay(); 


    display.drawPixel(10, 10, WHITE); 

    display.display(); 
    delay(2000); 
    display.clearDisplay(); 

    imu.settings.device.commInterface = IMU_MODE_I2C; 
    imu.settings.device.mAddress = LSM9DS1_M; 
    imu.settings.device.agAddress = LSM9DS1_AG; 
    if (!imu.begin()) 
    { 
    while (1) 
     ; 
    } 


// BTLEserial.begin(); - if i uncomment this code, i will get a not enough memory error. 

} 


aci_evt_opcode_t laststatus = ACI_EVT_DISCONNECTED; 

void loop() { 

    displayAllDOF(); 

} 

void displayAllDOF(){ 
    display.setTextSize(1); 
    display.setTextColor(WHITE); 

    imu.readGyro(); 
    display.setCursor(0,0); 
    display.print("G:"); 
    display.print(imu.calcGyro(imu.gx)); 
    display.print(", "); 
    display.print(imu.calcGyro(imu.gy)); 
    display.print(", "); 
    display.print(imu.calcGyro(imu.gz)); 
    display.println(" "); 

    imu.readAccel(); 
    display.print("A:"); 
    display.print(imu.calcAccel(imu.ax)); 
    display.print(", "); 
    display.print(imu.calcAccel(imu.ay)); 
    display.print(", "); 
    display.print(imu.calcAccel(imu.az)); 
    display.println(" "); 

    imu.readMag(); 
    display.print("M:"); 
    display.print(imu.calcMag(imu.mx)); 
    display.print(", "); 
    display.print(imu.calcMag(imu.my)); 
    display.print(", "); 
    display.print(imu.calcMag(imu.mz)); 
    display.println(" "); 

    display.display(); 
    display.clearDisplay(); 

} 

cevap

1

Başlamak için, RAM'inizin nereye gittiğini bulmanız gerekir - Her kitaplık ne kadar sürer? Hepsini aynı anda çalıştırmanız gerekiyor mu? Görüntü düzenini ve IMU kodunu geçerli ayarlarınızda çalıştırabileceğinizi biliyorsunuz - IMF kodunun sadece'u etkinleştirebileceği bir şey uygulayabilir, verileri çeker ve devre dışı bırakır mı? Ve ekran ve BTLE kodu ile aynı? Bu şekilde her bir kütüphane sadece ihtiyaç duyulduğunda RAM tüketen ve operasyon

Güncelleme 1

yukarıda bahsettiğim ne bir örnek bitmiş mi bir kez boşaltır edilir. Tüm kitaplıkların .end() işlevini uygulayıp uygulamadığını bilmiyorum. Kullanabileceğiniz benzer bir yönteme sahip olabilirler.

// Simple data storage for the .gx and .gy values 
typedef struct { 
    float x, y; 
} GyroData_t; 

GyroData_t getImuData() { 
    GyroData_t data; 
    // Create the IMU class, gather data from it, and then destroy it 
    LSM9DS1 *imu = new LSM9DS1(); 
    imu->begin(); 
    imu->readGyro(); 
    data.x = imu.gx; 
    data.y = imu.gy; 
    imu->end(); 
    // This will reclaim the RAM that was used by the IMU - We no longer need it 
    delete imu; 
    return data; 
} 

void displayAllDOF() { 
    // Gather the IMU data 
    GyroData_t data = getImuData(); 
    // Create the display object, and print the data we received 
    Adafruit_SSD1306 *display = new Adafruit_SSD1306(OLED_RESET); 
    display->print(...); 
    .... 
    display->end(); 
    // Reclaim the display RAM used 
    delete display; 

    // Do any bluetooth operations now 
    doBluetoothStuff(); 
} 

void doBluetoothStuff() { 
    Adafruit_BLE_UART *BTLEserial = new Adafruit_BLE_UART(ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST); 
    BTLESerial->begin(); 
    ... 
    BTLESerial->end(); 
    delete BTLESerial; 
} 
+0

Bu benim eksikliğim, mobil geliştiriciyim ve düşük seviyeli programlamaya başladım. Şimdi bir fikrim var. Çok teşekkürler Daniel. – triston

+0

Merhaba Daniel, yine aynı soru, BTLE, IMU, OLED ekranını birlikte çalıştırmam gerekirse, herhangi bir öneriniz var mı? Teşekkürler – triston

+1

Yapabileceğinizi düşünmüyorum - Derleyiciniz, aynı anda çalışan tüm sınıflara sahip olamayacağınızı açıkça belirtir, bunu yapmak için yeterli RAM'iniz yoktur. Bununla birlikte, bunların hepsini aynı anda çalıştırmanız gerekmediğinden, yapmanız gerekenleri yapmak için yeterince uzun olduğundan eminim. Her işlemi kendi işlevine ayırın ve her seferinde bir tane ele alın. Cevabımı daha iyi gösterecek bir yarı sözde kod ile güncelledim. –