信息安全系统设计基础实验二:固件设计(20135229,20135234)
2015-11-23 20:54
267 查看
北京电子科技学院(BESTI)
实验报告
课程:信息安全系统设计基础班级:1352姓名:吕松鸿马启扬
学号:2013522920135234 成绩:指导教师:娄嘉鹏实验日期::2015.11.10
实验密级:预习程度:实验时间:15:30—17:30
仪器组次:必修/选修:必修实验序号:02
2.将实验代码拷贝到共享文件夹中。
3.在虚拟机中编译代码。
对于多线程相关的代码,编译时需要加-lpthread的库。
4.下载调试
在超级终端中运行可执行文件pthread,运行可执行文件term。
二、代码解析
(1)分析
这个代码是生产者-消费者问题模型的实现。
主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。
生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。
(2)源代码注释
int
int
/*等待缓冲区非满*/
while
printf
/*写数据并且指针前移*/
if
/*设置缓冲区非空信号*/
int
/*等待缓冲区非空*/
while
printf
/*读数据并且指针前移*/
if
/*设置缓冲区非满信号*/
return
int
for
printf
printf
return
int
while
if
printf
printf
return
void
//创建生产者线程
//创建消费者线程
/*等待生产者和消费者结束*/
return0
1.找不到文件
文件夹压缩拷贝到共享文件夹bc之后,进入虚拟机,在命令行输入./install.sh配置编译环境失败。显示install.shnotfound。
我们打开的命令行所在的是系统默认位置,应该进入bc再输入命令。
2.执行./term错误
可以通过方法建立一个连接来解决。首先在超级终端中进入/dev文件夹中。
输入命令“ln–sf/dev/tts/0/dev/ttyS0”注意空格与字母l、数字0
实验报告
课程:信息安全系统设计基础班级:1352姓名:吕松鸿马启扬
学号:2013522920135234 成绩:指导教师:娄嘉鹏实验日期::2015.11.10
实验密级:预习程度:实验时间:15:30—17:30
仪器组次:必修/选修:必修实验序号:02
一、实验内容
1.开发环境的配置同实验一。2.将实验代码拷贝到共享文件夹中。
3.在虚拟机中编译代码。
对于多线程相关的代码,编译时需要加-lpthread的库。
4.下载调试
在超级终端中运行可执行文件pthread,运行可执行文件term。
二、代码解析
(1)分析
这个代码是生产者-消费者问题模型的实现。
主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。
生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。
(2)源代码注释
#include<stdio.h>[code]
#include<stdlib.h>[code]
#include<time.h>[code]
#include"pthread.h"[code]
#defineBUFFER_SIZE16[code]
/*设置一个整数的圆形缓冲区*/[code]
struct[code]prodcons{
int
buffer[BUFFER_SIZE];/*缓冲区数组*/
pthread_mutex_tlock;/*互斥锁*/
int
readpos,writepos;/*读写的位置*/
pthread_cond_tnotempty;/*缓冲区非空信号*/
pthread_cond_tnotfull;/*缓冲区非满信号*/
};
/*初始化缓冲区:初始化缓存指针信息(信号量)*/[code]
voidinit(structprodcons*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
;
}
/*向缓冲区中写入一个整数*/[code]
voidput(structprodcons*b,intdata)
{
pthread_mutex_lock(&b->lock);//获取互斥锁
/*等待缓冲区非满*/
while
((b->writepos+1
)%BUFFER_SIZE==b->readpos)//如果读写位置相同
{
printf
("waitfornotfull\n"
);
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);//释放互斥锁
}
/*从缓冲区中读出一个整数*/[code]
intget(structprodcons*b)
{
int
data;
pthread_mutex_lock(&b->lock);//获取互斥锁
/*等待缓冲区非空*/
while
(b->writepos==b->readpos)//如果读写位置相同
{
printf
("waitfornotempty\n"
);
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;
}
#defineOVER(-1)[code]
struct[code]prodconsbuffer;
/*实现一个生产者程序:生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,当生产-1时,程序终止。*/[code]
void[code]*producer(void
*data)
{
int
n;
for
(n=0
;n<1000
;n++){
printf
("put-->%d\n"
,n);
put(&buffer,n);
}
put(&buffer,OVER);
printf
("producerstopped!\n"
);
return
NULL;
}
/*消费掉缓存中生产出来的数据:消费者线程不断地从共享的循环缓冲区读取数据,当消费-1时,程序终止*/[code]
void[code]*consumer(void
*data)
{
int
d;
while
(1
)
{
d=get(&buffer);
if
(d==OVER)break
;
printf
("%d-->get\n"
,d);
}
printf
("consumerstopped!\n"
);
return
NULL;
}
intmain(void)
{
pthread_tth_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);
return0
;
}
三、遇到的问题及解决
1.找不到文件
文件夹压缩拷贝到共享文件夹bc之后,进入虚拟机,在命令行输入./install.sh配置编译环境失败。显示install.shnotfound。
我们打开的命令行所在的是系统默认位置,应该进入bc再输入命令。
2.执行./term错误
可以通过方法建立一个连接来解决。首先在超级终端中进入/dev文件夹中。
输入命令“ln–sf/dev/tts/0/dev/ttyS0”注意空格与字母l、数字0
相关文章推荐
- 删数问题
- NOIP2015
- C语言初学者简单语法小测
- IS_ERR()函数详解
- matlab中repmat函数的用法
- 机器学习分类算法(一)——余弦相似度
- 在IOS下xcode使用github管理代码
- Masonry Example运行pop install问题处理
- C#图表控件ZedGraph使用
- kali-linux安装后的一些配置
- Android实战技巧之八:Ubuntu下切换JDK版本!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
- 卡耐基梅隆大学教授邢波:Petuum,大数据分布式机器学习平台
- cocos2dx v3.x box2d DrawDebugData 后置问题
- Linux系统下对树莓派镜像进行烧写操作。可搭建自己的迷你服务器
- 第五届全国职工职业技能大赛在杭州闭幕
- 普通验证码识别编写
- Pascal's Triangle,Pascal's Triangle II
- 谨慎用药!这些药千万不能混在一起吃
- 【FastDev4Android框架开发】CardView完全解析与RecyclerView结合使用(三十二)
- HDOJ 5567 sequence1 (暴力)