vxWorks 6.9中的计时器

问题描述

在vxWorks 6.9中,您可以创建计时器,这些计时器实际上只是看门狗的包装。您为这些家伙提供了一个函数指针,一个延迟和最多一个参数,然后在延迟之后使用该参数调用该函数。但是,它在中断上下文中被调用。 (出于某种原因)这意味着您无法调用任何“阻塞”功能,否则系统实际上将崩溃。您不能调用printf,也不能调用对象的公共功能,即不能执行以下操作:

void Foo::WdCallback(Foo *foo){
    foo->DoThing();
}

wdStart(wd,16,(FUNCPTR)Foo::WdCallback,(_Vx_usr_arg_t)my_foo_ptr);

由于我不了解的原因,它也会崩溃。

我们还能通过什么其他方法在vxWorks中创建计时器/超时,以便我们实际上可以对回调做一些有用的事情?我见过的一种方法是使用消息队列-看门狗功能将调用消息队列发送功能。但是,这意味着必须创建一个任务以使该消息队列在其他地方出队。我还读到看门狗回调函数可以发出一个信号,允许任务继续执行,但这意味着我们必须为每个想要的基于计时器的函数创建一个任务。

无论在vxWorks中使用看门狗还是使用计时器,无论如何,我们都必须创建一个完整的任务,以便能够处理由于中断上下文而导致的看门狗回调。必须采用一种不太荒谬的方法来做到这一点。是否有纯C ++编写计时器的方法?或更简单的vxWorks实现?

解决方法

C++ 不得用于在中断上下文中执行的函数。这里的看门狗是在系统滴答中断的上下文中执行的。

如果您想保留 C++ 代码,请确保不会执行新建/删除操作,并且您需要使用添加标志编译代码(这应记录在 VxWorks 程序员指南的 C++ 部分 => - fno-rtti -fno-exceptions).

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...