У меня есть заказная печатная плата, вмещающая 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().
}
Итак, как найти бутылочное горлышко и устранить эту проблему?
Любой вклад приветствуется.