2010-05-13 55 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,如果你需要示例代碼,只需更新你的問題。