Cortex-M3開発経験(A):アプリケーションの関数ポインタ

Cortex-M3開発経験(A):アプリケーションの関数ポインタ

C言語の構文を学んで、関数ポインタを学びました。これは、(実質ベースで関数アドレスである)関数へのポインタを使用することです。そして、関数ポインタを呼び出すことによって。その時、見無知な力を完了した後、それは原理を理解することはありませんが、私は使用が何か分かりませんか?直接呼び出しは、あなたが行うことはできませんか?なぜ、これらの作業に従事するには、より厳しいとより多くの添えものです。

その後、我々は関数ポインタはまた、アプリケーションのシーンであることが判明しました!

IIC IICのシミュレーションおよびハードウェアの呼び出し

私が開発したとき、私はこのような問題に遭遇しました。

IICプロトコルのいずれかのアナログはまた、ビルトインのハードウェアを使用することができます。問題があるので、私はIICは容易ではない、いくつかのチップのハードウェアが、私はシミュレーションを使用したいと思います。しかし、これらのスイッチは、多くのトラブルです。すべての機能は(C言語が同じ名前の関数をサポートしていません)を再度呼び出しIICデバイスを変更する必要があります。このよう多くのトラブルに。それのマクロ定義を使用すると、コードが肥大化となり、それぞれのローカル電話が必要になりますの#if ...他に#...#endifの。

この時点で、私は、関数ポインタを考えました。私はシミュレーションの機能にアナログIIC、IICポイントを使用する必要があります。ハードウェアIICを必要とする場合は、ハードウェアIICの機能を指します。これは、それができないのですか?試してみラッシュ!

typedef uint8_t (IIC_SEND)(uint8_t, uint8_t, uint8_t);
typedef uint8_t (IIC_READ)(uint8_t, uint8_t, uint8_t);

uint8_t Simulate_iic_send(uint8_t addr, uint8_t wbuffer, uint8_t length)
{
    //模拟IIC发送时序
}

uint8_t Hardware_iic_send(uint8_t addr, uint8_t wbuffer, uint8_t length)
{
    //硬件IIC发送实现
}


IIC_SEND fiic_send = Simulate_iic_send;
IIC_SEND fiic_send = Hardware_iic_send;

この場合、Iは初期化時に、アナログハードウェアIIC又はIICを用いて確認することができます。実際には、ポインタは、動作中に修正することができる、異なるモード(必ずしも必要ではない)を切り替えます。

拡張:それとも私たちが今IICスレーブモードすることができ、IICホストモードも、この方法で行うことができます。

概要

  1. 関数ポインタは、不確実性の状況で使用することができますがへのポインタを変更することができ、関数を呼び出す必要があります。
  2. 関数ポインタは、コードより簡単に移植を行います。この例では、アプリケーション層のみだけでポインタを呼び出して、実現することができる機能を変更する必要があります。
  3. これらを考えるだけなので、より良いアプリケーションと、後者は、更新していきます。

おすすめ

転載: www.cnblogs.com/Oushangrong/p/11014528.html