上机030线程

线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程的创建与终止
在Ubuntu中,pthread库默认不存在,须进行安装
sudo apt install -y glibc-doc manpages-posix-dev

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_17,color_FFFFFF,t_70,g_se,x_16 

安装完成后可查看pthread使用手册man pthreads

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

使用vim pthread_create.c来编辑代码创建或终止线程
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

其中:

thread表示,在线程创建成功的时候,用来接收线程的线程id; attr表示的是所创建线程的属性,一般情况使用NULL,表示缺省属性。 start_routine是一个(参数是void*,返回值是void*)函数指针,子线程的执行函数(需要由用户自定义)的地址; arg是给start_routine做为参数。

返回值:

成功返回0 失败返回错误号;

pthread_exit()为终止线程

创建进程与终止进程的示例如下

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

编辑完成后可使用makefile来对其进行编译
使用vim makefile来编辑makefile如下

'gcc wenjianming.c -o wenjianming.out'

运行结果如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_15,color_FFFFFF,t_70,g_se,x_16 

线程的连接与分离
线程的连接
int pthread_join(pthread_t thread, void **retval);

参数1:thread表示等待的子线程的线程id; 参数2:retval用来接收返回结果, 成功返回0 失败返回错误号;

线程的分离
‘int pthread_detach(pthread_t thread);’

thread表示分离的子线程的线程id; 成功返回0 失败返回错误号

线程的连接与分离示例
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

运行结果如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_17,color_FFFFFF,t_70,g_se,x_16 

使用互斥量保护多线程同时输出
初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);

mutex表示的是互斥锁的标号; mutexattr表示的互斥锁的属性,一般情况使用NULL,表示缺省属性。 成功返回0 失败返回错误号

在访问临界资源前,需要上锁
‘int pthread_mutex_lock(pthread_mutex_t *mutex);’

在访问临界资源结束,需要解锁
'int pthread_mutex_unlock(pthread_mutex_t *mutex);'

互斥锁示例如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

运行结果如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_12,color_FFFFFF,t_70,g_se,x_16 

条件变量
条件变量是利用线程共享的全局变量进行同步的一种机制,只要包括两个动作:一个线程等待某个条件为真,而将自己挂起(进入等待队列);另一个线程的条件成立,并通知等待队列中的线程继续。为了防止竞争,条件变量总是和一个互斥锁结合在一起使用

示例如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

运行结果如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_14,color_FFFFFF,t_70,g_se,x_16 

进程
进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。

测试获取环境变量代码
通过main() 函数的第三个参数获取
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_14,color_FFFFFF,t_70,g_se,x_16 

通过environ全局变量获取
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_15,color_FFFFFF,t_70,g_se,x_16 

测试创建进程程序代码
fork()函数创建进程
在Linux系统中,创建一个子进程需要用到fork();需要引用头文件unistd.h;main函数是父进,在fork函数之后通过判断fork函数的返回值来判断哪一部分代码是子进程模块的,返回值为0的为子进程,大于0的为父进程,后面代码部分为公共部分。

#include <unistd.h>
pid_t fork(void);
示例如下
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

运行结果
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_14,color_FFFFFF,t_70,g_se,x_16 

使用daemon 创建守护进程
守护进程是脱离于终端并且在后台运行,周期性的执行某种任务或者等待处理某些发生的事件进程。

使用‘daemon()’创建守护进程

示例

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

信号函数sigaction的使用
信号函数用来通知进程发生了异步事件

示例
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16

 

但因为没有信号发生所以运行结果如下图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_17,color_FFFFFF,t_70,g_se,x_16

 

开发板
虚拟开发板准备完毕后使用

~/ubuntu-18.04_imx6ul_qemu_system/gui-qemu-imx6ull-gui.sh

打开开发板

LCD屏幕/图像
使用fb-test打开屏幕,./myfb-test /dev/fb0打开图像

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16 

 

串口 EEPROM
列出所有串口cd ~;i2cdetect -l && i2cdetect -y 0
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16

 

写入i2c_usr_test /dev/i2c-0 0x50 w 0x01 0xff
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_20,color_FFFFFF,t_70,g_se,x_16

 

读取$ i2c_usr_test /dev/i2c-0 0x50 w 0x33
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_4,color_FFFFFF,t_70,g_se,x_16 

命令控制LED
打开LED控制以及安装LED驱动
cd ~
cd led_driver_qemu/
insmod 100ask_led.ko
控制LED零号灯亮,LED一号灯灭:
./ledtest /dev/100ask_led0 on
./ledtest /dev/100ask_led1 off
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_11,color_FFFFFF,t_70,g_se,x_16 

按键控制LED
启动按键控制

cd ~
cd button_driver_qemu/
insmod button_drv.ko 
insmod board_100ask_qemu_imx6ull.ko 
./button_led_test
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtMF82NTUwNTM1OQ,size_13,color_FFFFFF,t_70,g_se,x_16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值