Vad är det som äter RAM?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Vad är det som äter RAM?

Inlägg av Magnus_K »

Kompilerade precis ett program som jag suttit med ett tag och fick nu dessa varningar:

Kod: Markera allt

 
Available RAM: 240 [bytes], Available ROM: 4096 [bytes]  
Compilation Started 690_SPI_converter.c
Generated baud rate is 9615 bps (error = 0.16 percent) 690_SPI_converter.c
Implicit conversion of int to ptr 690_SPI_converter.c
...
Implicit conversion of int to ptr 690_SPI_converter.c
Compiled Successfully 690_SPI_converter.c
All files Compiled in 63 ms  
Not enough RAM '?lstr3_690_SPI_converter' 690_SPI_converter.c
Not enough RAM '?lstr8_690_SPI_converter' 690_SPI_converter.c
Not enough RAM '?lstr7_690_SPI_converter' 690_SPI_converter.c
Not enough RAM '?lstr9_690_SPI_converter' 690_SPI_converter.c
Not enough RAM 'buffer_receive' 690_SPI_converter.c
Not enough RAM 'buffer_send' 690_SPI_converter.c
Finished (with errors): 10 mar 2017, 13:10:27 690_SPI_converter.mcppi
Det dom verkar peka på är dessa två:

Kod: Markera allt

unsigned short buffer_send[63];
unsigned short buffer_receive[63];
Är det någon som kan förklara varför? Om inte, kan jag fylla i med mer information för att kunna få frågan besvarad?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Vad är det som äter RAM?

Inlägg av johano »

Japp, dina arrayer kommer allokeras i RAM.
En short är förmodligen 2bytes så det blir 252bytes allokerat.

Behöver du verkligen använda 'short' om det bara är tecken? Kanske 'char' hade räckt, då spar
du 126bytes.

/j
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Vad är det som äter RAM?

Inlägg av Magnus_K »

Även om jag deklarerar dessa två arrayer som unsigned char så blir det samma kompilatorfel.

Markerar jag bort nedan kodrader så får jag bara ett fel. Det verkar verkligen som att jag överfyller RAM:et. Men vad har jag att välja på?

Kod: Markera allt

       UART1_Write_Text("WELCOME TO CC1101 PROGRAMMING INTERFACE\n\n");
       UART1_Write_Text("Enter desired action. Possible commands are:\n");
       UART1_Write_Text("       INFO - Returns partnumber from connected CC1101\n");
       UART1_Write_Text("       STATUS - Returns current status of the connected CC1101\n");
       UART1_Write_Text("       SEND_BYTE - Allows you to send single byte to specific register\n");
       UART1_Write_Text("       SEND_BURST - Allows you to send burst data to a span of registers\n\n");
       UART1_Write_Text("Command: ");
Zeela
Inlägg: 176
Blev medlem: 28 augusti 2008, 11:23:49
Ort: Åtvidaberg
Kontakt:

Re: Vad är det som äter RAM?

Inlägg av Zeela »

Vad kör du för platform?

Borde gå att lägga strängarna i Flash, PROGMEM eller nåt annat liknande så de inte ligger i RAM.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Vad är det som äter RAM?

Inlägg av Icecap »

Testa:

Kod: Markera allt

const unsigned char* Text_Welcome = "WELCOME TO CC1101 PROGRAMMING INTERFACE\n\n";
const unsigned char* Text_Desired = "Enter desired action. Possible commands are:\n";
const unsigned char* Text_info = "       INFO - Returns partnumber from connected CC1101\n";
const unsigned char* Text_Status = "       STATUS - Returns current status of the connected CC1101\n";
const unsigned char* Text_Send_Byte = "       SEND_BYTE - Allows you to send single byte to specific register\n";
const unsigned char* Text_Send_Burst = "       SEND_BURST - Allows you to send burst data to a span of registers\n\n";
const unsigned char* Text_Command = "Command: ");

