问题在于:我必须在NXP LPC2103微控制器(基于ARM 7)上编写一个小型系统,而不需要操作系统.它有一个看门狗定时器,需要定期更新.该系统具有嵌入了TCP / IP堆栈的GPRS调制解调器,并且初始化这需要比看门狗需要超时的时间更长的时间.当我调用初始化函数时,系统重置.
我和一位经验更丰富的同事交谈过,他建议我退出并重新进入同一个初始化函数,从主函数开始,我将看门狗定时器咬了很久,直到函数完成执行.这个想法听起来不错,但我还想听听其他一些经历.此外,参考(书籍或网站)也可能有用,因为我找不到任何具体的内容.
解决方法
I wouldn’t like to call watchdog timer from the initialization function,I don’t find this good.
对于这种情况可能有点过头了,但是我用于长时间运行操作的一般技术是让你可能想要执行其他工作的是让长时间运行的函数接受将定期调用的回调函数指针.我通常使用的模式是有一个回调原型,可能看起来像:
int (callback_t*)(void* progress,void* context);
长时间运行的函数将定期调用回调,其中一些信息指示它的进度(如何表示该进度表示它取决于特定函数的详细信息)以及原始调用者传入的上下文值以及回调指针(再次 – 该参数的含义以及它的解释方式完全取决于回调).一般来说,回调函数的返回值可能用于指示“长时间运行的东西”应该取消或以其他方式改变行为.
这样,您的初始化函数可以使用带有上下文值的回调指针,并且只是定期调用它.显然,在你的情况下,那些回调必须经常发生,以保持看门狗的快乐.
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()函数来允许它们处理阻止看门狗重置的问题.但是,如果您发现自己需要经常为监视程序依赖此类事物,那么您可能需要考虑您的任务如何进行交互并将其分解得更多或使用更加复杂的监视程序方案来管理监视程序通过自己的任务,其他任务与之交互,以保持监视程序计时器间接满意.