91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【瑞薩RA × Zephyr評(píng)測(cè)】多線程和看門狗

楓雪天 ? 來源:楓雪天 ? 作者:楓雪天 ? 2026-01-10 10:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Zephyr 應(yīng)用在 FPB-RA6E2 開發(fā)板上的評(píng)測(cè):多線程與看門狗

本文章旨在評(píng)估使用 Zephyr RTOS 在 Renesas FPB-RA6E2 開發(fā)板上實(shí)現(xiàn)多線程調(diào)度與硬件看門狗功能的應(yīng)用。評(píng)估內(nèi)容包括任務(wù)調(diào)度、看門狗初始化流程、主程序邏輯的詳細(xì)解析,以及實(shí)驗(yàn)現(xiàn)象與數(shù)據(jù)分析。


1. 硬件連接與引腳定義

本實(shí)驗(yàn)涉及的任務(wù)調(diào)度和看門狗功能不依賴特定的物理引腳,但需要確保開發(fā)板支持硬件看門狗外設(shè)。

功能物理引腳 (Pin)信號(hào)定義接線說明
看門狗內(nèi)部外設(shè)WDT Timer無(wú)需外部連接

2. 軟件環(huán)境配置

2.1 Device Tree Overlay

設(shè)備樹用于定義硬件看門狗的初始狀態(tài)。以下是關(guān)鍵配置:

看門狗配置

wdt: wdt@40083400 {
	compatible = "renesas,ra-wdt"; /* in externalzephyrdtsarmrenesasrara6ra6-cm33-common.dtsi:542 */
	reg = < 0x40083400 0x200 >;    /* in externalzephyrdtsarmrenesasrara6ra6-cm33-common.dtsi:543 */
	clocks = < &pclkb 0x0 0x0 >;   /* in externalzephyrdtsarmrenesasrara6ra6-cm33-common.dtsi:544 */
	status = "okay";               /* in externalzephyrboardsrenesasfpb_ra6e2fpb_ra6e2.dts:135 */
	};
	};
};

2.2 Kconfig 配置 (prj.conf)

確保啟用了多線程和看門狗驅(qū)動(dòng)支持:

CONFIG_MULTITHREADING=y
CONFIG_WATCHDOG=y
CONFIG_TASK_WDT=y
CONFIG_LOG=y

3. 代碼邏輯分析

3.1 主程序代碼(main.c)

#include < zephyr/kernel.h >
#include < zephyr/device.h >
#include < zephyr/drivers/watchdog.h >
#include < zephyr/sys/reboot.h >
#include < zephyr/task_wdt/task_wdt.h >
#include < zephyr/sys/printk.h >
#include < stdbool.h >

/*
 * To use this sample, either the devicetree's /aliases must have a
 * 'watchdog0' property, or one of the following watchdog compatibles
 * must have an enabled node.
 *
 * If the devicetree has a watchdog node, we get the watchdog device
 * from there. Otherwise, the task watchdog will be used without a
 * hardware watchdog fallback.
 */
#if DT_NODE_HAS_STATUS_OKAY(DT_ALIAS(watchdog0))
#define WDT_NODE DT_ALIAS(watchdog0)
#elif DT_HAS_COMPAT_STATUS_OKAY(st_stm32_window_watchdog)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(st_stm32_window_watchdog)
#elif DT_HAS_COMPAT_STATUS_OKAY(st_stm32_watchdog)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(st_stm32_watchdog)
#elif DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_wdt)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(nordic_nrf_wdt)
#elif DT_HAS_COMPAT_STATUS_OKAY(espressif_esp32_watchdog)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(espressif_esp32_watchdog)
#elif DT_HAS_COMPAT_STATUS_OKAY(silabs_gecko_wdog)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(silabs_gecko_wdog)
#elif DT_HAS_COMPAT_STATUS_OKAY(nxp_wdog32)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(nxp_wdog32)
#elif DT_HAS_COMPAT_STATUS_OKAY(microchip_xec_watchdog)
#define WDT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(microchip_xec_watchdog)
#else
#define WDT_NODE DT_INVALID_NODE
#endif

