Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years ago.
Unable to use mutiple tickers for my application
Hello,
I am working on Nucelo L053r8t6 custom board for one of my application. where i need to implement 5 tickers may be some times at equal intervals of time the event must work for all the tickers. But when using mutiple number of tickers happen to see only one ticker is being executed and rest of them are being ignored. I here by attch few sample snippets that i am working on. Could you please tell me the solution for the problem i am facing .
Interval at which each function to be executed
void prot_Communicate :: Sampling_Rate_Temprature(uint8_t Sampling_val) { switch(Sampling_val) { case SAMPLING_1SEC : { Temp_Sense_Update.attach(this,&prot_Communicate :: Temperature_Sensor,1); } break; case SAMPLING_2SEC : { Temp_Sense_Update.attach(this,&prot_Communicate :: Temperature_Sensor,2); } break; case SAMPLING_5SEC : { Temp_Sense_Update.attach(this,&prot_Communicate :: Temperature_Sensor,5); }
Decleration of tickers and the indication flags
Ticker Temp_Sense_Update; Ticker Humid_Sense_Update; Ticker Baro_Sense_Update; Ticker Lux_Sense_Update; bool flag_temp_sensor,flag_humid_sensor,flag_baro_sensor,flag_lux_sensor,flag_accelro_sensor;
Attching the ticker with function
void prot_Communicate :: Temperature_Sensor(void) { flag_temp_sensor = 1; } void prot_Communicate :: Humid_Sensor(void) { flag_humid_sensor = 1; } void prot_Communicate :: Baro_Sensor(void) { flag_baro_sensor = 1; } void prot_Communicate :: Lux_Sensor(void) { flag_lux_sensor = 1; }
Start the device with the given sampling rate
void prot_Communicate :: Start_Stop_logger(void) { if (f_start) { if(flag_temp_sensor) { flag_temp_sensor = 0; Temp = sht.readTemp(); fprintf(logFile,"\r\n%3.2f °C",Temp); // FloatSep(Temp,&package.Data[i],&package.Data[i+2]); // i += 4; } if(flag_humid_sensor) { flag_humid_sensor = 0; Humd = sht.readHumidity(); fprintf(logFile,"\r\n%3.2f RH", Humd); // FloatSep(Humd,&package.Data[i],&package.Data[i+2]); // i += 4; } if(flag_baro_sensor) { flag_baro_sensor = 0; // Pressure = ms.calcPressure(); //fprintf(logFile,"\r\n%.1f mB\n", Pressure); // FloatSep(Pressure,&package.Data[i],&package.Data[i+2]); // i += 4; } if(flag_lux_sensor) { flag_lux_sensor = 0; Lux = max44009.getLUXReading(); fprintf(logFile,"\r\n%f lux",Lux); // FloatSep(Lux,&package.Data[i],&package.Data[i+2]); // i += 4; }
here comes the problem that only the temprature flag is being raised but but any other flags. I have tested using keil compiler by inserting break points at required sections but found that only temparture flag is being raised but no other flags are being raised. could you please help me in this issue. I thought size would be problem in order to create object for the tickers but normally i removed everything and brought it to 42 kb code size. even though i have the same issue. I feel mostly its happening in the attach function. May be i am unclear about the syntax. could any one provide me suggestions. Thank you.
/media/uploads/sandeepmalladi/dl_ticker_test_uvision5_nucleo_l053r8.rar
1 Answer
8 years ago.
When you have variables that change in an interrupt, such as a ticker, always define them as volatile. So in this case as volatile bool.
This tells the compiler the variable may change without the compiler knowing this. So it will always get the latest version from its memory. Otherwise it optimizes part of the code away, since it doesn't understand interrupts, and assumes those variables won't change anyway. And this gives unpredictable behavior.
Hello erik,
As per the attchment that i had sent has the same concept as variables declared as votaile bool. But even after the declaration as volatile bool i got to see no improvement in the code. Jua go though the attachment and please let me know the actual problem. Thank you.
posted by 13 Oct 2016Your code is huge. And it is a bit confusing that your code does not correspond apparently to what you posted here.
My advice: Make a simple test case and see if it works. If yes, then the problem is probably not the tickers but something in your code. I was planning to see if I could figure it out for you, but setting the ticker was called by a function, which in turn was called by another function, which again was a generic switch statement (tbh there seem to be more switch statements than really needed).
Then add that the single file we are talking about already has more than 2000 lines of code. So really: Simplify your problem and we can help if you still got it. But I am not going to debug 2000 lines of code, without even having the setup to run it.
posted by 13 Oct 2016Or to put it another way: Rather than wasting peoples time do what I suggested last time you asked this question rather than reposting the exact same question a second time and getting the same answer from a second person.
posted by 14 Oct 2016Hello Erik,
I had made it simple way for you to understand how i am calling a function.
include the mbed library with this snippet
#include "mbed.h" Ticker 1 Ticker 2 Ticker 3 Ticker 4 void Function() { if(flag1) { do some work for flag 1(); } that contnious for flag 2,3 and 4 as i am using 4 tickers } //passing time duration for the tickers void function time (volatile uint8_t sampling rate) { function.attach(this,&attached function,sampling rate); // function dynamically changes the value of sampling rate attched to ticker time } void attached function() { flag 1 = 1; }
The problem i am facing is that I am able to get an interrupt for only 2 tickers.but there is no interrupt generated from other 2.
But i am able generate interrupt for all the 4 tickers if i do in this method by calling initialize function before main.
Tickers works if i initialize it first before main
#include "mbed.h" void init() { function.attach(this,&attached function,1); // Ticker1 function.attach(this,&attached function,2); // Ticker2 } void main() { }
if i do this way i am able to get interrupt generated. I have no idea what would be the reason for this kind of strange behavior it makes no sense for me if i would like to change time value dynamically from the user input. As per Andy suggestion i had removed unnecessary code and made to 39Kb size but there was no improvement. can any one know how to pass the time value dynamically from the user input. Sorry andy but unfortunately i had clicked the option assign so i felt other people suggestions are also more important for me thats the only reason why i have to repost.
posted by 15 Oct 2016
kk
posted by san m 15 Oct 2016