task watchdog timeout immediately when no hw watchdog fallback is configured

Hey.

I have a problem where the task watchdog times out immediately.

I have taken the samples/basic/task_wdt sample and modified it a bit to simulate what I have in my own code: 

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);
	if (ret != 0) {
		printk("task wdt init failure: %d\n", 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;
}

CONFIG_LOG=y
CONFIG_LOG_MODE_IMMEDIATE=y

CONFIG_WATCHDOG=y

CONFIG_TASK_WDT=y

CONFIG_THREAD_NAME=y
CONFIG_TASK_WDT_HW_FALLBACK=n

In main i have made the change that im not parsing the hw_wdt_dev to task_wdt_init as the hw watchdog is setup later im my code. 

And in the config i have disabled CONFIG_TASK_WDT_HW_FALLBACK.

I can see that the callback is called immediately. But if i change next_timeout = INT64_MAX to next_timeout = INT64_MAX - 0x0f in task_wdt.c then all of a sudden stuff starts to work.

static void schedule_next_timeout(int64_t current_ticks)
{
	uintptr_t next_channel_id;	/* channel which will time out next */
	int64_t next_timeout;		/* timeout in absolute ticks of this channel */

#ifdef CONFIG_TASK_WDT_HW_FALLBACK
	next_channel_id = TASK_WDT_BACKGROUND_CHANNEL;
	next_timeout = current_ticks +
		k_ms_to_ticks_ceil64(CONFIG_TASK_WDT_MIN_TIMEOUT);
#else
	next_channel_id = 0;
	next_timeout = INT64_MAX - 0x0f;
#endif

What can be the problem? 

Related