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);

드라이버 초기화를 차단하고 드라이버가 초기화될 때까지 OS로 돌아가지 않아야 하는 이 시나리오에서는 유용하지 않을 수 있지만 일반적으로 현재 프로세스를 차단하지 않고 나중에 발생하도록 작업을 예약해야 하는 경우 커널 타이머가 사용됩니다. 토고.

#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(). 여기서 임의의 시간을 기다리는 대신 어떤 일이 발생할 때까지 기다립니다.

관련 정보