线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程的创建与终止
在Ubuntu中,pthread库默认不存在,须进行安装
sudo apt install -y glibc-doc manpages-posix-dev
安装完成后可查看pthread使用手册man pthreads
使用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()为终止线程
创建进程与终止进程的示例如下
编辑完成后可使用makefile来对其进行编译
使用vim makefile来编辑makefile如下
'gcc wenjianming.c -o wenjianming.out'
运行结果如下
线程的连接与分离
线程的连接
int pthread_join(pthread_t thread, void **retval);
参数1:thread表示等待的子线程的线程id; 参数2:retval用来接收返回结果, 成功返回0 失败返回错误号;
线程的分离
‘int pthread_detach(pthread_t thread);’
thread表示分离的子线程的线程id; 成功返回0 失败返回错误号
线程的连接与分离示例
运行结果如下
使用互斥量保护多线程同时输出
初始化互斥锁
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);'
互斥锁示例如下
运行结果如下
条件变量
条件变量是利用线程共享的全局变量进行同步的一种机制,只要包括两个动作:一个线程等待某个条件为真,而将自己挂起(进入等待队列);另一个线程的条件成立,并通知等待队列中的线程继续。为了防止竞争,条件变量总是和一个互斥锁结合在一起使用
示例如下
运行结果如下
进程
进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。
测试获取环境变量代码
通过main() 函数的第三个参数获取
通过environ全局变量获取
测试创建进程程序代码
fork()函数创建进程
在Linux系统中,创建一个子进程需要用到fork();需要引用头文件unistd.h;main函数是父进,在fork函数之后通过判断fork函数的返回值来判断哪一部分代码是子进程模块的,返回值为0的为子进程,大于0的为父进程,后面代码部分为公共部分。
#include <unistd.h>
pid_t fork(void);
示例如下
运行结果
使用daemon 创建守护进程
守护进程是脱离于终端并且在后台运行,周期性的执行某种任务或者等待处理某些发生的事件进程。
使用‘daemon()’创建守护进程
示例
信号函数sigaction的使用
信号函数用来通知进程发生了异步事件
示例
但因为没有信号发生所以运行结果如下图
开发板
虚拟开发板准备完毕后使用
~/ubuntu-18.04_imx6ul_qemu_system/gui-qemu-imx6ull-gui.sh
打开开发板
LCD屏幕/图像
使用fb-test打开屏幕,./myfb-test /dev/fb0打开图像
串口 EEPROM
列出所有串口cd ~;i2cdetect -l && i2cdetect -y 0
写入i2c_usr_test /dev/i2c-0 0x50 w 0x01 0xff
读取$ i2c_usr_test /dev/i2c-0 0x50 w 0x33
命令控制LED
打开LED控制以及安装LED驱动
cd ~
cd led_driver_qemu/
insmod 100ask_led.ko
控制LED零号灯亮,LED一号灯灭:
./ledtest /dev/100ask_led0 on
./ledtest /dev/100ask_led1 off
按键控制LED
启动按键控制
cd ~
cd button_driver_qemu/
insmod button_drv.ko
insmod board_100ask_qemu_imx6ull.ko
./button_led_test