Frage

Derzeit entwickle ich das GPIO -Kernel -Modul für Friendlyarm Linux 2.6.32.2 (Mini2440). Ich bin vom elektronischen Hintergrund und neu in Linux.

Das beim Start geladene Kernelmodul und die zugehörige Gerätedatei befindet sich in /dev wie gpiofreq.

Nach dem ersten Schreiben in die Gerätedatei schaltet der GPIO -PIN kontinuierlich bei 50 kHz um. Zum zweiten Mal, dass es aufschreibt, hör auf, umzuschalten. Zum dritten Mal beginnt es wieder und so weiter.

Ich habe separates Kernel -Modul geschrieben, um Freq zu generieren. Die CPU friert jedoch nach dem ersten Schreiben der Gerätedatei zum ersten Mal ein. Die Terminalaufforderung wird angezeigt, kann jedoch keinen Befehl danach ausführen.

Hier ist der Code-Snippet:

//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;
}

Hier ist der Device -Schreibcode, der mit allen an die Gerätedatei geschriebenen Daten starten oder anhält.

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;
}
War es hilfreich?

Lösung

Sie machen eine unendliche Schleife in einem Kernelfaden, es gibt keinen Raum für etwas anderes, außer IRQ und vielleicht einem anderen Kernelfaden.

Was Sie tun könnten, ist entweder

  • Programmieren Sie einen Timer auf Ihrer Hardware und führen Sie Ihre Pin in einem Interrupt um

  • Udelay durch udep_range ersetzen

Ich schlage vor, die Sache schrittweise zu tun und mit usleep_range im KHz -Bereich zu beginnen und schließlich zu Cust OM Timer + ISR zu wechseln

In beiden Fällen werden Sie wahrscheinlich viel Jitter haben, und ein solch solch GPIO -Umschalten kann eine gute Idee auf einem DSP oder einem PIC sein, ist jedoch eine Verschwendung von Ressourcen auf ARM + Linux, es sei denn Motor.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top