0

저는 GPIO 핀 (ARM 플랫폼, Mach-davinci, 커널 2.6.27)에서 클록 신호를 생성하려고합니다.이 신호는 100kHz로 변환 될 것입니다. 우선 순위가 높은 태스크 렛을 사용하면 그렇게 할 수 있습니다. 이론은 간단하고 gpio를 높게 설정하고 5us는 낮추고 gpio는 낮게 설정하고 또 다른 5us는 기다리지만 이상한 문제가 나타납니다. 우선,이 dalay의 5us를 얻을 수는 없지만, hw 성능 문제처럼 보입니다. 따라서주기 = 40us로 이동했습니다 (~ 25kHz 제공). 두 번째 문제는 최악입니다. ~ 10ms마다 한번 udelay는 평소보다 3 배 더 오래 기다립니다. 나는 그것이 이번에는 듣는 것 같다고 생각하지만 이것은 프로토콜 (이것의 상단에서 구현 될 것이다)의 관점에서 받아 들일 수 없다. 어떤 방법으로 일시적으로 심장 박동 수순을 비활성화 할 수 있습니까, 500ms라고 할 수 있습니까? 아니면 처음부터 잘못하고있는 것일까 요? 다른하실 말씀 있나요?Liunx 커널 모듈에서 비트 뱅잉으로 ~ 100kHz 클럭 신호를 생성하는 방법은 무엇입니까?

+0

잘 모르겠다. 무한 루프로 busywait 할 tasklet을 작성하고 있습니다! – Demiurg

+0

기본적으로 네,하지만 inifinite 아니에요, 나는 그 시계가 필요합니다, 500ms라고 말하면, 그것은 300ms에 더 가깝습니다. 예, 모든 것이 차단 될 것이라는 것을 알고 있습니다 만, 내가 선택한 것은 무엇입니까? ;) – Poll

답변

2

이러한 종류의 작업에는 작업 표를 사용할 수 없습니다. 태스크 릿은 인터럽트에 의해 선점 될 수 있습니다. 어떤 경우에는 tasklet이 프로세스 컨텍스트에서 실행될 수도 있습니다!

절대적으로 이렇게해야한다면 인터럽트 처리기를 사용하십시오. 인터럽트를 비활성화하고 인터럽트를 비활성화하고 필요한 모든 작업을 수행하고 가능한 빨리 수행하십시오.

+0

오 ... 설명은 내가 읽은 것과 완전히 다르지만 모든 것 네가 도움을 청할 권리가 있다고 말한다. – Poll

0

커널 타이머보다 높은 우선 순위로 타이머 셧다운을 실행하지 않는 한 항상 이런 종류의 지터가 발생할 수 있습니다. 당신은 정말로 비트 - 깡패에 의해 이것을해야만합니까? 하드웨어 타이머 또는 PWM 생성기를 사용하는 것이 훨씬 쉬울 것입니다. 원하는 속도로 실행되도록 타이머를 구성하고 핀을 출력으로 설정하면 완료됩니다.

각 비트주기마다 소프트웨어 제어가 필요한 경우 짧은 시간에 실행되도록 태스크 릿을 설정하여 다른 태스크를 시도해 볼 수 있습니다 (예 : 40 us 지연 시간의 3/4). 태스크 릿에서 올바른 40 us 타임 슬롯에 도달 할 때까지 인터럽트를 비활성화하고 시계를 폴링하고, I/O 상태를 설정하고, 인터럽트를 다시 활성화하고 종료하십시오. 그러나 이는 시계를 보는 데있어 시스템의 25 %를 효과적으로 입력합니다.

+0

가장 쉬운 방법은 USART 또는 sth, unfortunatelly와 같은 작업을 수행하는 몇 가지 hw 인터페이스를 취할 것입니다. ( – Poll

2

시계를 소프트웨어에서 비동기 적으로 생성하는 것은 올바른 일이 아닙니다.

  1. 귀하의 프로세서가있을 수 있습니다 내장 이미 커널이나 다른 드라이버에 의해 사용되지 않는 클럭 발생기 주변 : 내가 더 잘 작동 두 가지 대안을 생각할 수 있습니다. 이들 중 하나를 설정하면 클럭 속도가 얼마나 빠르는지 알려주고 펄스가 모두 소모되기 시작합니다.

    프로세서의 데이터 시트를 가져 와서 연구하십시오.

    "시계"그 자체가 인 주변 기기를 찾을 수는 없지만 PWM 주변 기기처럼 서비스 할 수있는 유사한 것을 찾을 수 있습니다.

  2. 대화하고있는 다른 장치에는 실제로 시계가 필요하지 않을 수 있습니다. "클럭"라인을 필요로하는 일부 칩은 읽을 비트가있을 때 하이가되고, 데이터 라인이 변경되는 동안 로우가되는 라인 만 있으면됩니다. 이 경우에, 당신이 읽고있는 100kHz의 것이 정확히 그 주파수의 클럭에 대한 까다로운 요구 사항은 아니며, 그것은 클럭 라인 (그리고 데이터 라인 (들))의 속도 상한선에 불과합니다. 전환 할 수 있습니다. 는 CPU가 너무 빨리, 당신은 두 부분으로이 분할 할 시계보다으로

    :

    • 은 "상위 절반은"제대로 (들)의 상태 데이터 라인을 설정 후 클럭 라인을 제공합니다 쪽으로. 그런 다음 인터럽트 또는 커널 타이머를 사용하여 하단 절반이 5 μs 후에 실행되도록 예약합니다.

    • 인터럽트 또는 타이머에 의해 호출되는 "아래쪽 절반"에서 클럭 라인을 다시 가져온 다음 5 초 후에 맨 위 절반을 다시 실행하도록 예약합니다.

관련 문제