c - 在看门狗定时器存在的情况下编程

标签 c embedded watchdog

我是嵌入式系统编程的新手,虽然在学习期间做过类(class),但离实际编程还有点距离。

问题是:我必须在没有操作系统的情况下在 NXP LPC2103 微 Controller (基于 ARM 7)上编写一个小型系统。它有一个需要定期更新的看门狗定时器。该系统有一个嵌入了 TCP/IP 堆栈的 GPRS 调制解调器,初始化它所花费的时间比看门狗超时所需的时间要长。当我调用初始化函数时,系统重置。

我和一位更有经验的同事谈过,他建议我需要从主函数中退出并重新进入相​​同的初始化函数,在这个函数中我咬了看门狗定时器很长时间,直到函数完成执行。这个想法听起来不错,但我还想听听一些其他的经验。此外,引用资料(书籍或网站)也可能有用,因为我找不到任何具体的内容。

我不想从初始化函数中调用看门狗定时器,我觉得这不太好。

最佳答案

I wouldn't like to call watchdog timer from the initialization function, I don't find this good.

在这种情况下,这可能有点过头了,但是我在您可能想要执行其他工作的长时间运行的操作中使用的一种通用技术是让长时间运行的函数接受一个将定期调用的回调函数指针。我通常使用的模式是有一个回调原型(prototype),可能看起来像:

int (callback_t*)(void* progress, void* context);

长时间运行的函数将定期调用回调,其中包含一些指示其进度的信息(该进度如何表示其含义取决于特定函数的详细信息)以及原始调用者传递的上下文值in 以及回调指针(同样 - 该参数的含义以及它的解释方式完全取决于回调)。通常,回调函数的返回值可用于指示“长时间运行的事物”应该取消或以其他方式改变行为。

通过这种方式,您的初始化函数可以获取一个带有上下文值的回调指针,并定期调用它。显然,在您的情况下,这些回调必须足够频繁地发生才能让看门狗满意。

int watchdog_callback( void* progress, void* context)
{
    kick_the_watchdog();

    return 0;  // zero means 'keep going...'
}


void init_modem( callback_t pCallback, void* callback_context)
{
    // do some stuff

    pCallback( 0, callback_context);

    // do some other stuff

    pCallback( 1, callback_context);


    while (waiting_for_modem()) {
         // do work...

         pCallback( 2, callback_context);
    }    
}

这种模式的一个好处是它可以在不同的情况下使用——你可能有一个读取或写入大量数据的函数。回调模式可能用于显示进度。

请注意,如果您发现您有其他长时间运行的函数,可以使用相同的 watchdog_callback() 函数来让它们处理防止看门狗重置的问题。但是,如果您发现自己需要经常依赖这种类型的东西,尤其是看门狗,那么您可能需要考虑您的任务是如何交互的,或者将它们分解得更多,或者使用更复杂的看门狗方案来管理看门狗通过它自己的任务与其他任务交互,以间接地保持看门狗定时器的快乐。

关于c - 在看门狗定时器存在的情况下编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3139370/

相关文章:

按关键字关闭窗口

python - 使用 vim 写入文件不会在 OS X 上触发文件更改事件

python - 通过 CPython 执行跟踪 Python 字节码

Android:dlopen() 返回 64 位架构的悬挂指针

c - 与 gd php 扩展交互

java - 我可以在 QNX 上使用 Java 吗?

linux - 系统锁定或无限循环是否会导致重启?

c - 如何在 C 中连接数组中的整数二进制值?

python - watchdog.observers.Observer 在 Windows 中工作,在 Linux 上的 docker 中工作,在 Windows 上的 docker 中不起作用

debugging - 如何判断哪个任务死了?