ナインは、中断の概念を導入し、[Linuxドライバの開発を組み込み]、キードライバフレームワーク(詳細非同期通知を)理解して

  人生は戦い、闘争して自分自身に、手配して他人のために待つことができない;かかわらず、結果の悲劇ですが、慰めはあなたが常にこの世界に価値があるの住んでいることです。このような理解では、あなたは冷笑的な生活を大切にしませんが、それはまた、注射自体が強力な内面の強さを与えるだろう。


この知識を通して、私たちは、次のセクションを理解することができます。

①基本的なドライビングスキル:中断し、睡眠は、ポーリングメカニズムを覚まします。

  • これらの基本的なスキルは、基本駆動開発は、他の大容量ドライブの複合体がそのフレームワークとデザインのアイデアが、これらのための基本的な技術であるです。

②APP
の基本的なスキルの開発:ブロッキング、ノンブロッキング、睡眠、世論調査、非同期通知。

まず、キー読み出し方法

APPは、4つのメソッドを読み取るためにもキーです。

  • ①クエリ
  • ②睡眠 - ウェイクアップモード(これだけのことを行います)
  • ③ポールモード
  • ④非同期通知方法

  2、3、4つの方法は、割り込みサービス・ルーチンを必要とします。うっかり到着を中断し、中断は、子供が泣いて目を覚ますだろうと同じように、のように、それは特定の事柄を行います:APP、APP信号ウェイク。そのため、キードライバーは、コアを中断します。実際には、かどうかの割り込みがSCMでのLinux上で重要です。Linuxでは、割り込み知識もそうでプロセス、スレッド、およびに関するものです。

①、クエリ

A
  対応するオープン、読み出し機能を提供するドライバ設定、レジスタfile_operations構造。
  APPオープンを呼び出すときに、GPIO入力ピンとして構成された、対応する機能を開くために、ドライブが呼び出される原因となります。APPは、コールを読んで対応する機能を読み込むためにドライブが呼び出される原因、それはレジスタを読み取ると、ピンの状態はAPPに直接返されます。

②、睡眠 - ウェイクアップモード

ここに画像を挿入説明
  対応するオープン、読み出し機能を提供するドライバ設定、レジスタfile_operations構造。
  APPオープンを呼び出すときに、対応する機能を開くために、ドライブを引き起こすGPIO入力ピンとして構成されている、と呼ばれ、そしてハンドラ割り込みGPIO登録APPがコールを読んだとき、ボタンデータは、APPに直接返送された場合に対応する機能を読み込むためのドライブが、呼び出された原因と、カーネルモードではそうでない場合は休眠APPを
  ユーザーがキーを押したときは、GPIO割り込みは、ドライバの割り込みサービスルーチンが実行される前に、登録につながる、トリガされます。これは、APPのきっかけにキーデータ、及び睡眠を記録します。APPは、データは、APPのキー(ユーザ空間)に戻され、すなわち、ドライバコードが続く、カーネルモードの継続的操作の後に目覚めました。

③、ポールモード

ここに画像を挿入説明
  睡眠の上に - ウェイクアップモードは欠点があります:ユーザーがキーを持っていない場合は、APPは永遠に眠ります。私たちは、APPに目覚まし時計を設定することができ、これは世論調査の方法です。

  対応するオープン、読み取り、提供してドライバの設定、レジスタfile_operations構造、ポーリング機能を。
  APPオープンを呼び出すときに、対応する機能を開くために、ドライブを引き起こすGPIO入力ピンとして構成されている、と呼ばれ、そしてハンドラ割り込みGPIO登録
  APPは、その意図は、データが存在するかどうかを「問い合わせ」にある、投票を呼び出したり機能を選択し、それがエラーを返し、これら2つの関数は、この期間にデータがないことを、タイムアウトを割り当てることができますAPPは、そうでない場合は休眠カーネルモードでいくつかの時間のために、これは、ボタンデータはAPPに直接返送された場合に対応する駆動ポーリング機能が、呼ばれる原因となります。
  ユーザーがキーを押したときは、GPIO割り込みは、ドライバの割り込みサービスルーチンが実行される前に、登録につながる、トリガされます。これは、APPのきっかけにキーデータ、及び睡眠を記録します。ユーザーがキーを押していませんが、タイムアウト時間がアップしている場合、カーネルは、APPをウェイクアップします。
  だから、APP航跡原因の2種類があります:ユーザーは、動作キータイムアウト目覚めAPPがカーネルモードで実行し続ける、すなわち、ドライバ・コードは、APPの「ステータス」バック(ユーザー空間)を継続します。APPは、機能を選択/世論調査を与えるためにデータ肯定応答がある場合は、結果を返し、その後、ドライバは関数が呼び出された読み原因読み取り機能を呼び出し、そのデータがドライバに含まれている、それが直接データを返します。

