我需要驗證和表徵我們產品的CAN總線流量(稱之爲被測單元UUT)。我有一臺機器可以向我們的產品發送指定數量的罐頭框架。我們的產品正在運行基於Linux的定製內核。 CAN幀是使用特定算法在發送方機器上預先建立的軟件。 UUT使用該算法來驗證接收到的幀。 另外,這裏是我的問題所在,我試圖計算UUT軟件中的一些定時數據。所以我基本上儘可能快地做一個讀取循環。我有一個預先分配的緩衝區來存儲幀,所以我只是調用read和遞增的指針緩衝區:計算CAN總線速度
clock_gettime(clocK_PROCESS_CPUTIME_ID, timespec_start_ptr);
while ((frames_left--) > 0)
read(can_sock_fd, frame_mem_ptr++, sizeof(struct can_frame));
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, timespec_stop_ptr);
我的問題,當我計算在這兩個的區別與時代我可以做timespecs(我使用的計算是正確的,我已經驗證了它,它是GNU算法)。 此外,在時間實用程序下運行該程序與我的時代一致。例如,我的程序被稱爲tcan,因此我可能運行 [提示] $ time ./tcan can1 -nf 10000
要在具有10000個幀的can1套接字上運行。 (這是FlexCAN,基於接口的接口,BTW)
然後,我使用時間差來計算獲得的數據傳輸速度。我在時間範圍內收到了num_frames,所以我計算幀/秒和位/秒我得到的總線速度是CAN總線速度的10倍,每秒250000比特。怎麼會這樣?根據我的程序和時間程序(以及頂級實用程序),我只獲得2.5%的CPU利用率。 我計算的值是否有意義?有什麼更好的我可以做嗎?我假設,由於時間報告的實際時間比用戶+ sys大得多,因此必須在某處丟失一些時間記帳。另一種可能性是,也許這是正確的,我不知道,這是令人費解的。