Somewhere in the build chain unused code is pruned and I believe it happens on a function by function basis. So, if your usage is different in each app different code may be generated.
I remember being tripped up by this a couple times.... MS Eric Decker wrote: > Hi Anna, > > Kind of hard to understand from staring at what you've provided. > > Something that might help would be to examine the resultant output of nesc. > > This is the app.c file that will be in the build directory > build/<platform>/app.c > > Something else that might also help you track this down is to look at > the symbol table. > > This will show where all the routines have been placed in memory. For > the msp430 based processors > I use msp430-nm. Other processors will have something similar. > > > 2011/3/24 Anna Förster <[email protected] > <mailto:[email protected]>> > > 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 <tel:%2B%2041%2058%20666%206597> > http://www.dti.supsi.ch/~afoerste/ > > > _______________________________________________ > Tinyos-help mailing list > [email protected] > <mailto:[email protected]> > https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help > > > > > -- > Eric B. Decker > Senior (over 50 :-) Researcher > > > > ------------------------------------------------------------------------ > > _______________________________________________ > Tinyos-help mailing list > [email protected] > https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help _______________________________________________ Tinyos-help mailing list [email protected] https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
