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
printing uid of a file on linux system
How to handle key pressed in a Linux console in C?
I have used it for some of my c projects with good success and it gives you pretty good control over what is running and when..
simulating atm communication without atm switch
A pretty good tutorial can be found here: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html.
Can I run original MS.Net Framework 4 on Linux someway (with Wine perhaps)?
Garbage data from serial port
Why setupterm terminates the program?
Python - detect keyboard layout
It's the same with the glib or the pthread.. Here is an example with the pthread: http://koders.com/c/fidA03D565734AE2AD9F5B42AFC740B9C17D75A33E3.aspx?s=%22pthread_cond_timedwait%22#L46.
It simply need have
alarm(TIMEOUT);before every sample collection, and should it hang the program will exit automatically.. Write another program that runs that first program.
If it exits, it runs it again.
It looks something like this:.
Then in your other program, use
FILE*fp=popen("supervise_sampler","r");and read the samples from
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 can collect samples and save them to a file and then run your program on that file:.
(while true;do sampler;sleep 1; done)|program
Then, as you make changes to program, you can 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 can run all your data through your program again to find the bugs..
sampler > data program < data
This is by design and prevents the kernel from rotting from the inside out.. If your daemon is getting stuck in
ioctl(), its conceivable that it may stay that way forever (at least till the ADC is re-set).. I'd advise dropping something, like a file with a timestamp prior to calling
ioctl()on a known buggy interface.
If your thread does not unlink that file in xx amount of seconds, something else needs to re-start the ADC.. I also agree with the use of pthreads, if you need example code, just update your question..