问题遇到的现象和发生背景
使用RTAI实时信号量进行实时线程与非实时线程同步时,非实时线程拿不到实时信号量
操作环境、软件版本等信息
RTAI LXRT模块
尝试过的解决方法
编写测试用例,创建非实时线程和实时任务,测试实时信号量同步效果
#include <stdio.h>
#include <pthread.h>
#include <rtai_sched.h>
#include <rtai_sem.h>
// 定义全局的信号量变量
SEM *sem = NULL;
unsigned long sem_name = 10; // 信号量的名称
#if 0
// 非实时线程 线程1执行的函数
void* thread1_func(void* arg) {
printf("Thread 1 executing...\n");
if (sem != NULL)
{
printf("Thread 1\n");
//printf("rt_sem_wait(sem):%d\n",rt_sem_wait(sem));
// 等待信号量
if (rt_sem_wait(sem) == 0) {
printf("Thread 1 acquired the semaphore.\n");
// 释放信号量
rt_sem_signal(sem);
} else {
printf("Thread 1 failed to acquire the semaphore.\n");
}
}
printf("Thread 1 exiting...\n");
return NULL;
}
#endif
void* thread1_func(void* arg)
{
int tick = 3;
//RT_TASK* task = rt_task_shadow(nam2num("rtai"), "nonrt_task", SCHED_FIFO, 0);
mlockall(MCL_CURRENT | MCL_FUTURE);
printf("Non-realtime thread executing...\n");
if (sem != NULL) {
// 等待信号量
if (rt_sem_wait(sem) == 0) {
printf("Non-realtime thread acquired the semaphore.\n");
// 释放信号量
rt_sem_signal(sem);
} else {
printf("Non-realtime thread failed to acquire the semaphore.\n");
}
}
printf("Non-realtime thread exiting...\n");
//rt_task_delete(task);
return NULL;
}
// 实时线程 线程2执行的函数
void* thread2_func(void* arg)
{
int tick = 3;
RT_TASK* task = rt_task_init_schmod(nam2num("rtai"), 0, 0, 0, SCHED_FIFO, 255);
mlockall(MCL_CURRENT | MCL_FUTURE);
RTIME interval = nano2count(tick * 1000);
RTIME expected = rt_get_time() + 100 * interval;
rt_task_make_periodic(task, expected, interval);
rt_make_hard_real_time();
printf("Thread 2 executing...\n");
if (sem != NULL)
{
// 等待信号量
if (rt_sem_wait(sem) == 0) {
printf("Thread 2 acquired the semaphore.\n");
// 释放信号量
rt_sem_signal(sem);
} else {
printf("Thread 2 failed to acquire the semaphore.\n");
}
}
printf("Thread 2 exiting...\n");
rt_task_delete(task);
return NULL;
}
int main() {
sem = rt_sem_init(sem_name, 1);
// 打印初始信号量值
printf("Initial semaphore opaque: %p\n", sem);
//printf("Initial semaphore opaque: %d\n", sem->opaque);
printf("sem_name: %lu\n", sem_name);
// 创建线程1
pthread_t thread1;
if (pthread_create(&thread1, NULL, thread1_func, NULL) != 0) {
printf("Failed to create thread 1.\n");
return 1;
}
pthread_t thread2;
if (pthread_create(&thread2, NULL, thread2_func, NULL) != 0) {
printf("Failed to create thread 2.\n");
return 1;
}
usleep(1000000);
#if 1
// 等待线程1完成
if (pthread_join(thread1, NULL) != 0) {
printf("Failed to join thread 1.\n");
return 1;
}
// 等待线程2完成
if (pthread_join(thread2, NULL) != 0) {
printf("Failed to join thread 2.\n");
return 1;
}
#endif
// 删除信号量
if (sem != NULL)
{
printf("rt_sem_delete...\n");
rt_sem_delete(sem);
}
return 0;
}
我想要达到的结果
RTAI环境下,使用实时信号量实现实时线程与非实时线程的同步