Есть ли способ отложить инициализацию драйвера на Beaglebone Black?

Я хотел бы знать, как я могу найти информацию о драйверах. И я хотел бы знать, можно ли отложить инициализацию драйвера при загрузке или перезагрузке Beaglebone Black.

0
30.05.2017, 17:38
3 ответа

Beaglebone а?.. у вас есть доступ к моду dev.код водителя? Является ли разработчик. драйвер открытый? Если да, мальчик, у меня есть решение для вас. :)

Используя системные часы, кратные системным часам, вы задерживаете направление водителя изнутри с помощью следующего фрагмента кода:

while (time_before(jiffies, j1))
cpu_relax( );

j1 — значение jiffies по истечении задержки cpu_relax — это вызов, который вызывает архитектуру специально для указания незанятого процессора.

Опять же, все зависит от драйвера OpenSource.

2
28.01.2020, 02:45

Если вы можете изменить драйвер, вы можете посмотреть мой ответ здесь .

Мое решение состоит в том, чтобы поместить usleep_range(1000000, 12000000);в функцию probe в вашем драйвере, чтобы драйвер задержался на 10 -12 секунд. Функция probe — это место, где драйвер начинает выполнение/инициализацию.

1
28.01.2020, 02:45

Вместо цикла занятости, который вызывает 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(), которое ждет, пока некое условие будет проверено ядром, прежде чем отменить ожидание, при этом вместо ожидания в течение произвольного промежутка времени оно ожидает, пока что-то не произойдет T.B.D.

0
05.10.2021, 14:25

Теги

Похожие вопросы