情報はハードウェア ホームから取得されます:情報の概要 - FreeRTOS リアルタイム オペレーティング システム コース (マルチタスク管理)
目次
1. 独立したウォッチドッグの概要
2. ウォッチドッグ監視マルチタスク実行のアイデア
1. モニタリングの目的
① システムクラッシュの監視
②タスク実行の監視
2. モニタリング計画
例証します:
①、監視タスクは、独立したウォッチドッグを通じて自身を監視します。長期間実行されない場合、ウォッチドッグはタスクをリセットします。システム;
②、監視タスクはイベント フラグを通じて他のタスクを監視します。タスクが長時間実行できない場合、ウォッチドッグはリセット。システム;
③、 監視タスクは、監視対象タスクから送信されたすべてのイベント フラグを受信した後でのみ犬に餌を与えます。
3. 使用上の注意
①、犬に時間内に餌を与えることができるように、監視タスクの優先順位が最高レベルに設定されています
②、監視タスクも監視対象タスクも一時停止または削除できません。そうしないと、犬の餌やりが間に合わず、システムはリセットされます a>
③. ドッグの給餌時間は監視タスクの最大送信イベントマーク間隔で決まり、十分な余裕があります。
④、 イベントフラグの下位 24 ビットのみが利用可能であることを考慮すると、監視タスクの最大数は 24 で十分です。
3. ウォッチドッグ監視マルチタスクプログラミング
1. STM32cubeMXの構成
監視タスクの優先度は最高レベルに設定する必要があります。犬に餌をやる
2. コードの書き方
①イベントビットをセットする
/* USER CODE BEGIN PD */
#define BIT_Task01_EVENT (EventBits_t)(0x0001 << 0)
#define BIT_Task02_EVENT (EventBits_t)(0x0001 << 1)
#define BIT_Task03_EVENT (EventBits_t)(0x0001 << 2)
#define BIT_Task04_EVENT (EventBits_t)(0x0001 << 3)
#define BIT_TaskAll_EVENT BIT_Task01_EVENT | BIT_Task02_EVENT | BIT_Task03_EVENT | BIT_Task04_EVENT
/* USER CODE END PD */
②イベントを作成する
/* USER CODE BEGIN Init */
MyEvent01Handle = xEventGroupCreate();//创建事件
/* USER CODE END Init */
③監視業務
void IWDG_Monitor_Task(void const * argument)
{
/* USER CODE BEGIN IWDG_Monitor_Task */
EventBits_t xEvent;
const TickType_t xTicksToWait = 6000 / portTICK_PERIOD_MS;//设置等待时间
/* Infinite loop */
for(;;)
{
xEvent = xEventGroupWaitBits(
MyEvent01Handle,//事件句柄
BIT_TaskAll_EVENT,//事件
pdTRUE,//退出时清除事件位
pdTRUE,//逻辑与,满足所有事件
xTicksToWait//等待时间
);
if((xEvent&(BIT_TaskAll_EVENT)) == (BIT_TaskAll_EVENT))
{
sprintf(buff,"%s \r\n","喂狗,监测任务与被监测任务均正常执行");
HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);
HAL_IWDG_Refresh(&hiwdg);
}
else
{
}
}
/* USER CODE END IWDG_Monitor_Task */
}
④監視対象タスク
void StartTask01(void const * argument)
{
/* USER CODE BEGIN StartTask01 */
/* Infinite loop */
for(;;)
{
osDelay(1000);
xEventGroupSetBits(MyEvent01Handle,BIT_Task01_EVENT);
}
/* USER CODE END StartTask01 */
}
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
osDelay(2000);
xEventGroupSetBits(MyEvent01Handle,BIT_Task02_EVENT);
}
/* USER CODE END StartTask02 */
}
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
osDelay(3000);
xEventGroupSetBits(MyEvent01Handle,BIT_Task03_EVENT);
}
/* USER CODE END StartTask03 */
}
void StartTask04(void const * argument)
{
/* USER CODE BEGIN StartTask04 */
/* Infinite loop */
for(;;)
{
osDelay(4000);
xEventGroupSetBits(MyEvent01Handle,BIT_Task04_EVENT);
}
/* USER CODE END StartTask04 */
}
4. 低消費電力ティックレスモード
① バッテリー製品は、農業用IoT用のノード収集装置など、一般に低消費電力設計が求められます。
②低消費電力設計はMCUに加え、ソフトウェア、ハードウェアの設計も同様に重要
③チックレスモードは主にスリープモードですが、もちろんシャットダウンモードやスタンバイモードも自分で使用することができます。
1.ティックレスモードの概要
ティックレス低消費電力メカニズムは、FreeRTOS、RTX、uCOS-III などの現在の小型 RTOS で使用される一般的な低消費電力方式です。文字だけを見ると、Tick は時を刻む時計を意味し、less は Tick の接尾語で、少ないという意味です。全体的には、時を刻む時計の実行を減らす という意味です。 。
FreeRTOS システムでは、ユーザー タスクが一時停止またはブロックされると、最も優先度の低いアイドル タスクが実行されます。これにより、STM32 がサポートする低消費電力モードをアイドル タスクに実装できます。最適な低電力設計を実現するために、アイドル状態のタスクに直接スリープ モードを設定することはできません。 Tick割り込みが停止するため、ブロッキングタイムアウトが発生したタスクの実行が間に合わなくなり、アイドルタスクに入った後、低消費電力で実行できる最大時間、つまり残り時間がどのくらいかを計算する必要があります。次に実行される優先度の高いタスク。次に、低電力ウェイクアップ時間をこの計算された時間に設定します (実際には Systick をリロードします)。STM32 をウェイクアップする他の割り込みやイベントがない場合、Systick 割り込みはその時間の後に STM32 をウェイクアップし、実行を継続します。タスク。
これはいわゆるティックレスモードです。上記の説明からわかるように、Tickless モードを実装する際に最も面倒なのは、低消費電力で実行できる時間を計算することです。 FreeRTOS はこの問題を解決してくれました。
2.ティックレスモードの設定
① マクロ定義configUSE_TICKLESS_IDLEを1に設定します。
② 構成configEXPECTED_IDLE_TIME_BEFORE_SLEEP (システムが低電力モードで実行できるクロック数が以下の場合のみ)このパラメータを使用すると、システムは低消費電力モードに入ることができます。このパラメータは FreeRTOS.h ファイルで定義されています。デフォルトは 2 です。ユーザーがカスタマイズできる場合、2 未満にすることはできません
3.ティックレスモードプログラミング
①STM32cubeMX構成
②configEXPECTED_IDLE_TIME_BEFORE_SLEEP設定
(低消費電力に入る最小 Tick、実際の Tick が設定 Tick より小さい場合、低消費電力にはなりません) 通常、デフォルトの 2 Tick で十分です。変更する必要がある場合は、変更しないでください。ソース コード、FreeRTOSConfig.h のマクロを再定義します。
/* USER CODE BEGIN 1 */
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 10
/* USER CODE END 1 */
③ティックレスモードに入るときと出るときにコードを追加し、通常は周辺機器などをオフにします。
これは、低消費電力が正常にオンになっているかどうかを確認するためにのみ書かれています。
/* USER CODE BEGIN PREPOSTSLEEP */
__weak void PreSleepProcessing(uint32_t *ulExpectedIdleTime)
{
//进入休眠前,关闭外设等
/* place for user code */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
__weak void PostSleepProcessing(uint32_t *ulExpectedIdleTime)
{
//退出休眠,开启外设等
/* place for user code */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
/* USER CODE END PREPOSTSLEEP */