我正在写C语言的Linux守护进程,它通过SPI接口(ioctl)从ADC获取值。 SPI(spidev – userland)似乎有点不稳定,随机冻结守护进程。
我需要对获取值的函数的调用有更好的控制,而且我正在考虑把它作为一个线程,我可以等待完成并获得返回值,如果超时,假设它冻结并且终止它没有这个新线程取下守护进程本身。 然后,我可以在重新启动之前应用重置ADC等措施。 这可能吗?
我想要实现的伪示例:
(函数int get_adc_value(int adc_channel,float * value) )
感谢您对此事的任何意见,例如高度赞赏!
我会尝试使用pthreads库。 我已经用它为我的一些C项目取得了很好的成功,它可以很好地控制什么在运行,什么时候运行。
一个很好的教程可以在这里找到: http : //www.yolinux.com/TUTORIAL/LinuxTutorialPosixThreads.html
在glib中,使用GCond来检查线程也是一种方法(在glib帮助中查找它)。
在简历中,你应该定期在子线程中设置一个GCond,并用g_cond_timed_wait在主线程中检查它。 这与glib或pthread是一样的。
下面是一个pthread的例子: http : //koders.com/c/fidA03D565734AE2AD9F5B42AFC740B9C17D75A33E3.aspx? s=% 22pthread_cond_timedwait%22#L46
我会推荐一个不同的方法。
编写一个程序,将采样写入标准输出。 它只需要有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
然后,当您对程序进行更改时,您可以简单地重复运行同一个数据。
启用数据记录也是微不足道的 – 所以如果你发现一个严重的问题,你可以通过你的程序再次运行你的所有数据来查找错误。
当一个线程执行一个ioctl()时,会发生一些非常有趣的事情,它会进入一种非常特殊的睡眠模式,称为磁盘睡眠模式 ,直到调用返回时才会被打断或中止。 这是通过设计来防止内核从内而外腐烂。
如果你的守护进程卡在 ioctl()
,可以想象它可能永远保持这种状态(至少在ADC被重新设置之前)。
我建议在调用已知的越野界面上的ioctl()
之前 , 先删除一些东西,比如带有时间戳的文件。 如果你的线程没有在xx秒的时间内断开这个文件的链接,那么其他的东西需要重新启动ADC。
我也同意使用pthreads,如果你需要示例代码,只需更新你的问题。