Печать данных массива структур, вызывающих перезагрузку на Atmega 2560 - PullRequest
0 голосов
/ 31 августа 2018

У меня есть заказная печатная плата, вмещающая ATmega2560 MCU. Я использую Atmel Studio 7 для предохранителей и прошивки HEX. Я использую Visual Studio с плагином Visual Micro, использующим смесь C / C ++ и Arduino.

У меня есть определение массива структуры.

Определение:

#define MAX_RECORDS 20 //Max number of records in the struct

typedef struct Record {
    uint8_t id;//unique number to define data sequence
    uint8_t sec;
    uint8_t obj;
    uint16_t xs;
    uint16_t ys;
    uint16_t xe;
    uint16_t ye;
    uint8_t clr;
    uint8_t tsz;
    uint8_t tid;
} tRecord;

struct Record recordsOut[MAX_RECORDS];

Вот как я печатаю данные на последовательный выход:

void ListDesignData() {
    Serial.println("========================================");
    Serial.println("Design data in non-volatile memory:");
    //int size = sizeof recordsOut / sizeof recordsOut[0];
    //Serial.print("Design Size:");
    //Serial.println(size);
    Serial.println("========================================");
    uint8_t i = 0;
    for (i = 0; i < MAX_RECORDS; i++)
    {
        if (recordsOut[i].id != 255) {
            delay(10);
            Serial.print("id:"); Serial.print(recordsOut[i].id);
            Serial.print(",");
            Serial.print("sec:"); Serial.print(recordsOut[i].sec);
            Serial.print(",");
            Serial.print("obj:"); Serial.print(recordsOut[i].obj);
            Serial.print(",");
            Serial.print("xs:"); Serial.print(recordsOut[i].xs);
            Serial.print(",");
            Serial.print("xe:"); Serial.print(recordsOut[i].xe);
            Serial.print(",");
            Serial.print("ye:"); Serial.print(recordsOut[i].ye);
            Serial.print(",");
            Serial.print("clr:"); Serial.print(recordsOut[i].clr);
            Serial.print(",");
            Serial.print("tsz:"); Serial.print(recordsOut[i].tsz);
            Serial.print(",");
            Serial.print("tid:"); Serial.println(recordsOut[i].tid);
        }
    }
    Serial.print(getPSTR("Old way to force String to Flash"));
    Serial.println(F("Free RAM 3 = ")); //F function does the same and is now a built in library, in IDE > 1.0.0
    Serial.println(freeMemory(), DEC); // print how much RAM is available.

    Serial.println("========================================");
}

После выполнения всего кода печати происходит перезагрузка MCU. Чтобы увидеть потребление памяти, я использую библиотеку. Но это не говорит о недостатке памяти. (или я проверяю это в неправильный момент / место?)

Вот вывод, который я получаю на последовательном мониторе:

========================================
Design data in non-volatile memory:
========================================
id:1,sec:1,obj:1,xs:1,xe:157,ye:60,clr:0,tsz:0,tid:0
id:2,sec:1,obj:2,xs:1,xe:158,ye:60,clr:2,tsz:0,tid:0
id:3,sec:1,obj:3,xs:5,xe:0,ye:0,clr:2,tsz:2,tid:1
id:4,sec:2,obj:1,xs:1,xe:158,ye:60,clr:0,tsz:0,tid:0
id:5,sec:2,obj:2,xs:1,xe:158,ye:60,clr:2,tsz:0,tid:0
id:6,sec:2,obj:3,xs:5,xe:0,ye:0,clr:2,tsz:2,tid:1
Old way to force String to FlashFree RAM 3 = 
4882
========================================

РЕДАКТИРОВАТЬ: Вот как эта функция вызывается:

void loop() {
    serialEvent(); //Listens input from serial 
    ProcessCommands(); //Process received serial commands and call functions accordingly. In our case, the function is ListDesignData().
}

Итак, как найти бутылочное горлышко и устранить эту проблему? Любой вклад приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...