+スターの公開アカウントをフォローして、エキサイティングなコンテンツを見逃さないようにしましょう
著者 | 黃強
WeChat パブリックアカウント | StrongHuang
市場のほとんどのオペレーティング システムには、 HOOK 関数 (フック関数とも呼ばれます)というタイプの API 関数インターフェイスがあります。
Windows や Linux などのデスクトップ オペレーティング システム、および RT-Thread、µC/OS、FreeRTOS リアルタイム オペレーティング システムはすべて、HOOK 関数の存在を認識できます。
「HOOK機能とは何ですか?」という疑問を持つネットユーザーも多いはずです。何に使われますか?
µC/OS と組み合わせた HOOK 機能について説明します。
HOOK関数とは何ですか?
HOOK 関数はフック関数とも呼ばれ、オペレーティング システムによって内部的に呼び出される関数です。
HOOK が有効な場合、特定のイベントが到着すると、オペレーティング システムは対応するフック関数 (作成したフック関数) を呼び出します。
たとえば、RTOS でタスクが削除されると、対応するApp_TaskIdleHook関数が呼び出されます。(この「App_TaskIdleHook」関数は自分で書く必要があります)
HOOK コンテンツをオンラインで検索する場合、ほとんどのコンテンツでは Windows を例として機能とフック関数の例が説明されています (Baidu Encyclopedia など)。
フック関数は Windows メッセージ処理メカニズムの一部であり、「フック」を設定することにより、アプリケーションはシステム レベルですべてのメッセージとイベントをフィルタリングし、通常の状況ではアクセスできないメッセージにアクセスできます。フックの本質は、システム メッセージを処理するために使用されるプログラムであり、システム コールを通じてシステムにフックされます。
なぜ「フック」と呼ばれるのですか?
インターネット上には、オペレーティング システムに「引っ掛かっている」などの言葉がたくさんあります。興味のある読者はオンラインで詳細をご覧ください。
HOOK関数の目的と使い方
µC/OS や FreeRTOS などのよく知られた RTOS リアルタイム オペレーティング システムにはすべてフック機能があり、構成構成ファイルで対応するスイッチを有効にすることで使用できます。
µC/OS と組み合わせた HOOK 関数の目的と使用法について説明します。
1.フックの設定
多くの RTOS には、システムを構成 (調整) するための 1 つ (または複数) の構成ファイルがあります。
たとえば、µC/OS には、os_cfg.h システム構成ファイルがあります。実際、これらは、切断システムの機能を実現するために必要な機能をオンにする、必要のない機能を有効にするスイッチです。
/* ---------------------- MISCELLANEOUS ----------------------- */
#define OS_APP_HOOKS_EN 1 /* Application-defined hooks are called from the uC/OS-II hooks */
#define OS_ARG_CHK_EN 0 /* Enable (1) or Disable (0) argument checking */
#define OS_CPU_HOOKS_EN 1 /* uC/OS-II hooks are found in the processor port files */
#define OS_DEBUG_EN 1 /* Enable(1) debug variables */
同様に、HOOK 機能も次のような cfg 構成ファイルを通じて有効になります。
#define OS_APP_HOOKS_EN 1
#define OS_CPU_HOOKS_EN 1
0: 閉じています。
1: 開いた状態。
同様に、FreeRTOS にも同様の構成があります。
これを有効にするには、HOOK を使用する必要があります。
2.TaskIdleHookを使用する
TaskIdleHook (タスク アイドル フック関数) は、タスクがアイドル状態のときに呼び出されます。
このフック関数は多くのオペレーティング システムで利用でき、タスクがアイドル状態 (他のすべてのタスクが中断されている状態) のときに呼び出されます。
例: CPU 使用率と呼ばれるものは、アイドル状態のタスクで測定されます。μC/OS を例に挙げます。
void OS_TaskIdle (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
p_arg = p_arg; /* Prevent compiler warning for not using 'p_arg' */
for (;;) {
OS_ENTER_CRITICAL();
OSIdleCtr++;
OS_EXIT_CRITICAL();
OSTaskIdleHook(); /* Call user definable HOOK */
}
}
システムアイドルフック関数OSTaskIdleHook:
#if OS_CPU_HOOKS_EN > 0u
void OSTaskIdleHook (void)
{
#if OS_APP_HOOKS_EN > 0u
App_TaskIdleHook();
#endif
}
#endif
アプリケーションアイドルフック関数 App_TaskIdleHook:
有効になっている場合、この関数はどのように実行できますか? 自分で実装する必要があります。たとえば、アイドル統計値が 50 回を超えた場合、次の情報を出力します。
void App_TaskIdleHook (void)
{
UserIdleCtr++; //¿ÕÏмÆÊý
if(50 < UserIdleCtr)
{
UserIdleCtr = 0;
printf("SYS_IDLE");
}
}
これを見て、HOOK関数の原理が理解できましたか?実際、システム内から段階的に分析するのは非常に簡単です。
オペレーティング システムはほとんどの時間アイドル状態にあるため、IDLE アイドル関数はより頻繁に実行されますが、これは多くの人には理解されない可能性があります。
前述したように、HOOK関数は特定のイベントが到来すると呼び出されて実行されますが、 IDLEアイドルタスクの方が多く、Taskタスクの削除などのイベントは稀であるため、この種のHOOK関数はほとんど生成されません。
さて、ここでは主にシェアしていきますので、HOOK関数の理解の一助になれば幸いです!
------------ 終了 ------------
公式アカウントをフォローして「グループを追加」と返信するとルールに従って技術交流グループに参加でき、「1024」と返信するとさらにコンテンツが閲覧できます。
さらに共有を表示するには、「元のテキストを読む」をクリックしてください。