④、非同期通知方法

ここに画像を挿入説明

  原理は非同期通知です:APPは、カーネルに知らせます。毛髪は信号の様々な、あるSIGIO(信号のIOタイプ)。

  対応するオープン、読み取り、提供ドライバ設定、レジスタfile_operations構造、fasyncの機能を。
  APPオープンを呼び出すときに、対応する機能を開くために、ドライブを引き起こすGPIO入力ピンとして構成されている、と呼ばれ、GPIOレジスタと割り込みハンドラ。my_signal_fun:そのSIGIOシグナルハンドラを登録するAPP。
  フラグにドライバをにfcntl関数を呼び出すAPPは、ドライバfasync機能につながる可能FASYNCが、それは単にプロセスのPIDを記録し、呼ばれている変更しました。
  ユーザーがキーを押したときは、GPIO割り込みは、ドライバの割り込みサービスルーチンが実行される前に、登録につながる、トリガされます。これは、プロセスのPIDにSIGIO信号を送信し、鍵データを記録します。
  APPが受信信号の後に中断され、実行はに機能を処理する信号:信号処理機能は、読み出し関数はキーの値を読み取り呼び出すことであってもよいです。
  シグナルハンドラが戻った後、APPは、以前に中断されていたコードを実行していきます

キーの読み取りの概要

  私たちの方法は、4種類以上を達成することができますのためのキードライバーを提供していますが、ドライバが使用する方法APPを制限すべきではありません。
  これは、原則駆動設計です:提供する能力とポリシーを提供していませんつまり、あなたは、ドライバが提供できるいずれかの方法で行を使用したい。しかし、ドライバがどの方法を使用することにあなたを制限することはできません。

第二に、テスト非同期通知の例は、理解深めます

signal.c

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void my_sig_func(int signo)
{
    printf("get a signal : %d\n", signo);
}

int main(int argc, char **argv)
{
    int i = 0;
    
    signal(SIGIO, my_sig_func);
    
    while (1) 
    {
        printf("Hello, world %d!\n", i++);
        sleep(2);
    }
    
    return 0;
}

信号処理機能は、レジスタ13のプログラムラインは、ライン15が無限ループです。その実行中に、非同期通知の効果を確認するために、そこに別のAPPの信号を使用することができます。

  • ①、プログラムをgccでコンパイルされています
gcc -o signal signal.c // 编译程序
  • ②、プログラムを実行します
./signal

見ることができる、印刷されている
ここに画像を挿入説明
と、端末を開き、それはAPPに信号を送信します

  • ③、信号処理IDを参照
  941 pts/2    00:00:00 signal

私はここに示した941です
ここに画像を挿入説明

  • ④、第2の送信信号端子
kill -SIGIO 941

ここに画像を挿入説明
我々は、第1端子が信号を受信し、実行し続けていることがわかります。

我々はシールドときsignal.csignal(SIGIO, my_sig_func);、再び何が起こるかからの信号を送りますか?現在の端末プリンタ、①②③④上記の手順を繰り返しを終了するプレスCTRL + C。

ここに画像を挿入説明

なお、送信信号は直接第一の端子を殺した後、信号はこのとき、非同期通知に記載されていないことが分かります。

公開された707元の記事 ウォンの賞賛1162 ビュー82万+

おすすめ

転載: blog.csdn.net/ReCclay/article/details/105089817