static void task_wdt_callback(int channel_id, void *user_data)
{
	printk("Task watchdog channel %d callback, thread: %sn",
		channel_id, k_thread_name_get((k_tid_t)user_data));

	/*
	 * If the issue could be resolved, call task_wdt_feed(channel_id) here
	 * to continue operation.
	 *
	 * Otherwise we can perform some cleanup and reset the device.
	 */

	printk("Resetting device...n");

	sys_reboot(SYS_REBOOT_COLD);
}

int main(void)
{
	int ret;
	const struct device *const hw_wdt_dev = DEVICE_DT_GET_OR_NULL(WDT_NODE);

	printk("Task watchdog sample application.n");

	if (!device_is_ready(hw_wdt_dev)) {
		printk("Hardware watchdog not ready; ignoring it.n");
		ret = task_wdt_init(NULL);
	} else {
		ret = task_wdt_init(hw_wdt_dev);
	}

	if (ret != 0) {
		printk("task wdt init failure: %dn", ret);
		return 0;
	}


	/* passing NULL instead of callback to trigger system reset */
	int task_wdt_id = task_wdt_add(1100U, NULL, NULL);

	while (true) {
		printk("Main thread still alive...n");
		task_wdt_feed(task_wdt_id);
		k_sleep(K_MSEC(1000));
	}
	return 0;
}

/*
 * This high-priority thread needs a tight timing
 */
void control_thread(void)
{
	int task_wdt_id;
	int count = 0;

	printk("Control thread started.n");

	/*
	 * Add a new task watchdog channel with custom callback function and
	 * the current thread ID as user data.
	 */
	task_wdt_id = task_wdt_add(100U, task_wdt_callback,
		(void *)k_current_get());

	while (true) {
		if (count == 50) {
			printk("Control thread getting stuck...n");
			k_sleep(K_FOREVER);
		}

		task_wdt_feed(task_wdt_id);
		k_sleep(K_MSEC(50));
		count++;
	}
}

K_THREAD_DEFINE(control, 1024, control_thread, NULL, NULL, NULL, -1, 0, 1000);

3.2 核心流程

多線程調(diào)度

  1. 創(chuàng)建高優(yōu)先級(jí)線程 control_thread,用于模擬實(shí)時(shí)任務(wù)。
  2. 主線程運(yùn)行低優(yōu)先級(jí)任務(wù),定期喂養(yǎng)看門狗。
  3. 當(dāng)高優(yōu)先級(jí)線程卡住時(shí),觸發(fā)看門狗回調(diào)或系統(tǒng)復(fù)位。

看門狗流程

  1. 初始化硬件看門狗或任務(wù)看門狗。
  2. 為每個(gè)線程注冊(cè)獨(dú)立的看門狗通道,并設(shè)置超時(shí)時(shí)間。
  3. 定期調(diào)用 task_wdt_feed 函數(shù)喂養(yǎng)看門狗。
  4. 如果某個(gè)線程未能及時(shí)喂養(yǎng),觸發(fā)回調(diào)函數(shù)或系統(tǒng)復(fù)位。

3.3 關(guān)鍵 API 使用

以下是代碼中使用的關(guān)鍵 API:

多線程管理

K_THREAD_DEFINE(thread_name, stack_size, entry_point, arg1, arg2, arg3, prio, options, delay);
  • thread_name: 線程名稱。
  • stack_size: 線程棧大小。
  • entry_point: 線程入口函數(shù)。
  • prio: 線程優(yōu)先級(jí)。

看門狗初始化

int task_wdt_init(const struct device *hw_wdt_dev);
  • hw_wdt_dev: 硬件看門狗設(shè)備句柄(可為空)。

看門狗通道管理

int task_wdt_add(uint32_t timeout_ms, task_wdt_callback_t callback, void *user_data);
void task_wdt_feed(int channel_id);
  • timeout_ms: 超時(shí)時(shí)間(毫秒)。
  • callback: 超時(shí)回調(diào)函數(shù)。
  • channel_id: 看門狗通道 ID。

4. 實(shí)驗(yàn)現(xiàn)象與數(shù)據(jù)分析

4.1 多線程調(diào)度行為

  • 主線程 : 每秒打印一次日志,表明其仍在運(yùn)行。
  • 高優(yōu)先級(jí)線程 : 模擬實(shí)時(shí)任務(wù),每 50 毫秒喂養(yǎng)看門狗,運(yùn)行 50 次后故意卡住。

終端應(yīng)顯示如下數(shù)據(jù)流:

