Не работает программа при размере буфера 4000 байт
- Войдите на сайт для отправки комментариев
Втр, 19/08/2014 - 15:14
Не работает очень простой код, но в чем дело мне понять не удается. Если размер буфера установить в 4*100, то прогармма работает, если - 4*1000, то - нет. Буду признателен за помощь.
#define PIN_RX 2 #define INT0 0 #define BUF_SIZE 4*1000 volatile unsigned long rx_last; volatile bool listening; volatile byte data[BUF_SIZE]; volatile unsigned int capacity=BUF_SIZE; volatile unsigned int position=0; volatile unsigned int length=0; bool put(byte in) { if(length < capacity) { // save data byte at end of buffer data[(position+length) % capacity] = in; length++; return true; } return false; } // interrupt 0 void rx_int() { cli(); unsigned long rx_cur=micros(); if(listening) { word dur=word(rx_cur-rx_last); if(digitalRead(PIN_RX)==HIGH) bitClear(dur,15); // was LOW else bitSet(dur,15); // was HIGH rx_last=rx_cur; put(byte(dur)); } sei(); } void loop() { if( Serial.available() > 0 ) { char theChar = Serial.read(); switch (theChar) { case 'p': listening=false; Serial.println("Paused"); break; case 'c': listening=true; Serial.println("Continued"); break; } } } void setup() { noInterrupts(); attachInterrupt(INT0, rx_int, CHANGE); // int0, pin2 pinMode(PIN_RX, INPUT); Serial.begin(57600); listening=true; Serial.println("Listening..."); interrupts(); }
потому что нехватка ОЗУ.
О! Нашел отличную вещь для строк, которые не изменяются: F()
The F() macro tells the compiler to keep your strings in PROGMEM.
Пошел за попкорном, щас начнутся вопросы, а как их читать из прогмема
Это для Serial.print(), оно само читается. :)
А толку то. Массив из 4000 это не в каждый контроллер влезет. Потому сообщения в прогмем вряд ли помогут
Я же проиграться взял и никак не думал, что там памяти почти и нет. В принципе хватить и примерно 4*300. С F() хоть на отладочных сообщениях сэкономить можно.