埋め込まれた筆記試験の面接質問 (15 日目)


序文

この記事では引き続き筆記試験の面接質問について解説していきますので、私に倣って大手メーカーの内定を目指して頑張っていただければ幸いです。

1. Linuxにおけるメジャーデバイス番号とマイナーデバイス番号

1.閲覧方法

メジャー デバイス番号とマイナー デバイス番号を確認する方法:
まず、/dev ディレクトリに入ります。

cd /dev

表示するには次のコマンドを使用します。

ls -l

ここに画像の説明を挿入します

2. メジャーデバイス番号とマイナーデバイス番号の役割

各デバイス ドライバーには一意のメジャー デバイス番号が割り当てられ、必要に応じて異なるマイナー デバイス番号が使用されます。

メジャー デバイス番号は、デバイス ドライバーが属するデバイス タイプまたはデバイス クラスを識別します。これは通常、システム管理者または開発者によって割り当てられ、維持される整数値です。一部の共通メジャー デバイス番号は、ディスク デバイス、ネットワーク デバイス、シリアル ポート デバイスなど、さまざまなタイプのデバイスに割り当てられます。メジャー デバイス番号により、システムは特定の種類のデバイスを識別し、デバイスに対する要求を適切なドライバーにルーティングできるようになります。

マイナー デバイス番号は、同じタイプの複数のデバイス間で特定のインスタンスまたはデバイス番号を識別するために使用されます。これは整数値でもあり、デバイス ドライバーまたはオペレーティング システム カーネルによって割り当ておよび管理されます。マイナーデバイス番号を通じて、システムはさまざまなデバイスインスタンスを区別でき、各デバイスインスタンスは異なる属性とステータスを持つことができます。

メジャー デバイス番号とマイナー デバイス番号の組み合わせにより、システム内の各デバイスを一意に識別します。デバイス ファイル (/dev/sda など) とデバイス ノード (/dev/ttyUSB0 など) は通常、メジャー デバイス番号とマイナー デバイス番号を使用してデバイスに名前を付け、表現します。

デバイス ドライバーでは、通常、メジャー デバイス番号とマイナー デバイス番号は、デバイスの登録、デバイス ファイルの作成と管理、デバイスのアクセス制御などに使用されます。これらの識別子を通じて、オペレーティング システムとアプリケーションはデバイス ドライバーと対話し、リクエストを送信し、データを受信できます。

つまり、メジャー デバイス番号とマイナー デバイス番号は、デバイス ドライバーとデバイス インスタンスを一意に識別するために使用されるパラメーターであり、オペレーティング システムがデバイスを管理し、デバイス ドライバーを通信および操作するのに役立ちます。

同じデバイス クラスのドライバーは、メジャー デバイス番号は同じですが、マイナー デバイス番号が異なります。
ここに画像の説明を挿入します

2. ソフトウェア IIC とハードウェア IIC の違い

ソフトウェア I2C (ソフトウェア エミュレートされた I2C とも呼ばれます) とハードウェア I2C は、マイクロコントローラーまたは組み込みシステムで I2C 通信を実装するために使用される 2 つの異なるプロトコル実装です。実装とパフォーマンスにいくつかの違いがあります。

ソフトウェア I2C は、GPIO (汎用入力出力) ピンを介して I2C バスのタイミングと信号伝送をシミュレートします。ソフトウェア I2C は GPIO ピンを使用して I2C バスのクロックとデータ ラインをシミュレートする必要があるため、対応するレベル変化を生成および検出するには一定のソフトウェア遅延と CPU 計算が必要です。ソフトウェア I2C はデータ送信に一般的な GPIO インターフェイスを使用するため、GPIO およびタイマー機能を備えた任意のマイクロコントローラーに実装できます。

