arm-linux 스핀 잠금

스핀 락 사용 시 주의 사항:
Spin Lock에 의해 보호되는 Critical Area는 가능한 한 짧아야 하므로 Open 기능 에서 Spin Lock을 적용한 Release 기능 에서 적용한다.
숫자에서 스핀 잠금을 해제하는 방법은 바람직하지 않습니다. 장치가 다음과 같은 경우 변수를 사용하여 장치 사용량을 나타낼 수 있습니다.
이 변수를 사용하면 변수가 1씩 증가하고 장치가 해제된 후 변수 1씩 감소합니다 .
할 수 있다.
② 드라이버의 호환성을 고려하여 API 기능을 합리적으로 선택합니다 .
요약하면, 루틴의 이 섹션에서 장치의 사용을 나타내는 dev_stats 변수 dev_stats를 정의합니다.
0 이면 장치를 사용하지 않는다는 의미이고, dev_stats가 0 보다 크면 장치 를 사용한다는 의미입니다. 먼저 드라이버 열기 기능에서
dev_stats 가 0 인지 판단 , 즉 장치가 사용 가능한지 판단하고, 0 이면 장치를 사용하고 dev_stats를 설정
장치가 사용 중임을 나타내려면 1을 추가하십시오 . 사용 후 릴리스 기능 에서 dev_stats를 1씩 감소시켜 장치가 사용되지 않음을 나타냅니다.
위로. 따라서 실제로 디바이스에 대한 상호 배타적 액세스를 실현하는 변수는 dev_stats 이지만 dev_stats를 보호하기 위해 스핀 잠금을 사용해야 합니다.
보호하다.
장치 구조:
/* gpioled 장치 구조 */
34 구조체 gpioled_dev {
35 dev_t devid ; /* 장치 번호 */
36 struct cdev cdev ; /* cdev */
37 struct 클래스 * 클래스 ; /* */
38 struct 장치 * 장치 ; /* 장치 */
39 int major ; /* 주요 장치 번호 */
40 int minor ; /* 마이너 장치 번호 */
41 struct device_node * nd ; /* 디바이스 노드 */
42 int led_gpio ; /* LED 가 사용하는 GPIO 번호 */
43 int dev_stats ; /* 장치 상태, 0 , 장치가 사용되지 않음 ; >0, 장치가 사용됨 */
44 spinlock_t lock ; /* 스핀 락 */
45 };
개방 기능:
spin_lock_irqsave (& gpioled . lock , flags ); /* 상위 *
/* 얻기 위해 spin_lock_irqsave 함수를 호출합니다.
잠금을 해제하기 위해서는 드라이버 호환성을 고려하여 잠금을 획득하기 위해 spin_lock 함수를 사용하지 않습니다. */
if ( gpioled . dev_stats ) { /* 장치가 사용되는 경우
spin_unlock_irqrestore (& gpioled . lock , flags ); /* 초기화 */
반환 - EBUSY ;
}
gpioled .dev_stats ++; /* 장치가 열려 있지 않으면 열린 것으로 표시 * / spin_unlock_irqrestore (& gpioled . lock , flags ); /* 잠금 해제 */ *
dev_stats가 0 보다 큰지 확인하고 , 그렇다면 장치가 사용되었음을 의미합니다. 그런 다음 spin_unlock_irqrestore 함수를 호출하여 잠금을 해제하고 -EBUSY를 반환합니다 . 장치를 사용하지 않는 경우 66 행의 dev_stats 1을 추가하여 장치가 곧 사용됨을 표시한 다음 spin_unlock_irqrestore 함수를 호출하여 잠금을 해제합니다. spin lock의 역할은 dev_stats 변수를 보호하는 것이며 실제로 장치에 대한 상호 배타적 액세스를 실현하는 것은 dev_stats 입니다 .

릴리스 기능:
/* 드라이버 파일을 닫을 때 dev_stats를 1씩 감소 */
spin_lock_irqsave (& dev -> 잠금 , 플래그 ); /* 잠금 */
if ( dev -> dev_stats )
{ dev -> dev_stats --; }
spin_unlock_irqrestore (& dev -> lock , flags ); /* 잠금 해제 */
dev_stats를 1 감소시켜 장치가 해제되었고 다른 애플리케이션에서 사용할 수 있음을 나타냅니다 . dev_stats를 1 씩 감소시킬 때 이를 보호하기 위해 스핀 잠금이 필요합니다.
초기화 기능:
/* 스핀록 초기화 */ spin_lock_init (& gpioled . lock );

Supongo que te gusta

Origin blog.csdn.net/L1153413073/article/details/125548087
Recomendado
Clasificación