《信息安全系统设计基础》实验二报告
《信息安全系统设计基础》实验二 固件设计
课程:信息安全系统设计基础
班级:1453
学号姓名:20145301赵嘉鑫、20145335郝昊、20145321曾子誉
指导教师:娄嘉鹏
实验日期:2016.11.03
实验时间:10:10-12:25
必修/选修: 必修
实验序号:二
实验名称:固件设计
实验目的与要求
了解多线程程序设计的基本原理,学习 pthread 库函数的使用。
了解在 linux 环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用。学习使用多线程来完成串口的收发处理。
熟悉linux开发环境,学会基于S3C2410的linux开发环境的配置和使用。使用linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程
实验内容
1.开发环境的配置同实验一。
2.将实验代码拷贝到共享文件夹中。
3.在虚拟机中编译代码。
对于多线程相关的代码,编译时需要加-lpthread 的库。
4.下载调试
在超级终端中运行可执行文件pthread,运行可执行文件term。
代码解析
#include <stdio.h> #include <stdlib.h> #include <time.h> #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->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);//释放互斥锁 } /*从缓冲区中读出一个整数 */ 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);//等待状态变量 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; } #define OVER (-1) struct prodcons buffer; /*实现一个生产者程序:生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,当生产-1时,程序终止。*/ 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; } /*消费掉缓存中生产出来的数据:消费者线程不断地从共享的循环缓冲区读取数据,当消费-1时,程序终止*/ 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; }
心得体会
实验环境的配置比较繁琐,但只要在实验一中配好了环境,基于这个环境的实验二、四、五都能很轻松完成,所以我们在第一次实验中就赶紧连着做完实验二。另外有老师给的指导还是能比较轻松做出实验的。
posted on 2016-11-13 23:20 20145321曾子誉 阅读(139) 评论(0) 编辑 收藏 举报