ハードウェア I2C は、特殊な I2C ペリフェラルを使用して I2C 通信を処理します。ハードウェア I2C は通常、クロック ジェネレーター、トランシーバー、ステート マシンなどのハードウェア内の特定の回路によって実装されます。これらのハードウェア モジュールは、ハードウェア回路を通じて I2C 通信の詳細を処理し、高速化とプロセッサ負荷の軽減を実現します。ハードウェア I2C の実装には通常、特定のハードウェア ピンと専用の I2C ペリフェラルが必要です。

下面是软件I2C和硬件I2C的一些区别:

1. 実装の複雑さ: ソフトウェア I2C の実装は比較的単純で、GPIO とソフトウェア ロジックを通じて対応するクロックとデータ ラインの変更を実現するだけで済みます。ハードウェア I2C では、専用の I2C ペリフェラルおよび関連ハードウェア回路を使用する必要があり、これにはより多くのハードウェア サポートと構成が必要です。

2. 速度とパフォーマンス: ハードウェア I2C は、ハードウェア内の回路と特殊な I2C ペリフェラルを利用して信号伝送を処理するため、多くの場合、より高速な通信速度を実現できます。ソフトウェア I2C は、ソフトウェア遅延とプロセッサ計算が必要なため一般に遅くなり、高速通信時のプロセッサ負荷や割り込み遅延などの要因の影響を受けやすくなります。

3. リソース要件: ソフトウェア I2C は通常、一部の GPIO ピンとソフトウェア コンピューティング リソースのみを使用する必要があるため、ハードウェア リソース要件は低くなります。ハードウェア I2C には特定のハードウェア ピンとペリフェラルが必要ですが、これらは通常チップ レベルで統合されるため、より多くのハードウェア リソースを消費します。

4. 移植性: ソフトウェア I2C は一般的な GPIO インターフェイスとタイマー機能のみに依存するため、さまざまな異なるマイクロコントローラー プラットフォームに実装できます。ハードウェア I2C には特定のハードウェア サポートが必要なため、チップやプラットフォームによって実装が異なる場合があります。

综上所述,软件I2C适用于一些简单的应用场景和对资源要求较低的情况,而硬件I2C则适用于需要高速通信和更可靠性的应用场景。选择哪种方式取决于具体的应用需求和设备平台的支持情况。

3. 変数の宣言と定義の違い

C 言語では、変数の宣言と定義は 2 つの異なる概念ですが、コード内ではよく一緒に使用されます。それらの違いは次のとおりです。

1. 宣言: プログラムでは、宣言は、変数の名前や型など、変数に関する情報をコンパイラーに提供します。これにより、コンパイラに変数の存在が説明され、コンパイラが後続のコードでこの変数を正しく使用できるようになります。宣言は通常、コードの先頭または関数の引数リストに表示され、変数に関する情報をコンパイラに伝えます。

例:

extern int number; // 变量声明
void foo(int x);  // 函数参数声明

変数宣言でキーワード「extern」を使用すると、変数が別の場所で定義されており、現在のファイル内の参照としてのみ使用されることがコンパイラーに伝えられます。

2. 定義: 定義は、変数の名前、型、記憶領域の割り当てなど、変数に関する完全な情報をコンパイラーに提供します。変数に関する情報をコンパイラに伝えるだけでなく、変数に実際のメモリ領域も割り当てます。変数の定義はプログラム内で 1 回だけ使用できます。

例:

int number; // 变量定义
void foo(int x) {
    
    
    int y; // 变量定义
    // ...
}

変数定義では、変数に型と名前が与えられ、その変数に記憶領域が割り当てられます。

要約すると、宣言は変数の存在をコンパイラに知らせることであり、定義は宣言に基づいて変数に記憶領域を割り当てることです。実際のプログラミングでは、変数の宣言と定義を組み合わせることが多く、宣言と同時に変数のメモリ空間を確保することができます。例えば:

int number; // 变量声明和定义,分配存储空间

