Hi all, thanks for the suggestions! However, even the tip from below did not really work: the compiler accepted the fnesc-no-inline, but not the O0 parameter. After compilatio with no inline, the differences remained.
Anna On 25.03.2011, at 05:10, Vinai Sundaram wrote: > I think the size of the executable depends on how you used the logging > component in your TOS applications. The reasons are nesC compiler does > aggressive inlining and by default, TinyOS build system optimizes for > code size (-Os is passed to C compiler). > > You can try turning off inlining and optimization for code size. Also, > make sure the component is used in the same way in both TOS > applications. > > To turn off inlining, pass -fnesc-no-inline to nesc compiler and -O0 > to C compiler. I guess both can be done by adding them to PFLAGS in > your make file like below. > PFLAGS += -fnesc-no-inline -O0 > > It will be interesting if the memory sizes still vary. > > Hope this helps, > Vinai > -- > Vinai Sundaram > Graduate Research Assistant > School of Electrical and Computer Engineering > Purdue University West Lafayette IN USA > Web: http://www.ece.purdue.edu/~vsundar/ > > > 2011/3/24 Anna Förster <anna.foers...@supsi.ch>: >> Dear all, >> >> we have been facing a weird problem with memory consumption after >> compilation. The basic trouble is that including the same piece of software >> into different TOS applications results in different increases of memory >> consumption (as shown after compilation). We would like to understand where >> these differences come from and why and would be very grateful for some >> explanation/ideas/discussion. Details about our code follow below. >> >> The code in question is a combination of TOS components and nesc code, which >> enables logging some data on the flash in a simple format and printing it >> out to the serila interface. When including it into two different >> applications, we get different increases in the memory consumption: in one >> case +7816/+362 (ROM/RAM) and in the other case it is only +6218/+322 >> (ROM/RAM). >> >> The implementation is realized as to be dependant on a #define statement of >> LOG_ENABLED. Again, the included code and header files are EXACTLY the same >> for both applications. My first guess would be that there is some kind of an >> optimization among TOS components. However, the used TOS components in both >> applications are IDENTICAL too. The difference is in the implementation >> itself in the BlaC.nc files only. >> >> Let me know if you need also teh full code for both applications. We are >> very thankful for any ideas or explanations! >> >> The implementation is the following: >> >> ************************* >> in BlaAppC.nc: >> ************************* >> implementation { >> >> ... >> >> #ifdef LOG_ENABLED >> components SerialActiveMessageC; >> components new SerialAMSenderC(AM_FLEXOR_LOG); >> App.SerialAMControl -> SerialActiveMessageC; >> App.SerialDataLogPacket -> SerialAMSenderC.Packet; >> App.SerialDataLogAMPacket-> SerialAMSenderC.AMPacket; >> App.SerialDataLogAMSend -> SerialAMSenderC.AMSend; >> components new LogStorageC(VOLUME_LOGTEST, FALSE) as DataLogStorageC; >> App.DataLogRead -> DataLogStorageC.LogRead; >> App.DataLogWrite -> DataLogStorageC.LogWrite; >> #endif >> >> ... >> } >> >> ************************* >> in BlaC.nc: >> ************************* >> #include "log.h" >> >> ************************* >> in log.h: >> ************************* >> #ifndef FLEXOR_LOG >> #define FLEXOR_LOG >> >> //Log struct for reading >> typedef struct flexor_log_struct { >> uint32_t dataToLog; >> uint32_t timeStamp; >> uint16_t dataType; >> } flexor_log_struct_t; >> >> >> flexor_log_struct_t readlog_data; >> >> #ifdef LOG_ENABLED >> >> #define LOG_WRITE_BUFFER_SIZE 10 >> >> bool log_busy=FALSE; >> bool append_busy=FALSE; >> bool read_scheduled=FALSE; >> bool erase_scheduled=FALSE; >> bool serial_busy; >> >> message_t log_tos_data; >> >> // Log buffer for to store the incoming log if log write is busy >> flexor_log_struct_t log_buffer[LOG_WRITE_BUFFER_SIZE]; >> >> //index for tracking the buffer for writing the log >> uint8_t buffer_index; >> >> // tasks for the log read, erase and transmission of the data log read >> task void transmitLogData(); >> task void readLogData(); >> task void eraseLogData(); >> >> void flexor_log_init() >> { >> >> log_busy=FALSE; >> append_busy=FALSE; >> read_scheduled=FALSE; >> erase_scheduled=FALSE; >> buffer_index=0; >> } >> >> task void readLogData() >> { >> bool status; >> if(!log_busy) >> { >> status = call >> DataLogRead.read(&readlog_data,sizeof(flexor_log_struct_t)); >> if(status == SUCCESS) >> { >> log_busy=TRUE; >> atomic printf("Read Log \n"); >> } >> else >> { >> // if log is being written then again post >> reading the log as a task so that it will execute for sure >> post readLogData(); >> } >> } >> else >> { >> read_scheduled=TRUE; >> printf("Read Scheduled\n"); >> } >> atomic printfflush(); >> } >> task void eraseLogData() >> { >> if(!log_busy) >> { >> >> if(call DataLogWrite.erase()==SUCCESS) >> { >> log_busy=TRUE; >> printf("Erasing Log\n"); >> } >> else >> { >> printf("Error Erasing the Data Log\n"); >> post eraseLogData(); >> } >> } >> else >> { >> erase_scheduled=TRUE; >> printf("Erase Scheduled\n"); >> } >> atomic printfflush(); >> } >> >> /* DATA LOG TRANSMISSION*/ >> >> task void transmitLogData() >> { >> >> flexor_log_struct_t* log_data = (flexor_log_struct_t*)(call >> SerialDataLogPacket.getPayload(&log_tos_data, >> (sizeof(flexor_log_struct_t)))); >> bool status; >> >> /***copying the read log data into the log_data t transmit to >> the serial port****/ >> memcpy(log_data, &readlog_data,(sizeof(flexor_log_struct_t))); >> >> // sending the log data to the serial port >> status = call >> SerialDataLogAMSend.send(AM_BROADCAST_ADDR,&log_tos_data, >> sizeof(flexor_log_struct_t)); >> if(status == SUCCESS) >> { >> serial_busy = TRUE; >> //printf("log transmit \n"); >> } >> else if(status == EBUSY) >> { >> //printf("Network is Busy"); >> post transmitLogData(); >> } >> >> //printfflush(); >> >> } >> #endif >> >> /** END OF DATA LOG TRANSMISSION**/ >> void flexor_write_log(flexor_log_struct_t* writelog_data) >> { >> #ifdef LOG_ENABLED >> bool status; >> if(!append_busy) >> { >> if(buffer_index<LOG_WRITE_BUFFER_SIZE) >> { >> atomic printf("buf writing\n"); >> >> memcpy(&log_buffer[buffer_index],writelog_data,sizeof(flexor_log_struct_t)); >> buffer_index++; >> } >> } >> else >> { >> // do noting and drop the packet >> } >> >> if((buffer_index==LOG_WRITE_BUFFER_SIZE)&&(!log_busy)) >> { >> /***** writing the data to the log storge of >> mote*****/ >> atomic printf("buf full\n"); >> status = call >> DataLogWrite.append(&log_buffer,(LOG_WRITE_BUFFER_SIZE*sizeof(flexor_log_struct_t))); >> if(status == SUCCESS) >> { >> append_busy=TRUE; >> log_busy=TRUE; >> buffer_index=0; >> } >> >> } >> atomic printfflush(); >> #endif >> } >> >> void flexor_read_log() >> { >> #ifdef LOG_ENABLED >> post readLogData(); >> #endif >> } >> >> void flexor_erase_log() >> { >> #ifdef LOG_ENABLED >> post eraseLogData(); >> #endif >> } >> >> >> /******************************************************************************** >> EVENTS GENERATED BY LOG READ WRITE AND ERASE FUNCTIONS >> >> *******************************************************************************/ >> #ifdef LOG_ENABLED >> event void DataLogWrite.appendDone(void* buf, storage_len_t len,bool >> recordsLost, error_t err) >> { >> if(err == SUCCESS) >> { >> append_busy=FALSE; >> log_busy=TRUE; >> call DataLogWrite.sync(); >> atomic printf("Data Written Success\n"); >> } >> else >> { >> printf("Error Appending the Log\n"); >> append_busy=FALSE; >> log_busy=FALSE; >> >> } >> atomic printfflush(); >> } >> >> event void DataLogRead.readDone(void* buf,storage_len_t len,error_t >> err) >> { >> if((len == sizeof(flexor_log_struct_t)) && (buf == >> &readlog_data)) >> { >> /*sending the log data*/ >> atomic printf("Transmit data\n"); >> log_busy=TRUE; >> post transmitLogData(); >> } >> else >> { >> log_busy=FALSE; >> read_scheduled=FALSE; >> if(len==0) >> { >> atomic printf("End of Reading the Log\n"); >> if(erase_scheduled) >> { >> post eraseLogData(); >> } >> } >> >> } >> atomic printfflush(); >> } >> event void DataLogWrite.eraseDone(error_t err) { >> if (err == SUCCESS) >> { >> log_busy=FALSE; >> erase_scheduled=FALSE; >> atomic printf("Log Erased\n"); >> if(read_scheduled) >> post readLogData(); >> } >> >> atomic printfflush(); >> } >> >> >> event void DataLogRead.seekDone(error_t err) { >> } >> >> event void DataLogWrite.syncDone(error_t err) { >> log_busy=FALSE; >> append_busy=FALSE; >> atomic printf("sync done"); >> if(read_scheduled) >> post readLogData(); >> else if (erase_scheduled) >> post eraseLogData(); >> atomic printfflush(); >> } >> >> >> /******************************************************************************** >> END OF EVENTS GENERATED BY LOG READ WRITE AND ERASE FUNCTIONS >> >> *******************************************************************************/ >> /*#else >> >> void flexor_read_log() >> {} >> >> void flexor_erase_log() >> {} >> >> void flexor_write_log(flexor_log_struct_t* writelog_data) >> {} >> >> #endif*/ >> >> >> /**************** SERIAL AM CONTROL START AND STOP >> DONE***************/ >> >> event void SerialAMControl.startDone(error_t error) >> { >> >> } >> >> event void SerialAMControl.stopDone(error_t error) >> { >> >> } >> >> /***** SERIAL DATA SEND DONE ******/ >> >> //#ifdef LOG_ENABLED >> event void SerialDataLogAMSend.sendDone(message_t* msg, error_t error) >> { >> if(&log_tos_data == msg) >> { >> serial_busy = FALSE; >> //printf("Log Data Message Sent Successfully \n"); >> call SerialDataLogPacket.clear(msg); >> if(call >> DataLogRead.read(&readlog_data,sizeof(flexor_log_struct_t)) != SUCCESS ) >> { >> //printf("Error Reading the Log\n"); >> } >> else >> { >> read_scheduled=FALSE; >> log_busy=FALSE; >> } >> } >> //printfflush(); >> } >> //#endif >> >> >> >> /******************************************************************************** >> END OF LOG READ WRITE AND ERASE FUNCTIONS >> >> >> *******************************************************************************/ >> #endif >> #endif >> >> >> -- >> Dr. Anna Förster >> PostDoctoral Researcher >> Networking Laboratory, SUPSI >> Via Cantonale, Galleria 2 >> Manno, Switzerland >> Tel. + 41 58 666 6597 >> http://www.dti.supsi.ch/~afoerste/ >> >> >> _______________________________________________ >> Tinyos-help mailing list >> Tinyos-help@millennium.berkeley.edu >> https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help >> -- Dr. Anna Förster PostDoctoral Researcher Networking Laboratory, SUPSI Via Cantonale, Galleria 2 Manno, Switzerland Tel. + 41 58 666 6597 http://www.dti.supsi.ch/~afoerste/ _______________________________________________ Tinyos-help mailing list Tinyos-help@millennium.berkeley.edu https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help