운전자 정보를 찾는 방법을 알고 싶습니다. Beaglebone Black을 시작하거나 다시 시작할 때 드라이버 초기화를 지연할 수 있는지 알고 싶습니다.
답변1
드라이버를 수정할 수 있으면 내 답변을 읽을 수 있습니다.여기.
내 해결책 usleep_range(1000000, 12000000);
은발각운전자가 10~12초 동안 지연되도록 운전자의 기능을 수행합니다. 이것발각이 함수는 드라이버가 실행/초기화를 시작하는 곳입니다.
답변2
장치 드라이버는 오픈 소스인가요? 그렇다면 수정하려면 소스 코드를 다운로드해야 합니다.
여러 시스템 시계를 활용하면 다음 코드 조각을 사용하여 내부적으로 드라이버 방향을 지연시킬 수 있습니다.
while (time_before(jiffies, j1))
cpu_relax();
j1
지연이 만료될 때의 jiffies 값, 즉
cpu_relax
유휴 프로세서를 나타내기 위해 아키텍처에 특별히 만들어진 호출입니다.
다시 말하지만, 이 모든 것은 드라이버 소스 코드에 의존합니다.
답변3
cpu_relax()
, 또는 (잠재적인 단점이 있음)의 바쁜 루프를 호출하는 대신 schedule()
더 나은 접근 방식은 잠재적으로 불리한 부작용(예: 기껏해야 어색하거나 결과가 발생할 수 있는 방식) 없이 기다리도록 설계된 타이머 함수를 사용하는 것입니다. 장비가 압수되는 최악의 시나리오).
짧은 지연의 경우(예: 짧은 지연 시간 문제 처리) 다음 접근 방식을 사용할 수 있습니다.
#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
드라이버 초기화는 드라이버가 초기화될 때까지 차단하고 운영 체제로 돌아가지 않아야 하기 때문에 이 경우 유용하지 않을 수 있지만 일반적으로 현재 프로세스를 차단하지 않고 나중에 작업이 발생하도록 예약해야 하는 경우 커널 타이밍 도구는 갈 길입니다.
#include <linux/timer.h>
struct timer_list {
/* ... */
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
};
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
void init_timer(struct timer_list *timer);
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);
int mod_timer(struct timer_list *timer, unsigned long expires);
int timer_pending(const struct timer_list * timer);
이를 사용하려면 timer_list
항목을 초기화하십시오. 는 TIMER_INITIALIZER()
이를 수행하기 위한 편리한 함수로, 실행할 함수에 대한 포인터, 함수에 전달될 불투명 데이터, _expires
함수가 실행되어야 하는 짧은 시간인 시간이 전달됩니다. 참고: 구조에서 생략된 필드는 timer_list
이 논의에 필요하지 않은 구현 세부정보입니다.
그런 다음 호출은 add_timer()
타이머 목록 항목을 대기열에 삽입합니다(예: 타이머를 "시작").
또 다른 가능성은 커널이 대기를 해제하기 전에 일부 조건을 확인할 때까지 기다리는 것과 같은 것을 사용하는 것입니다 wait_event()
. 여기서 임의의 시간을 기다리는 대신 TBD가 발생할 때까지 기다립니다.