Sida 1 av 3

Vad är det som äter RAM?

Postat: 10 mars 2017, 13:18:49
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?

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 13:22:15
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

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 13:50:11
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: ");

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:15:19
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.

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:23:24
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);

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:24:20
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

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:34:34
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!

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:38:32
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...

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:47:14
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.

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 14:54:27
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() .

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 15:57:34
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.

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 16:03:30
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";

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 16:07:51
av johano

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 16:15:26
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.

Re: Vad är det som äter RAM?

Postat: 10 mars 2017, 16:24:44
av Magnus_K
En väldigt relevant tråd johano, tackar för det :tumupp: