实验2 多线程应用程序设计与串行端口程序设计 实验报告
2015-11-23 23:20
411 查看
实 验 报 告
课程:信息安全系统设计基础 班级:1353
姓名:魏昊卿 王亦可
学号:20135303 20135326
成绩: 指导教师:娄嘉鹏 实验日期:2015.11.17
实验密级: 预习程度: 实验时间:15:30~18:00
仪器组次: 必修/选修: 必修 实验序号:2
实验名称:多线程应用程序设计与串行端口程序设计
实验目的与要求:
了解多线程程序设计的基本原理
学习pthread库函数的使用
了解在linux环境下串行程序设计的基本方法
掌握终端的主要属性和设置方法,掌握终端I/O函数的使用方法
学习使用多线程来完成串口的收发处理
实验仪器:
UP-TECH S2410/P270 DVP 实验平台
二、实验步骤
1.实验环境配置如实验一
2.将实验代码拷贝到共享文件夹中。
3.进入/02_pthread目录,使用vi编辑器阅读理解源代码
4.在虚拟机中编译代码,编译时需要加-lpthread的库
5.在超级终端窗口运行 ./pthread,运行结果如图
6.进入/03_tty目录,使用vi编辑器阅读理解源代码
7.在虚拟机中编译代码
[root@BC 03_tty]# /opt/host/armv4l/bin/armv41-unknown-linux-gcc –c –o term.o term.c
[root@BC 03_tty]# /opt/host/armv4l/bin/armv41-unknown-linux-gcc –o term term.o –lpthread
[root@BC 03_tty]#ls
8.转到超级终端窗口,进入03_tty所在目录,运行term
出现错误 /dev/ttyS0:No such file or directory
解决方法:
[/mnt/yaffs]cd /dev
[/dev] ln –sf /dev/tts/0 ttyS0 (注意字母大小写,数字为0或1)
[/dev] ln –sf /dev/tts/1 ttyS1
三、重要代码分析
多线程
`
int buffer[BUFFER_SIZE]; /缓冲区数组/
pthread_mutex_t lock; /* 互斥锁/
int readpos, writepos; /读写的位置 /
pthread_cond_t notempty; /缓冲区非空信号/
pthread_cond_t notfull; /缓冲区非满信号/
};
/--------------------------------------------------------/
/初始化缓冲区/
void init(struct prodcons b)
{
pthread_mutex_init(&b->lock, NULL);
pthread_cond_init(&b->notempty, NULL);
pthread_cond_init(&b->notfull, NULL);
b->readpos = 0;
b->writepos = 0;
}
/--------------------------------------------------------/
/向缓冲区中写入一个整数/
void put(struct prodcons * b, int data)
{
pthread_mutex_lock(&b->lock);
/等待缓冲区非满/
while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
printf("wait for not full\n");
pthread_cond_wait(&b->notfull, &b->lock);
}
/写数据并且指针前移/
b->buffer[b->writepos] = data;
b->writepos++;
if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
/设置缓冲区非空信号/
pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}
/--------------------------------------------------------/
/* 从缓冲区中读出一个整数/
int get(struct prodcons b)
{
int data;
pthread_mutex_lock(&b->lock);
/等待缓冲区非空/
while (b->writepos == b->readpos) {
printf("wait for not empty\n");
pthread_cond_wait(&b->notempty, &b->lock);
}
/读数据并且指针前移/
data = b->buffer[b->readpos];
b->readpos++;
if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
/设置缓冲区非满信号/
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);
return data;
}
/--------------------------------------------------------/
/--------------------------------------------------------/
void * producer(void * data)
{
int n;
for (n = 0; n < 1000; n++) {
printf(" put-->%d\n", n);
put(&buffer, n);
}
put(&buffer, OVER);
printf("producer stopped!\n");
return NULL;
}
/--------------------------------------------------------/
void * consumer(void * data)
{
int d;
while (1) {
d = get(&buffer);
if (d == OVER ) break;
printf(" %d-->get\n", d);
}
printf("consumer stopped!\n");
return NULL;
}
/--------------------------------------------------------/
int main(void)
{
pthread_t th_a, th_b;
void * retval;
init(&buffer);
pthread_create(&th_a, NULL, producer, 0);
pthread_create(&th_b, NULL, consumer, 0);
/等待生产者和消费者结束/
pthread_join(th_a, &retval);
pthread_join(th_b, &retval);
return 0;
}
生产者写入共享的循环缓冲区函数PUT
void put(struct prodcons * b, int data)
{
pthread_mutex_lock(&b->lock); // 获取互斥锁
while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { //如果读写位置相同
pthread_cond_wait(&b->notfull, &b->lock); //等待状态变量b->notfull,不满则跳出阻塞
}
b->buffer[b->writepos] = data; // 写入数据
b->writepos++;
if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
pthread_cond_signal(&b->notempty);// 设置状态变量
pthread_mutex_unlock(&b->lock); // 释放互斥锁
}
消费者读取共享的环缓冲区函数GET
int get(struct prodcons * b)
{
int data;
pthread_mutex_lock(&b->lock); // 获取互斥锁
while (b->writepos == b->readpos) {//如果读写位置相同
pthread_cond_wait(&b->notempty, &b->lock);//等待状态变量b->notempty,不空则跳出堵塞。否则无数据可读
}
data = b->buffer[b->readpos];// 读取数据
b->readpos++;
if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
pthread_cond_signal(&b->notfull); // 设置状态变量
pthread_mutex_unlock(&b->lock); // 释放互斥锁
return data;
}
`
四、实验体会
老师提供了实验步骤,但是很多情况下仍然无法快速完成实验,例如实验,在解决/dev/ttyS0:No such file or directory的问题时,将大写的S写成了小写而无法编译。下次应该更认真一些,也应该实验前进行充分的预习。
课程:信息安全系统设计基础 班级:1353
姓名:魏昊卿 王亦可
学号:20135303 20135326
成绩: 指导教师:娄嘉鹏 实验日期:2015.11.17
实验密级: 预习程度: 实验时间:15:30~18:00
仪器组次: 必修/选修: 必修 实验序号:2
实验名称:多线程应用程序设计与串行端口程序设计
实验目的与要求:
了解多线程程序设计的基本原理
学习pthread库函数的使用
了解在linux环境下串行程序设计的基本方法
掌握终端的主要属性和设置方法,掌握终端I/O函数的使用方法
学习使用多线程来完成串口的收发处理
实验仪器:
UP-TECH S2410/P270 DVP 实验平台
二、实验步骤
1.实验环境配置如实验一
2.将实验代码拷贝到共享文件夹中。
3.进入/02_pthread目录,使用vi编辑器阅读理解源代码
4.在虚拟机中编译代码,编译时需要加-lpthread的库
5.在超级终端窗口运行 ./pthread,运行结果如图
6.进入/03_tty目录,使用vi编辑器阅读理解源代码
7.在虚拟机中编译代码
[root@BC 03_tty]# /opt/host/armv4l/bin/armv41-unknown-linux-gcc –c –o term.o term.c
[root@BC 03_tty]# /opt/host/armv4l/bin/armv41-unknown-linux-gcc –o term term.o –lpthread
[root@BC 03_tty]#ls
8.转到超级终端窗口,进入03_tty所在目录,运行term
出现错误 /dev/ttyS0:No such file or directory
解决方法:
[/mnt/yaffs]cd /dev
[/dev] ln –sf /dev/tts/0 ttyS0 (注意字母大小写,数字为0或1)
[/dev] ln –sf /dev/tts/1 ttyS1
三、重要代码分析
多线程
`
include
include
include
include "pthread.h"
define BUFFER_SIZE 16 /设置一个整数的圆形缓冲区/
struct prodcons {int buffer[BUFFER_SIZE]; /缓冲区数组/
pthread_mutex_t lock; /* 互斥锁/
int readpos, writepos; /读写的位置 /
pthread_cond_t notempty; /缓冲区非空信号/
pthread_cond_t notfull; /缓冲区非满信号/
};
/--------------------------------------------------------/
/初始化缓冲区/
void init(struct prodcons b)
{
pthread_mutex_init(&b->lock, NULL);
pthread_cond_init(&b->notempty, NULL);
pthread_cond_init(&b->notfull, NULL);
b->readpos = 0;
b->writepos = 0;
}
/--------------------------------------------------------/
/向缓冲区中写入一个整数/
void put(struct prodcons * b, int data)
{
pthread_mutex_lock(&b->lock);
/等待缓冲区非满/
while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
printf("wait for not full\n");
pthread_cond_wait(&b->notfull, &b->lock);
}
/写数据并且指针前移/
b->buffer[b->writepos] = data;
b->writepos++;
if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
/设置缓冲区非空信号/
pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}
/--------------------------------------------------------/
/* 从缓冲区中读出一个整数/
int get(struct prodcons b)
{
int data;
pthread_mutex_lock(&b->lock);
/等待缓冲区非空/
while (b->writepos == b->readpos) {
printf("wait for not empty\n");
pthread_cond_wait(&b->notempty, &b->lock);
}
/读数据并且指针前移/
data = b->buffer[b->readpos];
b->readpos++;
if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
/设置缓冲区非满信号/
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);
return data;
}
/--------------------------------------------------------/
define OVER (-1)
struct prodcons buffer;/--------------------------------------------------------/
void * producer(void * data)
{
int n;
for (n = 0; n < 1000; n++) {
printf(" put-->%d\n", n);
put(&buffer, n);
}
put(&buffer, OVER);
printf("producer stopped!\n");
return NULL;
}
/--------------------------------------------------------/
void * consumer(void * data)
{
int d;
while (1) {
d = get(&buffer);
if (d == OVER ) break;
printf(" %d-->get\n", d);
}
printf("consumer stopped!\n");
return NULL;
}
/--------------------------------------------------------/
int main(void)
{
pthread_t th_a, th_b;
void * retval;
init(&buffer);
pthread_create(&th_a, NULL, producer, 0);
pthread_create(&th_b, NULL, consumer, 0);
/等待生产者和消费者结束/
pthread_join(th_a, &retval);
pthread_join(th_b, &retval);
return 0;
}
生产者写入共享的循环缓冲区函数PUT
void put(struct prodcons * b, int data)
{
pthread_mutex_lock(&b->lock); // 获取互斥锁
while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { //如果读写位置相同
pthread_cond_wait(&b->notfull, &b->lock); //等待状态变量b->notfull,不满则跳出阻塞
}
b->buffer[b->writepos] = data; // 写入数据
b->writepos++;
if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
pthread_cond_signal(&b->notempty);// 设置状态变量
pthread_mutex_unlock(&b->lock); // 释放互斥锁
}
消费者读取共享的环缓冲区函数GET
int get(struct prodcons * b)
{
int data;
pthread_mutex_lock(&b->lock); // 获取互斥锁
while (b->writepos == b->readpos) {//如果读写位置相同
pthread_cond_wait(&b->notempty, &b->lock);//等待状态变量b->notempty,不空则跳出堵塞。否则无数据可读
}
data = b->buffer[b->readpos];// 读取数据
b->readpos++;
if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
pthread_cond_signal(&b->notfull); // 设置状态变量
pthread_mutex_unlock(&b->lock); // 释放互斥锁
return data;
}
`
四、实验体会
老师提供了实验步骤,但是很多情况下仍然无法快速完成实验,例如实验,在解决/dev/ttyS0:No such file or directory的问题时,将大写的S写成了小写而无法编译。下次应该更认真一些,也应该实验前进行充分的预习。
相关文章推荐
- 20135202闫佳歆20135220谈愈敏-实验五
- Node.js 手册查询-5-Ejs 方法
- Android Studio 实用技巧
- 转 被误解的MVC和被神化的MVVM
- 关于测试单词数目问题(14届蓝桥杯b组第一题)
- 构建高并发高可用的电商平台架构大纲
- Foundation 和 CoreFoundation指针转换
- ASP.NET MVC 开源项目学习之ProDinner (二)
- UIWindow
- intel edison RNDIS网络的固定IP设置
- JAVA服务端的解码
- c语言:枚举常量的用法举例
- js获取url传递参数
- 第三十篇:关于( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) )报错
- Activity.createPendingResult() android组件间通信又一种方式
- 看来我需要同时写两个博客了
- 浅谈泛型
- 搭建hadoop前期的Linux环境的配置
- Ext4.2.1学习历程之二:自定义类及类的动态加载
- shell [] 里边的选项说明