カーネルコントロール

[API]

Modules

* vTaskStartScheduler
* vTaskEndScheduler
* vTaskSuspendAll
* xTaskResumeAll

詳細な記述


taskYIELD

task. h

コンテキストスイッチを強制するためのマクロ。


taskENTER_CRITICAL

task. h

クリティカルなコードリージョンのスタートをマークするマクロ。 クリティカルリージョンの中では、プリエンティブなコンテキストスイッチは起きません。

ノート:これは(ポータブル実装によっては)スタックの変更をするかもしれません、充分な注意が必要です!


taskEXIT_CRITICAL

task. h

クリティカルなコードリージョンの終端にマークするマクロ。 クリティカルリージョンの中では、プリエンティブなコンテキストスイッチは起きません。

ノート:これは(ポータブル実装によっては)スタックの変更をするかもしれません、充分な注意が必要です!


taskDISABLE_INTERRUPTS

task. h

すべてのマスカブルインタラプトを禁止するマクロ。

taskENABLE_INTERRUPTS

task. h

マイクロコントローラー割り込みを許可する。


vTaskStartScheduler

[Kernel Control]

task. h
void vTaskStartScheduler( void );

リアルタイムカーネルのチック(システム・クロック)処理を始めます。 コールした後では、カーネルが、どのタスクがいつ実行されるかについてのコントロール権を持っています。

vTaskStartScheduler() が呼び出すと、アイドル・タスクは自動的に作成されます。
もし vTaskStartScheduler() が成功したなら、実行しているタスクが vTaskEndScheduler() を呼び出すまで、この関数から戻らない。この 関数はもし作成されるアイドル・タスクの利用開始に充分なRAM が無い場合、失敗して直ちに戻る。

タスク作成し、カーネルを開始についてのデモアプリケーションファイル main. cを参照してください。
使用例:

 void vAFunction( void ) 
 { 
     // Create at least one task before starting the kernel. 
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

     // Start the real time kernel with preemption. 
     vTaskStartScheduler();

     // Will not get here unless a task calls vTaskEndScheduler () 
 } 

vTaskEndScheduler

[Kernel Control]

task. h
void vTaskEndScheduler( void );

リアルタイムカーネルチック(システム・クロック)を停止する。 すべての作成されたタスクは自動的にデリートされる、そして(プリエンティブでも協調的でも)マルチタスク処理は停止する。 vTaskStartScheduler() からちょうど戻ったところであるかのように、そこから実行が再開します。

vTaskEndScheduler() を使う例はデモアプリケーションファイル main. cを参照してください。

vTaskEndScheduler() の出口関数をポータブルレイヤの中で定義する(PCポートのport. cで vPortEndScheduler() を見よ)必要がある。 これはカーネルチック(システムクロック)を止めるようなハードウェアに特定されたオペレーションを実行する。

vTaskEndScheduler() がカーネルによって割り当てられたリソースのすべてを開放しますが− しかしアプリケーションタスクによって割り当てられたリソースを開放はしません。

例使用法:

 void vTaskCode( void * pvParameters ) 
 { 
     for( ;; ) { 
         // Task code goes here.

         // At some point we want to end the real time kernel processing 
         // so call ... 
         vTaskEndScheduler(); 
     } 
 }

 void vAFunction( void ) 
 { 
     // Create at least one task before starting the kernel. 
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

     // Start the real time kernel with preemption. 
     vTaskStartScheduler();

     // Will only get here when the vTaskCode () task has called 
     // vTaskEndScheduler (). When we get here we are back to single task 
     // execution. 
 } 

vTaskSuspendAll

[Kernel Control]

task. h

void vTaskSuspendAll( void );

割り込み(カーネルチックを含めて)を使用可能のまま、すべてのリアルタイム・カーネル・アクティビティを一時停止します。

vTaskSuspendAll() を呼び出した後で、 xTaskResumeAll() のコールがされるまで、呼び出したタスクはスワップアウトされる危険なしで実行し続ける。

スケジューラが一時停止されている間に、コンテキストスイッチを起こす可能性を持っている API 関数(例えば、 vTaskDelayUntil() 、 xQueueSend() など)を呼び出しは禁止です。

使用例:

 void vTask1( void * pvParameters ) 
 { 
     for( ;; ) { 
         // Task code goes here.

         // ...

         // At some point the task wants to perform a long operation during 
         // which it does not want to get swapped out. It cannot use 
         // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the 
         // operation may cause interrupts to be missed - including the 
         // ticks.

         // Prevent the real time kernel swapping out the task. 
         vTaskSuspendAll ();

         // Perform the operation here. There is no need to use critical 
         // sections as we have all the microcontroller processing time. 
         // During this time interrupts will still operate and the kernel 
         // tick count will be maintained.

         // ...

         // The operation is complete. Restart the kernel. 
         xTaskResumeAll (); 
     } 
 } 

xTaskResumeAll

[Kernel Control]

task. h

portBASE_TYPE xTaskResumeAll( void );

vTaskSuspendAll() への呼び出しの後、リアルタイムカーネルアクティビティーを再開します。 xTaskSuspendAll() へのコールの後に、どのタスクがいつ実行するかについて、カーネルはコントロール権を持つ。

リターン:
もしスケジューラーを再スタートに際してコンテキストスイッチを起こしたなら、 pdTRUE が返り、さもなければ pdFALSE が返る。

使用例:

 void vTask1( void * pvParameters ) 
 { 
     for( ;; ) { 
         // Task code goes here.

         // ...

         // At some point the task wants to perform a long operation during 
         // which it does not want to get swapped out. It cannot use 
         // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the 
         // operation may cause interrupts to be missed - including the 
         // ticks.

         // Prevent the real time kernel swapping out the task. 
         xTaskSuspendAll ();

         // Perform the operation here. There is no need to use critical 
         // sections as we have all the microcontroller processing time. 
         // During this time interrupts will still operate and the real 
         // time kernel tick count will be maintained.

         // ...

         // The operation is complete. Restart the kernel. We want to force 
         // a context switch - but there is no point if resuming the scheduler 
         // caused a context switch already. 
         if( !xTaskResumeAll () ) { 
             taskYIELD (); 
         } 
     } 
 }