2010-07-01 6 views
2

저는 하드웨어 및 장치 드라이버를 가지고 있고 하드웨어 제어를 위해 훨씬 이전 버전의 Linux를 사용했습니다. 필자는 최근에 임베디드 프로세싱을 사용하는 리눅스 및 장치 제어 게임에서 돌아 왔으며 리눅스 세계에서 많은 변화가 있음을 발견했습니다 (더 나은 경우). 그러나 데이터 프레임의 적절한 데이터 전송 타이밍을 보장하기 위해 짧은 시간 프레임 (5msec) 동안 모든 인터럽트를 돌리는 매우 빠른 SPI 기반 프레임 데이터 전송 커널 모듈과 관련된 하드웨어 제어 문제로 고민하고 있습니다. 리눅스의 '옛날'에서는 임계 영역에 대한 인터럽트를 비활성화하기 위해 save_flags - cli() - sti() 프레임 워크를 사용했습니다. 새로운 (2.6.33 및 이후 버전) Linux IRQ 제어 프레임 워크에서이 작업을 수행하는 가장 간단한 방법은 무엇입니까?짧은 (5ms) 프레임 데이터 전송 중에 모든 IRQ를 차단하는 방법

스콧

+0

버스 마스터 링 누구? 오늘날 대부분의 하드웨어는 CPU 개입없이 RAM으로 데이터를 전송할 수 있어야합니다. 그리고 그것이 올바른 방법입니다. IIRC, cli()/sti()는 이전 버전과의 호환성을 위해 여전히 2.6에 있어야합니다. – Dummy00001

+1

5ms가 더 이상 "짧지"않다 - 말 그대로 수백만 개의 CPU 사이클이 낭비된다 ... – caf

답변

1

현대 등가물은 local_irq_disable(), local_irq_enable(), local_irq_save()local_irq_restore() 있습니다. 그러나 그렇게 오랜 시간 동안 (그리고 실수하지 마라. 현대 CPU 속도 5ms는 오랜 시간이다.) 꽤 반사회적 인 것으로 간주된다.

현대적인 시스템에는 가면 처리가 불가능하고 어려운 시간 동안 CPU를 대신 할 수있는 SMI (시스템 관리 인터럽트)가 있으므로 코드가이 케이스를 처리해야 할 수도 있습니다.

요즘에는 커널이 선점 가능하며 커널 코드에 고해상도 타이머가 있습니다. 코드에서 이러한 코드를 대신 사용할 수 있습니다 (include/linux/hrtimer.h 참조).

+0

그리고 더 많은 RT 패치 세트가 병합되면 더 까다로워 질 것이다. – stsquad