2017-03-24 13 views
0

arduinoにデバッグユーティリティがない(または少なくとも私はfamilliarではありません)ので、コードに従うのが難しく、停止している場所を参照するのが難しいです... 以下私はiattached myセットアップ機能。内部設定私はinitクラスのオブジェクトを作成します。そのコンストラクタは、ミッション時間などのEEPROMデータを初期化する世話をします。いくつかのシリアル出力を追加することで、プログラムがinitクラスから抜け出すことはないことがわかりました。私がinitにコメントすると、すべて正常に動作します。私は、initクラスのすべての行をチェックしますが、これはinit.cppで何の問題arduinoのスケッチはオブジェクトコンストラクタでの実行を停止します

 void setup() { 

     Serial.begin(9600); 
     pinMode(ARM_BUTTON_PIN,INPUT); 
    Serial.println("start"); 
    // EEPROM.put(PACKET_COUNT_EEPROM, 0); 

Init init; 
Serial.println("before Contoll"); 

controller= new Controller(); 


Serial.println("setup"); 

delay(200);} 

見つかりませんでした。サンプラーやtelemeteryのよう

#ifndef Init_h 
    #define Init_h 

    #include "constants.h" 
    #include "Sampler.h" 
    #include "SDLogger.h" 
    #include "Controller.h" 

    /* 
    * EEPROM Structure 
    * 0: @: 0 mission Time(s) uint16_t 
    * 1: @: sizeof(uint16_t) packetCount uint16_t 
    * 2: @: sizeof(uint16_t)+ sizeof(uint16_t) stateCode uint8_t 
    * 3: @: sizeof(uint16_t)+ sizeof(uint16_t) + sizeof(uint8_t) refAltitude int16_t 
    #define MISSION_TIME_EEPROM 0 
    #define PACKET_COUNT_EEPROM sizeof(uint16_t) 
    #define STATE_CODE_EEPROM sizeof(uint16_t)+ sizeof(uint16_t) 
    #define REF_ALTITUDE_EEPROM sizeof(uint16_t)+ sizeof(uint16_t) + sizeof(uint8_t) 
    */ 
    class Init { 
    public: 
    Init(); 


    private: 
     resetSystem(); 
     initializeSystem(); 
    recoverSystem(); 

    }; 
    #endif 

他のクラス:

#include "constants.h" 
    #include "Sampler.h" 
    #include "SDLogger.h" 
    #include "Controller.h" 
    #include "Init.h" 

/* 
* EEPROM Structure 
* 0: @: 0 mission Time(s) uint16_t 
* 1: @: sizeof(uint16_t) packetCount uint16_t 
* 2: @: sizeof(uint16_t)+ sizeof(uint16_t) stateCode uint8_t 
* 3: @: sizeof(uint16_t)+ sizeof(uint16_t) + sizeof(uint8_t) refAltitude int16_t 
#define MISSION_TIME_EEPROM 0 
#define PACKET_COUNT_EEPROM sizeof(uint16_t) 
#define STATE_CODE_EEPROM sizeof(uint16_t)+ sizeof(uint16_t) 
#define REF_ALTITUDE_EEPROM sizeof(uint16_t)+ sizeof(uint16_t) + sizeof(uint8_t) 
*/ 

Init::Init(){ 
    Sampler sampler; 
    uint16_t missionEEPROMTime ; 
    EEPROM.get(MISSION_TIME_EEPROM, missionEEPROMTime); 

     Serial.println("init"); 
delay(100); 
    if(!digitalRead(ARM_BUTTON_PIN)){ 

    if(missionEEPROMTime == 0){ 
    //initiate reset 
    Serial.println("armed0"); 

    resetSystem(); 
    Serial.println("befin"); 
delay(100); 

    initializeSystem(); 
    Serial.println("befres"); 

    Controller::startTime = 0; 
    } else{ 
    Serial.println("armednot0"); 

    //recover 
    recoverSystem(); 
    Controller::startTime = missionEEPROMTime; 
    } 
    }else{ 
     Serial.println("not arm"); 

       resetSystem(); 
       Controller::startTime = 0; 
     EEPROM.put(REF_ALTITUDE_EEPROM, sampler.readAltitude()); 
       // Serial.println(sampler.readAltitude()); 

     // while(1); 
    } 

    } 


    Init::resetSystem(){ 
      Sampler sampler; 

    for (int i = 0 ; i < EEPROM.length() ; i++) { 
    EEPROM.write(i, 0); 
    } 
      EEPROM.put(REF_ALTITUDE_EEPROM, sampler.readAltitude()); 

    } 
    Init::initializeSystem(){ 
     delay(100); 
       Serial.println("vbqdfewf"); 


      Serial.println("initSample"); 

     EEPROM.put(MISSION_TIME_EEPROM, 0); 
     EEPROM.put(PACKET_COUNT_EEPROM, 0); 
     EEPROM.put(STATE_CODE_EEPROM, 0); 
     // EEPROM.put(REF_ALTITUDE_EEPROM, sampler.readAltitude()); 
     // SDLogger::initCSV(0); 
     // SDLogger::initIMG(0); 
     // SDLogger::beginBus(); 
     Serial.println("inited"); 
    } 
    Init::recoverSystem(){ 
     // SDLogger::initCSV(1); 
     // SDLogger::initIMG(1); 
     // SDLogger::beginBus(); 

    } 

とinit.h私はinit initをコミントするときにうまく動作します。だから問題はない。

+2

あなたのコンストラクタでは非常に多くのことをしているようです。おそらく、そのほとんどを他の初期化関数に移すべきでしょうか?また、エミュレータまたはリモートデバッグを介して、デバッガのコードをステップ実行して、問題の原因を突き止めてください。 –

+1

"arduinoのデバッグユーティリティはありません"という単純なことは真実ではありません。シミュレータ、jtagデバッグを実行するか、pc用にコンパイルし、必要に応じてハードウェアをモックアップすることができます。ブラックボックスでの開発は最先端ではありません。 – Klaus

+1

dudeさんのコメントに加えて:一般的に、あなたは印刷や遅れなどをしてはいけません。そのようなクラスのグローバルインスタンスは、非常に早く構築されます。 – datafiddler

答えて

0

Static Initialzation Order Fiascoとも呼ばれます。オブジェクトの構造setupより前に発生するもの)と初期手順setup以降)を分離する必要があります。

たとえば、Serialと他の多くのクラスは、スケッチから明示的に呼び出されるbegin()またはinit()メソッドを持っています。

+0

あなたが私のコードで見ることができるように、私はセットアップですべてをやったので、それはポイントではありません...私はいくつかの遅延()を削除した後、私は何かをやり始めました...遅延がコンストラクタ私は確信していません... – alireza787

+0

しかし、とにかくあなたの情報のおかげで、私はこのことを知っていない..ありがとう。 – alireza787

関連する問題