C++ arduino上的草图在对象构造函数中停止执行
由于arduino上没有调试实用程序(或者至少我不熟悉),因此很难遵循代码并查看停止的位置。。。 下面我连接了我的设置功能。在安装程序中,我创建了一个init类的对象。。其构造函数负责初始化任务时间等的EEPROM数据。但通过添加几个串行输出,我发现该程序无法脱离init类。当我评论init时,一切正常。我检查了init类的所有行,但没有发现问题C++ arduino上的草图在对象构造函数中停止执行,c++,arduino,C++,Arduino,由于arduino上没有调试实用程序(或者至少我不熟悉),因此很难遵循代码并查看停止的位置。。。 下面我连接了我的设置功能。在安装程序中,我创建了一个init类的对象。。其构造函数负责初始化任务时间等的EEPROM数据。但通过添加几个串行输出,我发现该程序无法脱离init类。当我评论init时,一切正常。我检查了init类的所有行,但没有发现问题 void setup() { Serial.begin(9600); pinMode(ARM_BUTT
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);}
这是init.cpp:
#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时,采样器和遥测中的其他类可以很好地工作。所以它们没有问题。这也被称为。您必须将对象的构造(在设置
之前发生的事情)及其初始过程(在设置
或更高版本中)分开
例如,
Serial
和许多其他类都有一个从草图显式调用的begin()
或init()
方法。您似乎在构造函数中做了很多工作。也许您应该将它的大部分转移到其他一些初始化函数中?此外,无论是通过仿真器还是通过远程调试,您都应该尝试在调试器中逐步检查代码,以找出可能存在的问题。“arduino上没有调试实用程序”这根本不是真的。如果需要,您可以运行模拟器、jtag调试或简单地为pc和模拟硬件编译。黑匣子上的开发不是最先进的。除了杜德的评论:一般来说,你不应该在任务中做任何打印、延迟或其他事情。此类类的全局实例很早就构建好了。正如您在我的代码中看到的,我已经在安装程序中完成了所有工作,所以它不应该成为重点。。。在我删除了几个delays()之后,它开始做一些事情…似乎在构造函数中不允许延迟。。。我不确定…但是无论如何谢谢你的信息我不知道这个。。谢谢
#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