2010-05-13 54 views
3

我正在写一个Linux守护进程的C从SPI接口(ioctl)从ADC获取值。 SPI(spidev - userland)似乎有点不稳定,并随机冻结守护进程。作为线程调用的C函数 - Linux的用户空间程序

我需要更好地控制对获取值的函数的调用,并且我正在考虑将它作为一个线程,我可以等待完成并获取返回值,如果超时假设如果没有这个新线程取下守护进程本身,它会冻结并杀死它。然后,我可以在重新启动之前应用重置ADC等措施。这可能吗?

伪我想要实现例如:

(功能INT get_adc_value(INT adc_channel,浮子*值)

  1. PID =螺纹(get_adc_value(1,&值); //使线程调用函数
  2. wait_until_finish(pid,timeout); //等待函数结束/超时
  3. if(timeout)kill pid,重新开始//如果线程不返回在给定的时间,杀死它(是冻)
  4. 否则,如果返回值神志清醒,继续//如果成功,处理返回变量值,然后继续

感谢对此事发表任何输入,例子不胜感激!

回答

2

我会试着看看使用pthreads库。我用它为我的一些C项目取得了很好的成功,它可以很好地控制正在运行的和正在运行的项目。

一个不错的教程可以在这里找到: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

+0

感谢您的快速回答。我想也许pthread_cond_timedwait条件可以做到这一点 - 需要编写一些测试代码,看看它是如何工作的 – Einar 2010-05-13 23:24:03

0

我推荐了不同的方法。

编写一个取样并将它们写入标准输出的程序。在每个样本采集之前,它只需要有alarm(TIMEOUT);,如果它挂起,程序将自动退出。

写另一个运行第一个程序的程序。如果退出,它会再次运行。它看起来是这样的:

main(){for(;;){system("sampler");sleep(1);}} 

然后在你的其他程序,使用FILE*fp=popen("supervise_sampler","r");fp读取样本。更妙的是:有计划仅仅是阅读从标准样品和坚持用户开始你的程序是这样的:

(while true;do sampler;sleep 1; done)|program 

分裂这样的任务,使得它更容易开发和更容易测试,例如,你可以收集样本并将它们保存到一个文件,然后在该文件上运行您的程序:

sampler > data 
program < data 

然后,当你修改程序,可以再次在相同的数据一遍又一遍运行。

启用数据记录功能也很简单 - 所以如果您发现一个严重问题,您可以通过程序再次运行所有数据以查找错误。

0

一个有意思的东西发生时,执行一个ioctl(线程),它进入一个非常特殊的睡眠被称为磁盘睡眠地方在呼叫返回之前不能中断或被杀。这是通过设计,并防止内核从内而外腐烂。

如果你的守护进程在ioctl(),其可以想象陷入,它可能永远留这种方式(至少直到ADC重新设置)。

我会建议使用时间戳之前下探的东西,就像一个文件调用一个已知的马车接口上ioctl()。如果你的线程没有而不是在xx秒的时间内取消该文件的链接,则需要重新启动ADC。

我也同意使用pthreads,如果你需要示例代码,只需更新你的问题。