Actualmente estoy desarrollando el módulo de kernel de GPIO para friendlyarm Linux 2.6.32.2 (mini2440). Soy de origen en electrónica y nuevo en Linux.Tarea periódica en un módulo de kernel de Linux
El módulo kernel cargado al inicio y el archivo del dispositivo relacionado se encuentra en /dev
como gpiofreq
.
Al escribir por primera vez en el archivo del dispositivo, el pin GPIO alterna continuamente a 50 kHz. En la segunda vez que lo escribes, deja de alternar. En tercer lugar, comienza de nuevo, y así sucesivamente.
He escrito un módulo kernel por separado para generar freq. pero la CPU se congela después de escribir el archivo del dispositivo por primera vez. Se muestra el mensaje de la terminal pero no puedo ejecutar ningún comando después.
Aquí es el código de fragmento:
//calling function which generates continuous freq at gpio
static int send_freq(void *arg)
{
set_current_state(TASK_INTERRUPTIBLE);
for(;;)
{
gpio_set_value(192,1);
udelay(10);
gpio_set_value(192,0);
udelay(10);
}
return 0;
}
Aquí está el código de escritura del dispositivo, el cual iniciar o detener con datos grabados en el archivo de dispositivo.
if(toggle==0)
{
printk("Starting Freq.\n");
task=kthread_run(&send_freq,(void *)freq,"START");
toggle=1;
}
else
{
printk("Operation Terminated.\n");
i = kthread_stop(task);
toggle=0;
}
* ¿Por qué * quieres que tu tarea se ejecute por completo * dentro del kernel *? La sabiduría común es tener un proceso de ayudante de nivel de usuario ... –
porque quiero la frecuencia de hasta 100kHz. Ya probé un script de shell que me da una frecuencia de conmutación de alrededor de 750 Hz. y también un programa c que me da un máximo de 900 Hz. ambos realizan la operación de escritura '1' y '0' en el archivo del dispositivo "/ sys/class/gpio/gpio192/value". –
No creo que puedas alcanzar una frecuencia tan alta sin consumir muchos recursos. – shodanex