스핀 락 사용 시 주의 사항:
①
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
);