所以我有一個嵌入式Linux設備,通過串口連接到電機控制器。我正在編寫一個接口庫,它使得其他程序會調用很多很好的通用函數。其中一個是運行程序,它是目前控制器的閃存盤上的功能:最好的方法來寫一個超時的功能(posix C)
int run_motor_program(int serial_fd, char *label, timeout);
此函數的一般僞代碼是:
call write(serial_fd, "start program at `label`")
perform a couple read()'s/write()'s to check whether program has started on the motor controller
do
/* some stuff */
while(program is running AND timeout hasn't exceeded)
If the timeout exceeded, kill motor and return timeout error
在上述函數的定義的超時被用於在馬達控制器上運行程序時出現問題。如果電機控制器卡在比預期更長的迴路中,我需要停止編程的能力。
的唯一途徑,我知道保持超時的軌跡是:
1)調用函數gettimeofday()之前和在循環過程,看是否經過時間是在調用
2通電>超時值) clock_gettime()基本上與1相同。
3)在循環中使用timer_create()和timer_getoverrun()來檢查時間是否已經過去(這似乎是最優雅的解決方案,但是我似乎無法獲得timer_getoverrun()與SIGEV_NONE [我不想使用信號])。
其中哪些(或者如果有人有任何其他建議)是處理函數中包含超時的最佳方法?我真的只需要分辨率達到毫秒。
選項1是我的想法。`gettimeofday()`和`time()`的問題是,如果我(或NTP)在我的函數被調用時改變了系統時間,它將隨着超時而改變。對於這個函數,`select()`沒有幫助,因爲我沒有在串口文件描述符上等待數據。 – Ryan 2011-02-16 03:46:48