Beaglebone Black에서 드라이버 초기화를 지연시킬 수 있는 방법이 있습니까?

Beaglebone Black에서 드라이버 초기화를 지연시킬 수 있는 방법이 있습니까?

운전자 정보를 찾는 방법을 알고 싶습니다. 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가 발생할 때까지 기다립니다.

관련 정보