変数が関数パラメータリストで宣言されると、その変数も定義されることに注意してください。関数が呼び出されるときに、パラメータが仮パラメータにコピーされ、仮パラメータが関数内のローカル変数として使用されるためです。したがって、関数のパラメータの宣言が定義になります。

void foo(int x); // 函数参数声明和定义

4. C と C++ の static の違い

C と C++ では、キーワード static の使用法とセマンティクスが異なります。

在C中:

1. グローバル静的変数: 関数の外部で定義されたグローバル変数は、静的修飾子を使用して追加して静的変数にすることができます。静的グローバル変数のスコープは、それが定義されているソース ファイルに制限されており、他のファイルは変数に直接アクセスできません。つまり、変数にはファイル スコープがあります。静的グローバル変数はプログラムの実行中に存在し、関数呼び出しによって作成および破棄されることはありません。

2. ローカル静的変数: 関数内で定義された変数と static 修飾子は、ローカル静的変数です。ローカル静的変数は、関数のライフサイクル中その値を変更せずに保持し、関数が最初に入ったときにのみ初期化され、それ以降は初期化されません。

在C++中:

1. 静的メンバー変数: クラス内で宣言された静的変数メンバーは、クラスの各オブジェクトではなく、クラス全体に属します。静的メンバー変数はメモリ内にコピーを 1 つだけ持ち、すべてのクラス オブジェクトによって共有されます。これらはクラスの外で定義および初期化する必要があります。

2. 静的メンバー関数: 静的メンバー関数は、クラス自体に属し、クラスのオブジェクトには属しません。オブジェクト インスタンスを作成せずに、クラス名を通じて直接呼び出すことができます。静的メンバー関数は非静的メンバー変数にはアクセスできません。静的メンバー変数と他の静的メンバー関数にのみアクセスできます。

3. 静的変数または静的メンバー変数の初期化規則は、C と C++ では若干異なることに注意してください。C では、等号の割り当てを使用して静的変数を初期化できます。明示的に初期化しない場合は、0 または null に初期化されます。C++ では、静的メンバー変数はクラスの外部で定義および初期化する必要があります (int MyClass::staticVar = 0; など)。

综上所述,static在C和C++中具有不同的用法和语义,分别用于定义静态全局变量、局部静态变量、静态成员变量和静态成员函数。这些用法的具体含义和行为在不同的语言中可能有所不同。

5. アイドル時のシリアルポートバスのレベルステータス

シリアル ポート バスがアイドル状態の場合、そのレベル状態は特定のシリアル ポート プロトコルと信号規則によって異なります。通常、一般的なシリアル バス プロトコル (RS-232、RS-485、TTL UART など) には、アイドル状態における特定のレベル表現があります。それらの一般的な説明は次のとおりです。

1.RS-232: RS-232 プロトコルでは、アイドル状態のレベルは負のレベル (ロジック ハイ レベル) です。これは、送信ラインと受信ラインの両方が負のレベル、通常は -3 ~ -15 ボルトに保持されることを意味します。

2. RS-485: RS-485 プロトコルでは、アイドル状態のレベルは論理ハイ レベルであり、「アイドル ライン状態」とも呼ばれます。送信ラインと受信ラインは両方とも安定した高レベル (通常は +3 ~ +15 ボルト) に保持され、バスがアイドル状態であることを示します。

3.TTL UART (Arduino などのマイクロコントローラー上の UART): TTL UART は一般的なシリアル通信規格であり、レベルは通常システムの電源電圧によって決まります。アイドル状態では、TTL UART のレベルは通常ロジック ハイ (電源電圧) です。

需要注意的是,虽然上述描述是常见的情况,但串口总线的电平状态可能因特定硬件设计和使用的协议而不同。因此,在具体的应用中应查阅硬件规格表、参考相关文档或协议标准以确定特定串口总线在空闲状态下的电平状态。

要約する

この記事ではここで説明します。

おすすめ

転載: blog.csdn.net/m0_49476241/article/details/133062461
おすすめ