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をコミントするときにうまく動作します。だから問題はない。
あなたのコンストラクタでは非常に多くのことをしているようです。おそらく、そのほとんどを他の初期化関数に移すべきでしょうか?また、エミュレータまたはリモートデバッグを介して、デバッガのコードをステップ実行して、問題の原因を突き止めてください。 –
"arduinoのデバッグユーティリティはありません"という単純なことは真実ではありません。シミュレータ、jtagデバッグを実行するか、pc用にコンパイルし、必要に応じてハードウェアをモックアップすることができます。ブラックボックスでの開発は最先端ではありません。 – Klaus
dudeさんのコメントに加えて:一般的に、あなたは印刷や遅れなどをしてはいけません。そのようなクラスのグローバルインスタンスは、非常に早く構築されます。 – datafiddler