UART1_Write_Text(Text_Welcome);
UART1_Write_Text(Text_Desired);
UART1_Write_Text(Text_Info);
UART1_Write_Text(Text_Status);
UART1_Write_Text(Text_Send_Byte);
UART1_Write_Text(Text_Send_Burst);
UART1_Write_Text(Text_Command);
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Vad är det som äter RAM?

Inlägg av johano »

Din plattform verkar helt klart tycka att short ska lagras i en byte så det är inte konstigt att det inte gav någon skillnad.

Men, detta med strängkonstanter som bara ska skrivas ut: i AVR GCC kan man välja att lägga slikt i _flash_minnet istället för i RAM, det spar en hel del.

Kan se ut t.ex. såhär:

Kod: Markera allt


void send_string( const char* s )
{
	for(unsigned char b=pgm_read_byte(s); b; b=pgm_read_byte(++s))
		send_byte(b);
}

...
send_string(PSTR("*** Eurofire Control 1.0 ***"));

Det är alltså makrot PSTR() som placerar strängkonstanten i _flash_ istället och inte i RAM. Sedan läser ut man ut den, byte för byte (i en loop ;-) ) med pgm_read_byte().

Jag förmodar att man kan göra något liknande i din kompilator?!

Edit: lite sen på den, såg inte de andra svaren innan.

/j
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Vad är det som äter RAM?

Inlägg av Magnus_K »

Tack så hemskt mycket för svaren! Det blir en bra lärdom det här som jag aldrig tänkt på innan.

Ska testa era förslag i kväll och återkomma!
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Vad är det som äter RAM?

Inlägg av sodjan »

Som referens kan noteras att XC8 anger:

Kod: Markera allt

signed char     8 Signed integer
unsigned char   8 Unsigned integer
signed short   16 Signed integer
unsigned short 16 Unsigned integer
Om det finns en "unsigned char" i MikroC så kan den vara
bättre med tanke på eventuell portning senare till XC8.
Och koden blir mer "standard" för alla andra...
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Vad är det som äter RAM?

Inlägg av lillahuset »

Sedan finns ju möjligheten att använda int8_t, uint8_t, int16_t, uint16_t osv så blir det helt uppenbart vad man menar.
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Vad är det som äter RAM?

Inlägg av Wedge »

johano skrev:Det är alltså makrot PSTR() som ..... något liknande i din kompilator?!
För den som sitter med Arduino är det F() .
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Vad är det som äter RAM?

Inlägg av Magnus_K »

Hmm plattform? Jag använder MikroC Pro for PIC som program och den har en inbyggd kompilator. MCU:n är en PIC16F690.

Testade enligt din version Icecap men får felet Illegal pointer conversion på varje rad som ser ut som UART1_Write_Text(Text_Welcome);.
Vet inte vad det kan vara men ska söka lite på det. Får dock ingen som helst antydan till att jag håller på att få slut på RAM.

Har för mig att constants sparas i ROM i stället för RAM, och ROM har jag nog gott om.

Ska se om jag hittar något bra i hjälpfilen om att spara i flash.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Vad är det som äter RAM?

Inlägg av Icecap »

Jag har inte kollat det jag skrev men det fungerar normalt.

Testa istället:
const unsigned char Text_Welcome[] = "WELCOME TO CC1101 PROGRAMMING INTERFACE\n\n";
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Vad är det som äter RAM?

Inlägg av johano »

Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Vad är det som äter RAM?

Inlägg av Magnus_K »

Nu är varnar den i stället för Suspicious pointer conversion och forsätter varna för RAM:et. Det är nog andra saker som orsakar varningen än dessa strängar.

Äsch, får nog tänka om med hela programmet. Försökte göra ett användarvänligt gränssnitt men fixar nog inte det med mina kunskaper.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Vad är det som äter RAM?

Inlägg av Magnus_K »

En väldigt relevant tråd johano, tackar för det :tumupp:
Skriv svar