日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F7xx —— 看门狗

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F7xx —— 看门狗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STM32F7xx —— 看門狗

?

?

看門狗:指定時間內不喂狗,就重啟系統。

?

最簡單的看門狗設計(喂狗就是指定時間內給寄存器寫一個固定值)

// 初始化獨立看門狗 // prer:分頻數:0~7(只有低 3 位有效!) // rlr:自動重裝載值,0~0XFFF. // 分頻因子=4*2^prer.但最大值只能是 256! // rlr:重裝載寄存器值:低 11 位有效. // 時間計算(大概):Tout=((4*2^prer)*rlr)/32 (ms). static IWDG_HandleTypeDef iwdg_handle; void WatchdogInit(void) {iwdg_handle.Instance = IWDG;iwdg_handle.Init.Prescaler = 5;iwdg_handle.Init.Reload = 250;iwdg_handle.Init.Window = IWDG_WINDOW_DISABLE; // 關閉窗口功能HAL_IWDG_Init(&iwdg_handle);os_watchdog_lock = xSemaphoreCreateMutex(); }void WatchdogFeed(void) {HAL_IWDG_Refresh(&iwdg_handle); }

?

FreeRTOS看門狗設計(系統看門狗+任務看門狗)(其他操作系統也可以用這種思路)

任務看門狗:監控每個任務的活動狀態,如果任務卡死,會導致系統重啟。核心思想是使用計數,計數減為0后說明任務卡死。

TaskHandle_t os_watchdog_handle;// 互斥信號量 static SemaphoreHandle_t os_watchdog_lock; #define WATCHDOG_LOCK() xSemaphoreTake(os_watchdog_lock, 100); #define WATCHDOG_UNLOCK() xSemaphoreGive(os_watchdog_lock)#define WATCHDOG_CHECK_INTERVAL 100 // 100ms喂一次狗 #define WATCHDOG_POOL_SIZE (OS_PRIO_MAX + OS_PRIO_MAX - 1) // 任務池 2倍的任務-1typedef struct {TaskHandle_t handle; // 任務句柄const char *name; // 任務看門狗名稱uint16_t timeout; // 任務看門狗超時uint16_t time; // 任務看門狗計數uint8_t suspended; // 任務看門狗暫停 } watchdog_t;static watchdog_t watchdogs[WATCHDOG_POOL_SIZE];static void task_watchdog(void *params) {int i;while(1){WatchdogFeed();for(i = 0; i < WATCHDOG_POOL_SIZE; ++i){if(0 == watchdogs[i].handle){continue;}if(!watchdogs[i].suspended && watchdogs[i].time){--(watchdogs[i].time);}if(!watchdogs[i].suspended && (0 == watchdogs[i].time)){printf("!!!!!!!!!!!!!!!! Watchdog %s timeout !!!!!!!!!!!!!!!!\n", watchdogs[i].name);while(1); // reset}}vTaskDelay(WATCHDOG_CHECK_INTERVAL);} }// 初始化獨立看門狗 // prer:分頻數:0~7(只有低 3 位有效!) // rlr:自動重裝載值,0~0XFFF. // 分頻因子=4*2^prer.但最大值只能是 256! // rlr:重裝載寄存器值:低 11 位有效. // 時間計算(大概):Tout=((4*2^prer)*rlr)/32 (ms). static IWDG_HandleTypeDef iwdg_handle; void WatchdogInit(void) {iwdg_handle.Instance = IWDG;iwdg_handle.Init.Prescaler = 5;iwdg_handle.Init.Reload = 250;iwdg_handle.Init.Window = IWDG_WINDOW_DISABLE; // 關閉窗口功能HAL_IWDG_Init(&iwdg_handle);os_watchdog_lock = xSemaphoreCreateMutex();xTaskCreate((TaskFunction_t)task_watchdog,(const char* )"task_watchdog",(uint16_t )OS_WATCHDOG_STK_SIZE,(void* )NULL,(UBaseType_t )OS_PRIO_WATCHDOG,(TaskHandle_t* )&os_watchdog_handle); }void WatchdogFeed(void) {HAL_IWDG_Refresh(&iwdg_handle); }//=============================================================================================================== // 任務看門狗注冊 void WatchdogRegister(const char *name, uint16_t timeout) {int i;TaskHandle_t handle = xTaskGetCurrentTaskHandle();WATCHDOG_LOCK();for(i = 0; i < WATCHDOG_POOL_SIZE; ++i){if (handle == watchdogs[i].handle){WATCHDOG_UNLOCK();return;}}for(i = 0; i < WATCHDOG_POOL_SIZE; ++i){if (0 == watchdogs[i].handle){watchdogs[i].handle = handle;watchdogs[i].name = name;watchdogs[i].timeout = (timeout + WATCHDOG_CHECK_INTERVAL - 1) / WATCHDOG_CHECK_INTERVAL;watchdogs[i].time = watchdogs[i].timeout;watchdogs[i].suspended = 0;break;}}WATCHDOG_UNLOCK(); }// 任務看門狗喂狗 void WatchdogKick(void) {int i;TaskHandle_t handle = xTaskGetCurrentTaskHandle();for(i = 0; i < WATCHDOG_POOL_SIZE; ++i){if (handle == watchdogs[i].handle){WATCHDOG_LOCK();watchdogs[i].time = watchdogs[i].timeout;WATCHDOG_UNLOCK();break;}} }// 任務看門狗暫停 void WatchdogSuspend(void) {int i;TaskHandle_t handle = xTaskGetCurrentTaskHandle();for(i = 0; i < WATCHDOG_POOL_SIZE; ++i){if (handle == watchdogs[i].handle){WATCHDOG_LOCK();watchdogs[i].suspended = 1;WATCHDOG_UNLOCK();break;}} }// 任務看門狗恢復 void WatchdogResume(void) {int i;TaskHandle_t handle = xTaskGetCurrentTaskHandle();for(i = 0; i < WATCHDOG_POOL_SIZE; ++i){if (handle == watchdogs[i].handle){WATCHDOG_LOCK();watchdogs[i].time = watchdogs[i].timeout;watchdogs[i].suspended = 0;WATCHDOG_UNLOCK();break;}} }

?

?

?

?

?

總結

以上是生活随笔為你收集整理的STM32F7xx —— 看门狗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。