【问题标题】:sketch on arduino stops executing in object constructorarduino 上的草图停止在对象构造函数中执行
【发布时间】:2017-03-25 05:25:44
【问题描述】:

由于 arduino 上没有调试实用程序(或者至少我不熟悉),因此很难遵循代码并查看它在哪里停止...... 下面我附上了我的设置功能。在设置中,我创建了一个 init 类的对象。它的构造函数负责为任务时间等初始化 EEPROM 数据。但是通过添加几个串行输出,我发现该程序不会退出初始化类。当我评论 init 时,一切正常。我检查了init类的所有行,但没有发现问题

       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.h:

 #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

当我加入 init 初始化时,采样器和遥测中的其他类工作正常。所以他们没有问题。

【问题讨论】:

  • 您似乎在构造函数中做了很多工作。也许您应该将大部分内容移到其他一些初始化函数中?此外,无论是通过模拟器还是远程调试,您都应该尝试在调试器中单步调试代码以找出可能存在的问题。
  • “在 arduino 上没有调试实用程序”,这根本不是真的。如果需要,您可以运行模拟器、jtag 调试或简单地为 pc 编译和模拟硬件。在黑盒上进行开发并不是最先进的。
  • 除了老兄的评论:一般来说,你不应该在c'tor中做任何打印或延迟或其他事情。此类类的全局实例是很早就构建的。

标签: c++ arduino


【解决方案1】:

这也称为Static Initialzation Order Fiasco。您必须将对象的构造(在setup 之前发生的事情)与其初始过程(在setup 或更高版本中)分开。

例如,Serial 和许多其他类都有一个从草图显式调用的 begin()init() 方法。

【讨论】:

  • 正如你在我的代码中看到的那样,我已经在设置中完成了所有工作,所以这不应该是重点......在我删除了几个延迟()之后,我让它开始做某事......似乎延迟是不允许在构造函数中...我不确定...
  • 但无论如何谢谢你的信息我不知道这个..谢谢。
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2015-10-11
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多