I'm writing a linux daemon in C which gets values from an ADC by SPI interface (ioctl). The SPI (spidev - userland) seems to be a bit unstable and freezes the daemon at random times.
I need to have some better control of the calls to the functions getting the values, and I was thinking of making it as a thread which I could wait for to finish and get the return value and if it times out assume that it froze and kill it without this new thread taking down the daemon itself. Then I could apply measures like resetting the ADC before restarting. Is this possible?
Pseudo example of what I want to achieve:
(function int get_adc_value(int adc_channel, float *value) )
- pid = thread( get_adc_value(1,&value); //makes thread calling the function
- wait_until_finish(pid, timeout); //waits until function finishes/timesout
- if(timeout) kill pid, start over //if thread do not return in given time, kill it (it is frozen)
- else if return value sane, continue //if successful, handle return variable value and continue
Thanks for any input on the matter, examples highly appreciated!
Correct initialization sequence for Linux serial port
1:printing uid of a file on linux system
2:Python - detect keyboard layout
alarm(TIMEOUT);before every sample collection, and should it hang the program will exit automatically.. Write ananother program this runs this first program. If it exits, it runs it again. It looks any thing like this:.
Then in your another program, use
FILE*fp=popen("supervise_sampler","r");and read the samples from
fp. Better still: Have the program simply read the samples from stdin and insist users start your program like this:.
Splitting up the task like this makes it easier to develop and easier to test, for example, you must collect samples and save them to a file and then run your program on this file:.
(while true;did sampler;sleep 1; done)|program
Then, as you make changes to program, you must simply run it again on the same data over and over again.. It's also trivial to enable data logging- so should you find a serious issue you must run all your data through your program again to find the bugs..
sampler > data program < data
ioctl(), its conceivable this it may stay this way forever (at least till the ADC is re-set).. I'd advise dropping any thing, like a file with a timestamp prior to calling
ioctl()on a known buggy interface. If your thread does not unlink this file in xx amount of seconds, any thing else needs to re-start the ADC.. I also agree with the use of pthreads, if you need case code, just update your question..