2010-05-13 5 views
3

저는 C에서 리눅스에서 SPI 인터페이스 (ioctl)로 값을 얻는 데몬을 쓰고 있습니다. SPI (spidev-userland)는 약간 불안정한 것으로 보이며 임의의 시간에 데몬을 정지시킵니다.C 함수가 스레드로 호출 됨 - 리눅스 유저 랜드 프로그램

값을 가져 오는 함수에 대한 호출을 좀 더 잘 제어 할 필요가 있습니다. 그리고 그 값을 얻기 위해 기다릴 수있는 스레드로 생각하고있었습니다. 그것은 새로운 스레드가 데몬 자체를 제거하지 않고 그것을 동결시키고 죽입니다. 그런 다음 다시 시작하기 전에 ADC를 재설정하는 것과 같은 조치를 적용 할 수 있습니다. 이것이 가능한가?

I를 달성하기 위해 원하는의 의사 예 :

(함수 INT의 get_adc_value (INT의 adc_channel 플로트 * 값)) PID = 스레드

  1. (get_adc_value (1 & 값); // 스레드가 함수를 호출하도록합니다.
  2. wait_until_finish (pid, timeout); // 함수가 끝날 때까지 대기/시간 초과
  3. if (timeout) kill pid, start over // 스레드가 반환되지 않는 경우 // 주어진 시간에, 변수 값을 반환하고, 문제에 대한 모든 입력에 대한

감사를 계속 처리, 다른 반환 값 제정신 경우

  • 은, // 성공하면 계속 (이 얼어)을 죽이고, 예를 들면 매우 감사!

  • 답변

    2

    나는 pthreads 라이브러리를 사용해 보려고합니다. 좋은 프로젝트를 위해 내 C 프로젝트 중 일부를 위해 사용했으며, 실행중인 시간과 실행 시간을 상당히 잘 제어합니다.

    꽤 좋은 튜토리얼

    는 여기에서 찾을 수 있습니다 : http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

    +0

    빠른 답변 감사드립니다. 아마도 pthread_cond_timedwait 조건이 트릭을 수행 할 수 있다고 생각합니다. 작동 방식을 확인하기 위해 일부 테스트 코드를 작성해야합니다. – Einar

    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 
    

    그런 다음 프로그램을 변경할로, 당신은 단순히 반복해서 같은 데이터를 다시 실행할 수 있습니다.

    데이터 로깅을 사용하는 것도 쉬운 일이 아니므로 심각한 문제를 발견하면 프로그램을 통해 모든 데이터를 다시 실행하여 버그를 찾아야합니다.

    1

    glib에는 GCond를 사용하여 스레드를 검사하는 방법이 있습니다 (glib 도움말에서 찾아보십시오).

    이력서에는 주기적으로 자식 스레드에서 GCond를 설정하고 g_cond_timed_wait으로 주 스레드에서 확인해야합니다. 그것은 glib 또는 pthread와 동일합니다. 여기

    는 pthread 같은 예는 다음과 같습니다 http://koders.com/c/fidA03D565734AE2AD9F5B42AFC740B9C17D75A33E3.aspx?s=%22pthread_cond_timedwait%22#L46

    0

    뭔가 매우 흥미로운 그것이 IOCTL을 (실행 스레드에 발생), 그것은 디스크 수면을로 알려진 수면의 아주 특별한 종류로 전환 호출이 반환 될 때까지 중단되거나 죽을 수 없습니다. 이는 의도적으로 이루어 지므로 커널이 안쪽에서 썩는 것을 방지합니다. 당신의 데몬은 영원히 그 상태를 유지 할 수 있다는ioctl(), 그 생각할 수에 (ADC가 적어도까지 다시 설정) 를 갇히지 않은 경우

    .

    알려진 버그가있는 인터페이스에서 ioctl()을 호출하기 전에 보다 먼저의 파일을 삭제하는 것이 좋습니다. 스레드가 이 아니고이 아닌 파일을 xx 초 단위로 연결 해제하면 다른 프로그램으로 ADC를 다시 시작해야합니다.

    또한 예제 코드가 필요한 경우 pthreads 사용에 동의하며 질문을 업데이트하십시오.