liteosソフトウェアタイマー(X)

1つの概要

1.1基本概念

ソフトウェアタイマは、システムクロックに基づいて定義されたユーザへのダニクロックカウント値がコールバック関数をトリガするとした後、ソフトウェア割り込み、タイマによってシミュレートTICK。システムサイクルのクロックとタイミング精度をチェック。

数のユーザーの実際のニーズを満たすために十分なハードウェアの制限により、ハードウェアタイマー、、、顧客のニーズを満たすために、より多くのタイマーを提供して、Huawei社LiteOSオペレーティングシステムは、ソフトウェアタイマ機能を提供します。

ソフトウェアタイマーはタイマーの数を拡大し、タイミングはより多くのビジネスを作成することができます。

ソフトウェアタイマ機能のサポート:

  • 静的なカッティング:マクロタイマー機能を通じてソフトウェアを閉じます。
  • ソフトウェアタイマを作成します。
  • ソフトウェアタイマーがスタートします。
  • ソフトウェアタイマが停止しています。
  • ソフトウェアは、タイマーを削除します。
  • ソフトウェアタイマの残り数を取得ダニ

1.2操作機構

ソフトウェアタイマは、システム・リソースで、モジュールの初期化は、連続したメモリの一部を割り当てられている、システムタイマによってサポートされる最大数はLOSCFG_BASE_CORE_SWTMR_LIMITマクロでlos_config.hによって構成されています。

ソフトウェアは、タイマーキューとタスク資源システムを使用して、ソフトウェアタイマキュートリガは、ルールに従って
、その後、FIFOを。ショートタイマーが期限切れになったトリガーされる優先順位の基準を満たすためにキュー時間の頭の近くに常に長いタイミングを超えています。

基本時間単位、ユーザーが作成したソフトウェア・タイマを開始すると、HuaweiLiteOSは、現在のシステム時間に従って、タイマータイミング間隔の目盛りの有効期限を決定し、ユーザにより設定されたダニ、及びタイマ制御にソフトウェアタイマをチェックタイミング構造は、グローバル連鎖リストを従事しました。

割り込みがティックを到着すると、タイムアウトタイマーが記録される場合は、ティックは、タイマーが満了したかどうかを確認するためにグローバルリスト・ハンドラースキャンソフトウェアタイマーでタイマーを中断します。ティック割り込みハンドラの後、ソフトウェアタイマタスク(最高の優先度)は、このタスクタイマーに呼び出す前に記録されたタイムアウトコールバック関数を目覚めさせられます。

タイマステータス

  • OS_SWTMR_STATUS_UNUSED(未使用)

システムのタイマーが状態タイマーのすべてのリソースに初期化され、システムの初期化モジュール。

  • OS_SWTMR_STATUS_CREATED(作成がスタート/ストップしません)

起動後のインターフェイスまたはインターフェイスのコールLOS_SwtmrStopで、未使用の状態をLOS_SwtmrCreate呼び出した後、一定
時間が状態になります。

  • OS_SWTMR_STATUS_TICKING(カウント)

タイマーがLOS_SwtmrStartインタフェースを作成した後に呼び出して、タイマーは、タイマーの状態が実行されている表し、状態に変わります。

タイマ・モードの
Huawei社LiteOSソフトウェアタイマは、タイマ機構の2種類が用意されています。

  • 最初はタイマーのこのタイプは一度だけタイマーイベントを開始した後、タイマーが自動的に削除トリガされ、ワンショットタイマです。
  • 第二のカテゴリーは、サイクルタイマーがトリガされ、ユーザーが手動でタイマーを停止するまで、タイマーのこのタイプは、定期的に、それ以外の場合は永遠に実行に行くだろう、タイマーイベントをトリガ

2.開発ガイダンス

2.1利用シナリオ

  • ワンショット・タイマを作成し、タイムアウト後、ユーザー定義のコールバック関数を実行します。
  • 、周期タイマーがトリガされたタイムアウト後にユーザー定義のコールバック関数の実装を作成します。

2.2の機能

Huawei社LiteOSシステムソフトウェアタイマモジュール以下のいくつかの機能をユーザーに提供し、次の特定のAPIのソフトウェアタイマの外部インタフェースのマニュアルを参照してください。

