10

現在、friendlyarm Linux 2.6.32.2(mini2440)用のGPIOカーネルモジュールを開発しています。私はエレクトロニクスのバックグラウンドを持ち、Linuxは初めてです。

起動時にロードされるカーネルモジュールと関連するデバイスファイルは、/devとしてにありgpiofreqます。

デバイスファイルへの最初の書き込みでは、GPIOピンは50kHzで連続的にトグルします。2回目の書き込みでは、切り替えが停止します。3回目は、再開します。

freqを生成するために別のカーネルモジュールを作成しました。ただし、最初にデバイスファイルを書き込んだ後、CPUがフリーズします。ターミナルプロンプトが表示されますが、その後コマンドを実行できません。

コードスニペットは次のとおりです。

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

これがデバイス書き込みコードで、デバイスファイルに書き込まれたデータで開始または停止します。

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

1 に答える 1

9

カーネル スレッドで無限ループを実行しています。IRQ とおそらく他のカーネル スレッドを除いて、他に何かが起こる余地はありません。

あなたができることはどちらかです

  • ハードウェアでタイマーをプログラムし、割​​り込みでピンを切り替えます

  • udelay を usleep_range に置き換えます

段階的に物事を進め、usleep_range を使用して kHz 範囲から開始し、最終的にはカスタム タイマー + ISR に移行することをお勧めします。

どちらの場合でも、おそらく多くのジッターが発生し、そのような gpio トグルを行うことは DSP や PIC では良い考えかもしれませんが、pwm 対応 gpio でハードウェア支援されていない限り、ARM + Linux ではリソースの浪費になります。エンジン。

于 2011-11-29T12:49:26.040 に答える