RCEVT 框架是一种基于字符串的信号传递机制,适用于任何操作系统。
该框架可用于在RCINIT 任务与序列组中启动的其他任务之间传递信号。
这些信号是字符串,任何任务都可以等待 RCEVT 事件。
此外,如果涉及的任务具有正确的名称,任何任务都可以发出事件信号。
一、将 RCEVT 用于 POSIX
包括 rcevt_posix.h 文件,该文件提供对 RCEVT API 和 NHLOS 内核信令 API 的访问。
- 注册事情,在C代码中添加如下命令:
#include <rcevt_posix.h>
pthread_mutex_t posix_mutex;
pthread_mutexattr_t posix_mutexattr;
pthread_cond_t posix_cond;
pthread_condattr_t posix_condattr;
RCEVT_SIGEX_SIGPOSIX rcevt_sigex;
pthread_mutexattr_init(&posix_mutexattr);
pthread_mutex_init(&posix_mutex, &posix_mutexattr);
pthread_mutexattr_destroy(&posix_mutexattr);
pthread_condattr_init(&posix_condattr);
pthread_cond_init(&posix_cond, &posix_condattr);
pthread_condattr_destroy(&posix_condattr);
rcevt_sigex.mutex_p = &posix_mutex;
rcevt_sigex.cond_p = &posix_cond;
if (RCEVT_NULL == rcevt_register_sigex_name(RCEVT_EVENTNAME,
RCEVT_SIGEX_TYPE_SIGPOSIX, &rcevt_sigex))
{
MSG(“event register” ); // handle error
}
// utilization of specific NHLOS convenience API wrappers is suggested
- 等待事件,添加以下代码
pthread_mutex_lock(&posix_mutex);
pthread_cond_wait(&posix_cond, &posix_mutex);
pthread_mutex_unlock(&posix_mutex);
MSG(“event handler” );
- 要发出事件信号,添加以下代码
if (RCEVT_NULL == rcevt_signal_name(RCEVT_EVENTNAME))
{
MSG(“event signal” ); // handle error
}
- 要取消注册事件,添加以下代码
if (RCEVT_NULL == rcevt_unregister_sigex_name(RCEVT_EVENTNAME, RCEVT_SIGEX_TYPE_SIGPOSIX, &rcevt_sigex))
{
MSG(“event unregister” ); // handle error
}
pthread_mutex_destroy(&posix_mutex);
pthread_cond_destroy(&posix_cond);
二、将 RCEVT 用于 QuRT
包括 rcevt_qurt.h 文件,该文件提供对 RCEVT API 和 NHLOS 内核信令 API 的访问。
- 要注册一个事件,在头文件中添加以下代码
qurt_anysignal_t qurt_signal;
RCEVT_SIGEX_SIGQURT rcevt_sigex;
qurt_anysignal_init(&qurt_signal);
rcevt_sigex.signal = &qurt_signal;
rcevt_sigex.mask = RCEVT_QURT_SIGNAL_MASK;
if (RCEVT_NULL == rcevt_register_sigex_name(RCEVT_EVENTNAME, RCEVT_SIGEX_TYPE_SIGQURT, &rcevt_sigex))
{
MSG(“event register” ); // handle error
}
// utilization of specific NHLOS convenience API wrappers is suggested
- 要等待事件,添加以下代码
unsigned int recv = qurt_anysignal_wait(&qurt_signal,
RCEVT_QURT_SIGNAL_MASK);
if (0 == (recv & RCEVT_QURT_SIGNAL_MASK))
{
MSG(“event wait” ); // handle error
}
else
{
MSG(“event handler” );
}
- 要发出事件信号,添加以下代码
if (RCEVT_NULL == rcevt_signal_name(RCEVT_EVENTNAME))
{
MSG(“event signal” ); // handle error
}
- 要取消注册事件,添加以下代码
if (RCEVT_NULL == rcevt_unregister_sigex_name(RCEVT_EVENTNAME, RCEVT_SIGEX_TYPE_SIGQURT, &rcevt_sigex))
{
MSG(“event unregister” ); // handle error
}
qurt_anysignal_destroy(&qurt_signal);
三、将 RCEVT 用于 REX
包括 rcevt_rex.h 文件,该文件提供对 RCEVT API 和 NHLOS 内核信令 API 的访问。
使用QuRT 和 DAL API,而不是 REX API。
- 要注册一个事件,在头文件中添加以下代码
RCEVT_SIGEX_SIGREX rcevt_sigex;
rcevt_sigex.signal = rex_self();
rcevt_sigex.mask = RCEVT_REX_SIGNAL_MASK;
if (RCEVT_NULL == rcevt_register_sigex_name(RCEVT_EVENTNAME,RCEVT_SIGEX_TYPE_SIGREX, &rcevt_sigex))
{
MSG(“event register” ); // handle error
}
// utilization of specific NHLOS convenience API wrappers is suggested
- 要等待事件,添加以下代码
rex_sigs_type recv = rex_wait(RCEVT_REX_SIGNAL_MASK);
if (0 == (recv & RCEVT_REX_SIGNAL_MASK))
{
MSG(“event wait” ); // handle error
}
else
{
MSG(“event handler” );
}
- 要发出事件信号,添加以下代码
if (RCEVT_NULL == rcevt_signal_name(RCEVT_EVENTNAME))
{
MSG(“event signal” ); // handle error
}
- 要取消注册事件,添加以下代码
if (RCEVT_NULL == rcevt_unregister_sigex_name(RCEVT_EVENTNAME, RCEVT_SIGEX_TYPE_SIGREX, &rcevt_sigex))
{
MSG(“event unregister” ); // handle error
}
#To signal an event, add this code:
if (RCEVT_NULL == rcevt_signal_name(RCEVT_EVENTNAME))
{
MSG(“event signal” ); // handle error
}