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.開発プロセス
ソフトウェアタイマー典型的な開発プロセス:
- コンフィギュレーション・ソフトウェアタイマ。
- そして、構成アイテムLOSCFG_BASE_CORE_SWTMR LOSCFG_BASE_IPC_QUEUE確認
開いた状態でYESを。 - サポートされるソフトウェアタイマのLOSCFG_BASE_CORE_SWTMR_LIMIT最大数を設定します。
- コンフィギュレーション・ソフトウェアタイマOS_SWTMR_HANDLE_QUEUE_SIZEキューの最大長。
- タイマーLOS_SwtmrCreateを作成します。
- 長い時間に指定された時間を作成し、指定されたタイムアウトハンドラは、ソフトウェアタイマ・トリガ・モードを指定しました。
- 関数は、業績、成功または失敗を返します。
- タイマーLOS_SwtmrStartを開始します。
- ティックLOS_SwtmrTimeGetを、残りのソフトウェアタイマへのアクセス。
- タイマーLOS_SwtmrStopを停止します。
- タイマー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例説明
次の例では、以下の機能を示します。
- ソフトウェアタイマを作成し、起動、削除、一時停止、運転を再開します。
単一のソフトウェアタイマー、ソフトウェアタイマ周期使用。
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結果を検証
結果は以下の通りでした: