您的位置:首页 > 其它

实验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

三、重要代码分析

多线程







`

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写成了小写而无法编译。下次应该更认真一些,也应该实验前进行充分的预习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: