2021-2022学年——嵌入式系统实践实验4_Thread实验

Thread实验

实验目的

  1. 熟悉 Linux 应用程序编程;
  2. 掌握 Linux 多线程程序编写。

实验设备

实 验 设 备数 量备 注
感知 RF2-210 实验箱1运行 linux 程序
串口线1连接网关板 COM3 与 PC 串口
PC 机1编译和下载程序

实验内容

  创建两个线程,各自统计发生次数,主程序监测两个线程的返回值。

实验原理

  线程是一种标准化模型,它用于把一个程序分成一组能够同时执行的任务。 线程是一种特殊的进程,常称之为轻量级进程(light-weight process)。一个进程的 所有线程有独立的执行线索和堆栈,但共享数据。
  使用多线程的应用程序,必须包含pthread.h 文件,同时在链接程序的时候 加上-lpthread 参数。
线程的属性
  joinable
  具有joinable属性的线程在执行完毕后并不会立即被Linux清除,如果函数有返回值,其返回值可通过pthread_join()函数调用得到。
  detatched
  具有 detatched 属性的线程,执行完毕立即被Linux 清除,无法通过 pthread_join()函数调用获得其返回值。
建立线程的的时候如果没有指定属性,默认为 joinable 属性。
  创建线程创建线程使用 pthread_create()函数实现。函数原型:
  int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
  包含 4 个参数:
  thread_id―― 指向新线程标识的指针。
  attr―― 决定新线程的属性。设置为 PTHREAD_CREATE_JOINABLE 或者 NULL表示线程具有joinable 属性,设置为 PTHREAD_CREATE_DETATCHED 表示线程具有detatched属性。
  *start_routine――指向新线程中将要执行的函数的指针。
  arg――传递给新线程函数的参数。
  挂起线程
  挂起线程使用 pthread_join()函数实现。函数原型:
  int pthread_join(pthread_t th, void **thread_return) pthread_join()
  调用挂起当前线程,直到 th 指定的线程终止运行为止。
如果线程有返回值,返回值保存在 thread_return 指向的地址中。一个线程 所使用的内存资源在对该线程应用pthread_join()调用之前不会被重新分配。

实验步骤

1.进入虚拟机ubuntu系统下,打开终端调试软件进入“/opt/WXL/Basic”实验操作目录
在这里插入图片描述
  输入以下命令进入“/opt/WXL/Basic”目录

#cd /opt/WXL/Basic

2.编译实验代码
2.1 输入以下命令新建thread文件夹

# mkdir thread

2.2 进入thread实验目录
  输入以下命令新建thread.c文件并填写内容

# touch thread.c

在这里插入图片描述

  输入命令新建Makefile文件并填写内容

# touch Makefile

在这里插入图片描述

2.3 编译生成可执行文件
  输入命令如下进行编译

# make

在这里插入图片描述

  编译完成后在/opt/WXL/Basic/thread 目录下生成了可执行目标文件 thread。
3.下载到目标板执行
  将生成的可执行文件“thread”拷贝到Windows目录下,通过超级终端使用串口下载到感知RF2-210实验箱目标板上运行。
3.1拷贝可执行文件到Windows;
3.2通过超级终端发送文件到感知RF2-210;
3.3修改可执行文件的权限和执行
  修改权限输入命令:

#chmod 775 thread 

在这里插入图片描述

3.4执行程序命令:

# ./thread

在这里插入图片描述

附录

thread.c文件

#include
#include
#include
#include
#include
int task1(int *cnt) 
{ 
	while(*cnt < 5) { 
		sleep(1); 
		(*cnt)++; 
		printf("task1 cnt = %d.\n", *cnt); 
	} 
	return (*cnt);
} 
int task2(int *cnt) { 
	while(*cnt < 5) { 
		sleep(2); 
		(*cnt)++; 
		printf("task2 cnt = %d.\n", *cnt); 
	} 
	return (*cnt); 
} 
int main(int argc, char **argv) { 
	int result; 
	int t1 = 0; 
	int t2 = 0; 
	int rt1, rt2; 
	pthread_t thread1, 
	thread2; 
	/* create the first thread. */ 
	result = pthread_create(&thread1, PTHREAD_CREATE_JOINABLE, (void *)task1, (void *)&t1); 
	if(result) { 
		perror("pthread_create: task1.\n"); 
		exit(EXIT_FAILURE); 
	} 
	/* create the second thread. */ 
	result = pthread_create(&thread2, PTHREAD_CREATE_JOINABLE, (void *)task2, (void *)&t2); 
	if(result){ 
		perror("pthread_create: task2.\n"); 
		exit(EXIT_FAILURE); 
	} 
	pthread_join(thread1, (void *)&rt1); pthread_join(thread2, (void *)&rt2); 
	printf("total %d times.\n", t1+t2); 
	printf("return value of task1: %d.\n", rt1); 
	printf("return value of task2: %d.\n", rt2); 
	exit(EXIT_SUCCESS); 
}

Makefile文件

EXEC = thread
OBJS = thread.o
SRC = thread.c

CC = arm-linux-gcc
#LD = arm-linux-ld
CFLAGS += -O2 -Wall
LDFLAGS += -lpthread

all:$(EXEC)
$(EXEC):$(OBJS)
	$(CC) $(CFLAGS) -c $@ $(OBJS)
%.o:%.c
	$(CC) $(CFLAGS) -c $< -o $@
clean:
	@rm -vf $(EXEC) *.o*-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值