信号槽使用mythread

This commit is contained in:
2025-06-25 11:29:06 +08:00
parent b64401d556
commit 2cfdb4a84f
8 changed files with 43 additions and 101 deletions

View File

@@ -7,73 +7,17 @@
#include <sys/sem.h>
#include <sys/types.h>
#include "errno.h"
#include "pthread.h"
#define CONSOLEBUF_SIZE 1024
#ifdef LINUX
union semun{
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
void _sem_take(int semid)//得到钥匙
{
struct sembuf sop;
sop.sem_num = 0;//控制第一个信号量
sop.sem_op = -1;//钥匙数量减一6
sop.sem_flg = SEM_UNDO;
semop(semid,&sop,1);
}
void _sem_relase(int semid)//放回钥匙
{
struct sembuf sop;
sop.sem_num = 0;
sop.sem_op = 1;
sop.sem_flg = SEM_UNDO;
semop(semid,&sop,1);
}
int _sem_init(){
key_t key;
int mutex;
key = ftok(".",5345);
// printf("sem init, key=%llu\n",key);
mutex = semget(key,1,IPC_CREAT);//创建信号量
// printf("sem init, mutex=%d\n",mutex);
if(mutex<=0){
// printf("%d\n",errno);
}
union semun set;
set.val = 1;//钥匙数量为0
semctl(mutex,0,SETVAL,set);
return mutex;
}
#endif
#ifdef RT_THREAD
#include "rtthread.h"
#endif
typedef struct{
int inited;
int print_context;
#ifdef RT_THREAD
struct rt_mutex mutex;
#endif
#ifdef LINUX
int mutex;
#endif
pthread_mutex_t mutex; /* 互斥锁定义 */
dbg_dev *dev;
}self_def;
@@ -105,17 +49,12 @@ int debug_init(dbg_dev *dev)
}
if(self->inited==0)
{
#ifdef RT_THREAD
rt_mutex_init(&self->mutex,"debug_mutex",RT_IPC_FLAG_FIFO);
#endif
#ifdef LINUX
self->mutex=_sem_init();
#endif
pthread_mutex_init(&self->mutex, NULL);
self->dev=dev;
self->dev->init();
self->dev->write((const uint8_t *)"\r\n",2);
self->inited = 1;
debug_print_context(1);
debug_print_context(0);
DBG_LOG("debug inited.\r\n");
}
return 0;
@@ -136,12 +75,7 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f
static const char *level_str[]={"[info] ","[log] ","[warn] ","[err] "};
static int level_str_len[]={7,6,7,6};
if(level<DBG_LEVEL_INFO||level>DBG_LEVEL_ERR) return;
#ifdef RT_THREAD
rt_mutex_take(&self->mutex,RT_WAITING_FOREVER);
#endif
#ifdef LINUX
_sem_take(self->mutex);
#endif
pthread_mutex_lock(&self->mutex);
memcpy(log_buf,level_str[level],level_str_len[level]);
length = level_str_len[level];
if (self->print_context) {
@@ -159,12 +93,8 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f
}
log_buf[length]=0;
self->dev->write((const uint8_t *)log_buf,length);
#ifdef RT_THREAD
rt_mutex_release(&self->mutex);
#endif
#ifdef LINUX
_sem_relase(self->mutex);
#endif
pthread_mutex_unlock(&self->mutex);
}