¿Hay alguna forma de retrasar la inicialización del controlador en Beaglebone Black?

¿Hay alguna forma de retrasar la inicialización del controlador en Beaglebone Black?

Me gustaría saber cómo puedo encontrar la información del conductor. Y me gustaría saber si es posible retrasar la inicialización del controlador cuando inicio o reinicio el Beaglebone Black.

Respuesta1

Si puedes modificar el controlador, puedes mirar mi respuesta.aquí.

Mi solución es poner usleep_range(1000000, 12000000);en elInvestigacionfunción en su controlador, de modo que el conductor tendrá un retraso de 10 a 12 segundos. ElInvestigacionLa función es donde el controlador comienza a ejecutarse/inicializarse.

Respuesta2

¿El controlador del dispositivo es de código abierto? Si es así, querrás descargar el código fuente para poder modificarlo.

Utilizando un múltiplo del reloj del sistema, retrasa la dirección del conductor desde dentro con el siguiente fragmento de código:

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

j1es el valor de santiago al vencimiento del retraso cpu_relaxes una llamada que invoca la arquitectura específicamente para indicar un procesador inactivo.

Nuevamente, todo depende de tener el código fuente del controlador.

Respuesta3

En lugar de un bucle ocupado que llama a cpu_relax(), o schedule(), que tiene posibles inconvenientes, es mejor utilizar funciones de temporizador que están diseñadas para esperar sin efectos secundarios potencialmente adversos (como bloquear otras actividades de tal manera que, en el mejor de los casos, podrían resultar incómodas o provocar la interrupción del servicio). dispositivo para bloquear en el peor de los casos).

Para retrasos más cortos (por ejemplo, para problemas de latencia corta), se pueden utilizar:

#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);

Aunque probablemente no sea útil en este escenario, donde la inicialización del controlador debe bloquearse y no regresar al sistema operativo hasta que se inicialice el controlador, generalmente, cuando necesita programar una acción para que suceda más tarde, sin bloquear el proceso actual, los temporizadores del kernel son la forma. ir.

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

Para usarlos, inicialice una timer_listentrada. , es una función conveniente para hacer eso TIMER_INITIALIZER(), donde se pasa un puntero a la función para ejecutar, datos opacos para pasar a la función y un tiempo _expireses el tiempo en el que la función debe ejecutarse. Nota: Los campos eliminados en la timer_listestructura son detalles de implementación que no son necesarios para esta discusión.

Luego, la llamada add_timer()inserta la entrada timer_list en la cola (por ejemplo, 'inicia' el temporizador).

Otra posibilidad es usar algo como wait_event(), que espera hasta que se cumple alguna condición que el kernel verifica antes de liberar la espera, en donde en lugar de esperar una cantidad de tiempo arbitraria, espera hasta que algo suceda por determinar.

información relacionada