Piszę sobie programik, który wykonuje różne czynności i wysyła komunikaty do komputera przez UART, które mają być pokazane na terminalu. Problem polega na tym, że dość szybko wyczerpała mi się pamięć RAM. Po sprawdzeniu co w tym RAMie siedzi odkryłem, że wszystkie napisy zapisywane są właśnie w RAMie a nie pamięci flash. Jak zrobić, żeby program czytał napisy z flasha a nie z RAMu?
Przykładowa funkcja, która sprawdza stan łącza I2C:
Jak widać, napisów jest całkiem sporo, więc RAM szybko się kończy.
Zamieszczam jeszcze funkcje do wysyłania napisów przez UART, może tu jest jakiś błąd?
Przykładowa funkcja, która sprawdza stan łącza I2C:
void i2c_status(void) {
uart_write_txt("\t\tTWSR=0x");
switch(TWSR) {
case 0x08:
uart_write_txt("08 START out");
break;
case 0x10:
uart_write_txt("10 RE-START out");
break;
case 0x18:
uart_write_txt("18 SLA+W out, ACK in");
break;
case 0x20:
uart_write_txt("20 SLA+W out, NACK in");
break;
case 0x28:
uart_write_txt("28 Data out, ACK in");
break;
case 0x30:
uart_write_txt("30 Data out, NACK in");
break;
case 0x38:
uart_write_txt("38 Arbitration lost");
break;
case 0x40:
uart_write_txt("40 SLA+R out, ACK in");
break;
case 0x48:
uart_write_txt("48 SLA+R out, NACK in");
break;
case 0x50:
uart_write_txt("50 Data in, ACK out");
break;
case 0x58:
uart_write_txt("58 Data in, NACK out");
break;
default:
uart_write_hex(TWSR);
uart_write_txt(" Unknown code");
break;
}
uart_write_txt("\n\r");
}Jak widać, napisów jest całkiem sporo, więc RAM szybko się kończy.
Zamieszczam jeszcze funkcje do wysyłania napisów przez UART, może tu jest jakiś błąd?
void uart_write(uint8_t data) {
while(!(UCSRA & (1<<UDRE)));
UDR = data;
}
void uart_write_txt(char * data) {
while(*data) uart_write(*data++);
}