機能分類 インタフェース名 説明
作成し、タイマーを削除 LOS_SwtmrCreate タイマーを作成します。
- LOS_SwtmrDelete タイマーを削除します。
タイマーを起動および停止 LOS_SwtmrStart タイマーを開始します
- LOS_SwtmrStop タイマーを停止します
ソフトウェアタイマーの残り数を取得するダニ LOS_SwtmrTimeGet ソフトウェアタイマーの残り数を取得するダニ

3.開発プロセス

ソフトウェアタイマー典型的な開発プロセス:

  1. コンフィギュレーション・ソフトウェアタイマ。
  • そして、構成アイテムLOSCFG_BASE_CORE_SWTMR LOSCFG_BASE_IPC_QUEUE確認
    開いた状態でYESを。
  • サポートされるソフトウェアタイマのLOSCFG_BASE_CORE_SWTMR_LIMIT最大数を設定します。
  • コンフィギュレーション・ソフトウェアタイマOS_SWTMR_HANDLE_QUEUE_SIZEキューの最大長。
  1. タイマーLOS_SwtmrCreateを作成します。
  • 長い時間に指定された時間を作成し、指定されたタイムアウトハンドラは、ソフトウェアタイマ・トリガ・モードを指定しました。
  • 関数は、業績、成功または失敗を返します。
  1. タイマーLOS_SwtmrStartを開始します。
  2. ティックLOS_SwtmrTimeGetを、残りのソフトウェアタイマへのアクセス。
  3. タイマーLOS_SwtmrStopを停止します。
  4. タイマーLOS_SwtmrDeleteを削除します。

4.ソフトウェアタイマーのエラーコード

など、作成、削除、一時停止、タイマーを再起動するなどのソフトウェア・タイマの動作の故障の可能性があり、すぐにエラーの原因を突き止めるために、対応するエラーコードを返すように要求されています。

いいえ。 定義 実際の値 説明 リファレンス・ソリューション
1 LOS_ERRNO_SWTMR_PTR_NULL 0x02000300 ソフトウェアタイマーコールバック関数は空です カスタムソフトウェアタイマーコールバック関数
2 LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITD 0x02000301 0のソフトウェアタイマー間隔 間隔を再定義
3 LOS_ERRNO_SWTMR_MODE_INVALI D 0x02000302 不正なソフトウェアタイマモード 範囲内のソフトウェアタイマー確認モード、[0,2]
4 LOS_ERRNO_SWTMR_RET_PTR_NULL 0x02000303 ソフトウェアタイマIDは、パラメータにNULLポインタであります 変数定義IDは、ポインタが渡されました
5 LOS_ERRNO_SWTMR_MAXSIZE 0x02000304 ソフトウェアタイマーが最大数を超えて タイマーの最大数を再定義、またはソフトウェアタイマーリソースのリリースを待ちます
6 LOS_ERRNO_SWTMR_ID_INVALID 0x02000305 上院への不正なソフトウェアタイマID その法的なパラメータを確実にするために、
7 LOS_ERRNO_SWTMR_NOT_CREATED 0x02000306 ソフトウェアタイマーが作成されていません ソフトウェアタイマを作成します。
8 LOS_ERRNO_SWTMR_NO_MEMORY 0x02000307 ソフトウェアタイマリストを作成するのに十分なメモリ ソフトウェアタイマーの使用のために十分な大きさのメモリを適用します。
9 LOS_ERRNO_SWTMR_MAXSIZE_INVALID 0x02000308 ソフトウェアタイマーの誤った最大数 値を再定義
10 LOS_ERRNO_SWTMR_HWI_ACTIVE 0x02000309 タイマ割り込みを使用します 使用中のものが中断を保証しないためにソースコードを変更します。
11 LOS_ERRNO_SWTMR_HANDLER_POOL_NO_MEM 0x0200030a メモリのうちmembox 拡張メモリ
12 LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED 0x0200030b ソフトウェアタイマーキューの作成に失敗しました キュー妥当性を作成するために使用されるメモリをチェック
13 LOS_ERRNO_SWTMR_TASK_CREATE_FAILED 0x0200030c ソフトウェアタイマータスクの作成に失敗しました ソフトウェアタイマの妥当性を作成するために、メモリのタスクを確認し、再作成
14 LOS_ERRNO_SWTMR_NOT_STARTED 0x0200030d ソフトウェアタイマーが起動しません。 ソフトウェアタイマを起動します
15 LOS_ERRNO_SWTMR_STATUS_INVALID 0x0200030e 不正なソフトウェアタイマステータス そのソフトウェアタイマの状態を確認
16 LOS_ERRNO_SWTMR_SORTLIST_NULL ヌル ノー エラーコードが使用されていません
17 LOS_ERRNO_SWTMR_TICK_PTR_NULL 0x02000310 ダニタイマーの数を取得するには、引数ポインタは、ソフトウェアがNULLで期限切れになります 有効な変数を作成します。