*** Booting Zephyr OS build v4.2.0 ***
Task watchdog sample application.
[00:00:00.005,000] [0m< inf > wdt_renesas_ra: actual window min = 0.00 ms[0m
[00:00:00.012,000] [0m< inf > wdt_renesas_ra: actual window max = 671.00 ms[0m
[00:00:00.019,000] [0m< inf > wdt_renesas_ra: wdt timeout was set successfully[0m
Main thread still alive...
Control thread started.
Main thread still alive...
Main thread still alive...
Main thread still alive...
Control thread getting stuck...
Task watchdog channel 1 callback, thread: control
Resetting d?*** Booting Zephyr OS build v4.2.0 ***
Task watchdog sample application.
[00:00:00.005,000] [0m< inf > wdt_renesas_ra: actual window min = 0.00 ms[0m
[00:00:00.012,000] [0m< inf > wdt_renesas_ra: actual window max = 671.00 ms[0m
[00:00:00.019,000] [0m< inf > wdt_renesas_ra: wdt timeout was set successfully[0m
Main thread still alive...
Control thread started.

4.2 看門狗復(fù)位行為

  • 正常運(yùn)行 : 看門狗被定期喂養(yǎng),系統(tǒng)保持穩(wěn)定。
  • 異常情況 : 高優(yōu)先級(jí)線程卡住后,看門狗超時(shí)觸發(fā)回調(diào)或系統(tǒng)復(fù)位。
  • 視覺效果 : 使用調(diào)試器觀察復(fù)位信號(hào),確認(rèn)系統(tǒng)重啟。

5. 測(cè)評(píng)總結(jié)

本程序成功演示了 Renesas RA6E2 在 Zephyr RTOS 下的多線程調(diào)度與看門狗功能。通過模擬高優(yōu)先級(jí)任務(wù)卡住的場(chǎng)景,驗(yàn)證了任務(wù)看門狗對(duì)系統(tǒng)穩(wěn)定性的保護(hù)作用。代碼結(jié)構(gòu)清晰,適配了最新的驅(qū)動(dòng) API,適用于初學(xué)者學(xué)習(xí)和開發(fā)者快速驗(yàn)證硬件功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45494

    瀏覽量

    670260
  • 看門狗
    +關(guān)注

    關(guān)注

    10

    文章

    610

    瀏覽量

    72933
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    26

    文章

    6289

    瀏覽量

    118048
  • Zephyr
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    6579
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32中的獨(dú)立看門狗和窗口看門狗是什么

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機(jī),跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門狗發(fā)展到今天基本上分為兩大類:獨(dú)立看門狗
    的頭像 發(fā)表于 02-20 17:47 ?4364次閱讀
    STM32中的獨(dú)立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>是什么

    FPB-RA6E2試用】【RA × Zephyr開發(fā)板評(píng)測(cè)】Linux環(huán)境配置和初步試用

    1. 前言 很榮幸獲得了RA × ZephyrFPB-
    發(fā)表于 12-29 12:55

    FPB-RA6E2試用】【FPB-RA6E2】看門狗(Watchdog Timer, WDT)個(gè)人理解及資料整理

    FPB-RA6E2】看門狗(Watchdog Timer, WDT)個(gè)人理解及資料整理
    發(fā)表于 01-14 11:09

    FPB-RA6E2試用】Zephyr看門狗(WDT)機(jī)制

    程序卡死未按時(shí)喂狗,看門狗就會(huì)直接切斷并復(fù)位MCU的電源軌,讓系統(tǒng)重啟。 在傳統(tǒng)的裸機(jī)開發(fā)中,配置看門狗需要翻閱芯片手冊(cè),操作復(fù)雜的控制寄存器和分頻器。而在Zephyr中,無(wú)論底層是
    發(fā)表于 02-20 10:35

    什么是看門狗電路

    看門狗電路 看門狗電路一般有軟件看門狗和硬件看門狗兩種。軟件看門狗不需外接硬件電路,但系統(tǒng)需要出讓一個(gè)定時(shí)器資源,這在許多系統(tǒng)中很
    發(fā)表于 10-21 01:40 ?8754次閱讀

    stm32看門狗時(shí)間計(jì)算 獨(dú)立看門狗和窗口看門狗的特性是什么

    本文為您講解STM看門狗時(shí)間計(jì)算(時(shí)限)與頻率計(jì)算,獨(dú)立看門狗和窗口看門狗的特性、區(qū)別與聯(lián)系。
    發(fā)表于 10-10 10:41 ?9382次閱讀

    什么是stm32看門狗?獨(dú)立看門狗和窗口看門狗工作原理解析

    stm32有兩個(gè)看門狗,獨(dú)立看門狗和窗口看門狗,其實(shí)兩者的功能是類似的,只是喂狗的限制時(shí)間不同。 獨(dú)立看門狗
    的頭像 發(fā)表于 11-06 11:48 ?2.8w次閱讀
    什么是stm32<b class='flag-5'>看門狗</b>?獨(dú)立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>工作原理解析

    STM32看門狗配置(獨(dú)立看門狗IWDG和窗口看門狗WWDG)

    stm32自帶兩個(gè)看門狗模塊,獨(dú)立看門狗IWDG和窗口看門狗WWDG。看門狗主要作用是可用來檢測(cè)和解決由軟件錯(cuò)誤引起的故障;當(dāng)計(jì)數(shù)器達(dá)到給定的超時(shí)值時(shí),觸發(fā)一個(gè)中斷(僅適用于窗口型
    發(fā)表于 11-09 17:17 ?8839次閱讀
    STM32<b class='flag-5'>看門狗</b>配置(獨(dú)立<b class='flag-5'>看門狗</b>IWDG和窗口<b class='flag-5'>看門狗</b>WWDG)

    MCU獨(dú)立看門狗與窗口看門狗的區(qū)別

    早期的MCU沒有看門狗,就容易引起有些產(chǎn)品死機(jī)了不能重啟工作。為了避免這個(gè)問題,后期的MCU在內(nèi)部集成了看門狗的功能。為了滿足更多使用場(chǎng)景,現(xiàn)在很多MCU都集成了兩個(gè)看門狗:獨(dú)立看門狗
    發(fā)表于 10-28 20:06 ?8次下載
    MCU獨(dú)立<b class='flag-5'>看門狗</b>與窗口<b class='flag-5'>看門狗</b>的區(qū)別

    【奇葩-002】調(diào)教Renesas RX130獨(dú)立看門狗

    RX130的看門狗,配置后必須要喂狗一次,才能激活;否則就不工作。
    發(fā)表于 12-20 19:01 ?7次下載
    【奇葩<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>-002】調(diào)教Renesas RX130獨(dú)立<b class='flag-5'>看門狗</b>

    STM32:獨(dú)立看門狗、窗口看門狗的配置

    STM32單片機(jī)的看門狗有獨(dú)立看門狗和窗口看門狗之分,這兩者的工作原理卻完全不同。
    發(fā)表于 02-08 16:15 ?18次下載
    STM32:獨(dú)立<b class='flag-5'>看門狗</b>、窗口<b class='flag-5'>看門狗</b>的配置

    STM32中的獨(dú)立看門狗和窗口看門狗

    一、前言 在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機(jī),跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門狗發(fā)展到今天基本上分為兩大類:獨(dú)立
    的頭像 發(fā)表于 12-22 16:58 ?3185次閱讀

    STM32中的獨(dú)立看門狗和窗口看門狗

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機(jī),跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門狗發(fā)展到今天基本上分為兩大類:獨(dú)立看門狗
    的頭像 發(fā)表于 01-30 14:38 ?2557次閱讀
    STM32中的獨(dú)立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>

    e2studio----獨(dú)立看門狗IWDT

    概述本篇文章主要介紹如何使用e2studio對(duì)進(jìn)行獨(dú)立看門狗IWDT配置,并且配置RTC時(shí)鐘產(chǎn)生1s的周期中斷,通過串口打印查看獨(dú)立看門狗IWDT的計(jì)數(shù)值。
    的頭像 發(fā)表于 11-26 17:18 ?2514次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b>e2studio----獨(dú)立<b class='flag-5'>看門狗</b>IWDT

    e2studio----看門狗WDT

    本篇文章主要介紹如何使用e2studio對(duì)進(jìn)行看門狗WDT配置,并且配置RTC時(shí)鐘產(chǎn)生1s的周期中斷,通過串口打印查看看門狗WDT的計(jì)數(shù)值。
    的頭像 發(fā)表于 12-02 17:54 ?2945次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b>e2studio----<b class='flag-5'>看門狗</b>WDT