2012-12-07 2 views
0

우리 제품의 CAN 버스 트래픽을 검증하고 특성화해야합니다 (UUT (Unit Under Test)라고 함). 나는 우리 제품에 지정된 수의 캔 프레임을 보내는 기계를 가지고있다. 우리 제품은 Linux 기반 사용자 정의 커널을 실행 중입니다. CAN 프레임은 특정 알고리즘을 사용하여 보낸 사람 컴퓨터의 소프트웨어로 미리 빌드됩니다. UUT는 알고리즘을 사용하여 수신 된 프레임을 검증합니다. 또한 여기서 나의 질문이 거짓말입니다. UUT 소프트웨어에서 타이밍 데이터를 계산하려고합니다. 그래서 기본적으로 가능한 한 빨리 읽기 루프를 수행합니다. 나는 프레임을 저장하는 사전 할당 된 버퍼를 가지고, 그래서 난 그냥 읽고 전화 버퍼에 포인터를 증가 :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이므로 [prompt] $ time ./tcan can1 -nf 10000

can1001 프레임의 can1 소켓에서 실행할 수 있습니다. (FlexCAN, 소켓 기반 인터페이스, BTW)

그런 다음 시간차를 사용하여 얻은 데이터 전송 속도를 계산합니다. 시간 범위에서 num_frames를 받았습니다. 따라서 초당 프레임 수와 비트 수를 계산합니다.

CAN 버스 속도가 초당 250000 비트의 10 배인 버스 속도를 얻고 있습니다. 어떻게 이럴 수있어? 내 프로그램과 시간 프로그램 (및 최고 유틸리티뿐만 아니라)에 따라 2.5 %의 CPU 사용률을 얻습니다. 나는 의미있는 값을 계산하고 있습니까? 내가 할 수있는 일이 더 있니? 나는 시간이보고 된 이후 실제 시간이 user + sys보다 훨씬 더 큽니다. 어딘가에 시간 손실이 있어야합니다. 또 다른 가능성은 아마도 그것이 맞을지 모른다는 것입니다. 잘 모르겠습니다. 수수께끼입니다.

답변

0

이것은 아주 길지만, read()가 일찍 돌아 오는 경우 들어오는 데이터를 기다려야 할 것이기 때문에 어떻게해야합니까? 읽을 가장 빠른 데이터는 전혀 없습니다.

타이밍을 망칠 수는 있지만 오류 검사 중에이 루프를 시도해 보셨습니까? 또는 recv()를 통해 루프를 구현하십시오. 요청하지 않은 경우 차단해야합니다.

이 정보가 도움이되기를 바랍니다.