エラーが:エラー・コードは32ビットのメモリセルではない、エラーレベルを示す31〜24、23〜16は、エラーコードフラグを示し、15 8ビットは、エラーコードがモジュール7〜0は、エラーコード番号を示し属する表します次のように

#define LOS_ERRNO_OS_NORMAL(MID,ERRNO) \
(LOS_ERRTYPE_NORMAL | LOS_ERRNO_OS_ID | ((UINT32)(MID) << 8) | (ERRNO))
LOS_ERRTYPE_NORMAL :Define the error level as critical
LOS_ERRNO_OS_ID :OS error code flag.
MID:OS_MOUDLE_ID
ERRNO:error ID number

例えば:

#define LOS_ERRNO_SWTMR_PTR_NULL \
LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x00)

5.プログラミング例

5.1例説明

次の例では、以下の機能を示します。

  1. ソフトウェアタイマを作成し、起動、削除、一時停止、運転を再開します。
  2. 単一のソフトウェアタイマー、ソフトウェアタイマ周期使用。

    5.2プログラミング例

    前提条件:
  • los_config.hで、LOSCFG_BASE_CORE_SWTMR開いた構成アイテム。
  • LOSCFG_BASE_CORE_SWTMR_LIMITは、ソフトウェアタイマーの最大数をサポートするように設定しました。
  • OS_SWTMR_HANDLE_QUEUE_SIZEソフトウェアタイマキューの最大長を設定しました。

コードは次のように実装されています。

void Timer1_Callback(uint32_t arg); // callback fuction
void Timer2_Callback(uint32_t arg);
UINT32 g_timercount1 = 0;
UINT32 g_timercount2 = 0;
void Timer1_Callback(uint32_t arg)//回调函数1
{
    unsigned long tick_last1;
    g_timercount1++;
    tick_last1=(UINT32)LOS_TickCountGet();//获取当前Tick数
    dprintf("g_timercount1=%d\n",g_timercount1);
    dprintf("tick_last1=%d\n",tick_last1);
}
void Timer2_Callback(uint32_t arg)//回调函数2
{
    unsigned long tick_last2;
    tick_last2=(UINT32)LOS_TickCountGet();
    g_timercount2 ++;
    dprintf("g_timercount2=%d\n",g_timercount2);
    dprintf("tick_last2=%d\n",tick_last2);
}
void Timer_example (void) {
    UINT16 id1;
    UINT16 id2;// timer id
    UINT32 uwTick;
    /*创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */
    LOS_SwtmrCreate (1000, LOS_SWTMR_MODE_ONCE,Timer1_Callback,&id1,1);
    /*创建周期性软件定时器,每100Tick数执行回调函数2 */
    LOS_SwtmrCreate(100,LOS_SWTMR_MODE_PERIOD,Timer2_Callback,&id2,1);
    dprintf("create Timer1 success\n");
    LOS_SwtmrStart (id1); //启动单次软件定时器
    dprintf("start Timer1 sucess\n");
    LOS_TaskDelay(200);//延时200Tick数
    LOS_SwtmrTimeGet(id1,&uwTick);//获得单次软件定时器剩余Tick数
    dprintf("uwTick =%d\n",uwTick);
    LOS_SwtmrStop(id1);//停止软件定时器
    dprintf("stop Timer1 sucess\n");
    LOS_SwtmrStart(id1);
    LOS_TaskDelay(1000);
    LOS_SwtmrDelete(id1);//删除软件定时器
    dprintf("delete Timer1 sucess\n");
    LOS_SwtmrStart(id2);//启动周期性软件定时器
    dprintf("start Timer2\n");
    LOS_TaskDelay(1000);
    LOS_SwtmrStop(id2);
    LOS_SwtmrDelete(id2);
}

5.3結果を検証

結果は以下の通りでした:

おすすめ

転載: www.cnblogs.com/linhaostudy/p/10963066.html