Не работает программа при размере буфера 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() хоть на отладочных сообщениях сэкономить можно.