DirectFB源代码阅读(三)线程及信号初始化

本文详细介绍了DirectFB中线程与信号的初始化过程,包括TSD的创建与注销、线程绑定数据的访问、线程的创建与分离等,并讲解了DirectFB如何初始化信号处理函数以确保程序正常退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用DirectFB创建一个程序的时候,要执行两个初始化函数,上一篇文章讲了第一个DirectFBInit,下面几篇讲第二个DirectFBCreate.

DirectFBCreate主要调用了三个函数:

1.direct_initialize:线程及信号初始化

2.dfb_core_create:各个子系统的初始化

3.IDirectFB_Construct:构造一个IDirectFB对象

线程thread.c

先介绍几个下面用到的线程的知识:
1.TSD(Thread Specific Data)的创建与注销:
int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *))
int pthread_key_delete(pthread_key_t key)
2.为每个应用线程提供对一个唯一的对象,访问自己用key定义的绑定数据:
int pthread_setspecific(pthread_key_t key, const void *pointer)
void * pthread_getspecific(pthread_key_t key)

3.int pthread_join __P (pthread _t __th, void **__thread_return);
用来等待一个线程的结束,使用此函数对创建的线程进行资源回收
4. pthread_detach( thread->thread );
使线成分离出来。当这个线程执行完成任务后释放释放资源。不然它会保留退出状态,等待pthread_join来取。
5pthread_create创建线程
direct_initalize只调用了下面函数来完成线程的初始化:
  1. void direct_thread_set_name( const char *name )  
  2. {  
  3.      DirectThread *thread = pthread_getspecific( thread_key );//得到thread_key绑定的数据   
  4.      if (!thread) {  
  5.           if (thread_key == -1)  
  6.                pthread_key_create( &thread_key, NULL );//创建一个类型为 pthread_key_t类型的变量   
  7.   
  8.           thread = D_CALLOC( 1, sizeof(DirectThread) );  
  9.   
  10.           thread->thread = pthread_self();  
  11.           thread->tid    = direct_gettid();  
  12.   
  13.           D_MAGIC_SET( thread, DirectThread );  
  14.   
  15.           pthread_setspecific( thread_key, thread );//保存要绑定的数据   
  16.      }  
  17.      copy = D_STRDUP( name );  
  18.      thread->name = copy;  
  19. }  
void direct_thread_set_name( const char *name )
{
     DirectThread *thread = pthread_getspecific( thread_key );//得到thread_key绑定的数据
     if (!thread) {
          if (thread_key == -1)
               pthread_key_create( &thread_key, NULL );//创建一个类型为 pthread_key_t类型的变量

          thread = D_CALLOC( 1, sizeof(DirectThread) );

          thread->thread = pthread_self();
          thread->tid    = direct_gettid();

          D_MAGIC_SET( thread, DirectThread );

          pthread_setspecific( thread_key, thread );//保存要绑定的数据
     }
     copy = D_STRDUP( name );
     thread->name = copy;
}
还有几个主要的函数:
1.direct_thread_add_init_handler,注册需要线程处理的函数
2.direct_thread_create,主要是调用pthread_creat创建线程
3.direct_thread_main执行前面注册的函数

信号初始化signals.c

DirectFB默认初始化了一系列的处理引起程序退出的信号的处理函数.在程序退出之前这些信号处理函数将重新初始化DirectFB引擎.
主要函数有:
1. install_handlers( void )
信号初始化
2.signal_handler( int num )
处理这一特定的信号
3.direct_signal_handler_add
增加某一特定信号的处理函数
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <termios.h> #include <pthread.h> //串口初始化功能函数,fd:串口驱动设备的文件描述符 int tty_init(int fd) { //串口参数结构体 struct termios old_uart,new_uart; //清空结构体变量内容,memset bzero(&old_uart,sizeof(struct termios)); bzero(&new_uart,sizeof(struct termios)); //获取串口属性,旧的串口 tcgetattr(fd,&old_uart); //设置原始属性,重新设置属性 cfmakeraw(&new_uart); //激活本地连接CLOCAL与接收使能CREAD的选项 new_uart.c_cflag |= CLOCAL|CREAD; //设置输出、输入波特率 cfsetospeed(&new_uart, B115200); cfsetispeed(&new_uart, B115200); //设置数据位为8位 new_uart.c_cflag &= ~CSIZE; new_uart.c_cflag |= CS8; //无校验位 new_uart.c_cflag &= ~PARENB; //1个停止位 new_uart.c_cflag &= ~CSTOPB; //设置等待时间、最小接收字符个数 new_uart.c_cc[VTIME] = 0; new_uart.c_cc[VMIN] = 1; new_uart.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //本地模式设置为原始模式 //清空缓冲区 tcflush(fd,TCIOFLUSH); //设置串口属性到文件中 -- 生效属性 tcsetattr(fd, TCSANOW,&new_uart); return 0; } void *BLE_Send(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *s_msg = (char *)malloc(1024); //申请写入数据的空间 while(1) { printf("send:"); //从键盘输入数据保存到msg中 fgets(s_msg,1024,stdin); write(ble_fd,s_msg,strlen(s_msg)); //写数据 if(strncmp(s_msg,"quit",4)==0) { memset(s_msg,0,1024); break; } //清空内存 memset(s_msg,0,1024); } //释放堆空间 free(s_msg); } void *BLE_Recv(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *r_msg = (char *)malloc(1024); //申请接收数据的空间 while(1) { //读取串口接收的数据 read(ble_fd,r_msg,1024); printf("recv:%s\n",r_msg); if(strncmp(r_msg,"quit",4)==0) { memset(r_msg,0,1024); break; } //清空内存 memset(r_msg,0,1024); } //释放堆空间 free(r_msg); } int main(int argc,char *argv[]) { pthread_t ble_tid1=0,ble_tid2=0; //访问串口1驱动 int ble_fd = open("/dev/ttySAC1",O_RDWR); if(ble_fd==-1) { printf("open BLE error...\n"); return -1; } //串口初始化 tty_init(ble_fd); //串口数据读写线程 pthread_create(&ble_tid1,NULL,BLE_Send,(void *)&ble_fd); pthread_create(&ble_tid2,NULL,BLE_Recv,(void *)&ble_fd); //接合线程 pthread_join(ble_tid1,NULL); pthread_join(ble_tid2,NULL); //关闭文件 close(ble_fd); return 0; }用c语言修改代码:使用蓝牙通信,手机发送“prev”显示上一张图片,发送"next"显示下一张图片
最新发布
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值