欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    华北电力大学科技学院嵌入式实验报告.docx

    • 资源ID:6959525       资源大小:98.46KB        全文页数:29页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    华北电力大学科技学院嵌入式实验报告.docx

    1、华北电力大学科技学院嵌入式实验报告科 技 学 院课程设计(综合实验)报告( 2012- 2013年度第 1学期)名 称: 嵌入式系统 题 目: 嵌入式实验报告 院 系: 信息工程系 班 级: 学 号: 学生姓名: 指导教师: 郭 军 设计周数: 5 周 成 绩: 日期: 2012 年 11 月 25 日实验一 熟悉Linux开发环境1、实验目的熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。2、实验内容及工具(包括软件调试工具)本次实验使

    2、用Redhat linux 9.0操作系统环境安装ARMLinux的开发库及编译器。新建一个目录,编写hello.c 和makefile文件。学习在linux 下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。下载已经编译好的文件到嵌入式控制器中运行。 硬件:UP-NETARM2410-S嵌入式实验仪、PC机Pentumn500以上, 硬盘10G以上。软件:PC机操作系统REDHAT LINUX 9.0 MINICOM AMRLINUX开发环境。三、实验步骤1建立工作目录mkdir hellocd hello2 编写程序源代码在LINUX下的文本编辑器有许多,常用的是vim, Xwi

    3、ndow界面下的gedit等,我们在开发过程中推荐使用vim,用户需要学习vim的操作方法,实际的hello.c源代码较简单。如下:include main() printf(“hello world n”);3 编写MakefileCC= armv4l-unknown-linux-gccEXEC = helloOBJS = hello.o CFLAGS += LDFLAGS+=-elf2flt static all: $(EXEC)$(EXEC): $(OBJS) $(CC) $(LDFLAGS) -o $ $(OBJS) clean: -rm -f $(EXEC) *.elf *.gdb

    4、*.o这个makefile 显示了几个主要的部分: CC 指明编译器的宏。 EXEC 表示生成的执行文件名称的宏。 OBJS 目标文件列表宏。 CFLAGS 编译参数宏。 LDFLAGS 连接参数宏。 all: 编译主入口。 clean:清除编译结果节。注意:“$(CC) $(LDFLAGS) -o $ $(OBJS)”和“-rm -f $(EXEC) *.elf *.gdb *.o”前空白由一个Tab制表符生成,不能单纯由空格来代替。4编译应用程序在hello目录下运行make ,如果进行了修改,重新编译则运行:make cleanmake注意编译、修改程序都是在开发计算机上进行,不要在MI

    5、NICOM的终端方式下进行。5下载调试在宿主PC计算机上启动NFS服务,并设置好共享的目录,之后在开发板上运行:mount -t nfs 192.168.0.10:/arm2410 /host (实际IP地址要根据实际情况修改。)挂接宿主机的根目录。成功之后在开发板上进入/host目录便相应进入宿主机的/arm2410目录,再进入开发程序目录运行刚刚编译好的hello程序,查看运行结果。开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重起,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板的过程。实验二、多线程应用程序设计一、实验目的1了解多线程程序设计的基本原理。

    6、2学习pthread库函数的使用。二、实验内容读懂pthread.c 的源代码,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量的使用方法。进入/arm2410/exp/basic/02_pthread目录,运行make 产生pthread程序,使用NFS方式连接开发主机进行运行实验。三、实验设备及工具硬件: UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上, 硬盘40G以上,内存大于128M。软件:PC机操作系统REDHAT LINUX 9.0 MINICOM AMRLINUX开发环境。四、实验原理1多线程程序的优缺点多线程程序作为一种多任务、并发的工作

    7、方式,有以下的优点:1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。LIBC中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。2实验源代码结构流程图实验

    8、为著名的生产者消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。流程图如图2-1所示:图2-1实验源代码结构流程图3生产者写入共享的循环缓冲区函数PUTvoid put(struct prodcons * b, int data) pthread_mutex_lock(&b-lock); /获取互斥锁 while (b-writepos + 1) % BUFFER_SIZE = b-readpos) /如果读写位置相同 pthread_cond_wait(&b-notful

    9、l, &b-lock); /等待状态变量b-notfull,不满则跳出阻塞。 b-bufferb-writepos = data; /写入数据 b-writepos+; if (b-writepos = BUFFER_SIZE) b-writepos = 0; pthread_cond_signal(&b-notempty); /设置状态变量 pthread_mutex_unlock(&b-lock); /释放互斥锁4消费者读取共享的循环缓冲区函数GETint get(struct prodcons * b) int data; pthread_mutex_lock(&b-lock); /获取

    10、互斥锁 while (b-writepos = b-readpos) /如果读写位置相同 pthread_cond_wait(&b-notempty, &b-lock);/等待状态变量b-notempty,不空则跳出阻塞。否则无数据可读。 data = b-bufferb-readpos; /读取数据 b-readpos+; if (b-readpos = BUFFER_SIZE) b-readpos = 0; pthread_cond_signal(&b-notfull); /设置状态变量 pthread_mutex_unlock(&b-lock); /释放互斥锁 return data;5

    11、生产、消费流程图: 生产消费流程图如下图2-2所示:图2-2 生产消费流程图6主要的多线程API 1、 线程创建函数:int pthread_create (pthread_t * thread_id, _const pthread_attr_t * _attr, void *(*_start_routine) (void *),void *_restrict _arg);2、 获得父进程ID:pthread_t pthread_self (void)3、 测试两个线程号是否相同:int pthread_equal (pthread_t _thread1, pthread_t _thread2

    12、)4、 线程退出:void pthread_exit (void *_retval)5、 等待指定的线程结束:int pthread_join (pthread_t _th, void *_thread_return)6、 互斥量初始化:pthread_mutex_init (pthread_mutex_t *,_const pthread_mutexattr_t *)7、 销毁互斥量:int pthread_mutex_destroy (pthread_mutex_t *_mutex);8、 再试一次获得对互斥量的锁定(非阻塞):int pthread_mutex_trylock (pthr

    13、ead_mutex_t *_mutex);9、 锁定互斥量(阻塞):int pthread_mutex_lock (pthread_mutex_t *_mutex);10、 解锁互斥量int pthread_mutex_unlock (pthread_mutex_t *_mutex)11、 条件变量初始化int pthread_cond_init (pthread_cond_t *_restrict _cond,_const pthread_condattr_t *_restrict _cond_attr)12、 销毁条件变量CONDint pthread_cond_destroy (pthr

    14、ead_cond_t *_cond)13、 唤醒线程等待条件变量int pthread_cond_signal (pthread_cond_t *_cond)14、 等待条件变量(阻塞)int pthread_cond_wait (pthread_cond_t *_restrict _cond,pthread_mutex_t *_restrict _mutex)15、 在指定的时间到达前等待条件变量int pthread_cond_timedwait (pthread_cond_t *_restrict _cond,pthread_mutex_t *_restrict _mutex,_cons

    15、t struct timespec *_restrict _abstime)五、实验步骤1 进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。2 运行make产生pthread可执行文件。3 切换到minicom终端窗口,使用NFS mount开发主机的/arm2410 到/host目录。4 进入/host/exp/basic/pthread目录,运行pthread,观察运行结果的正确性。5 修改一些参数,再次运行调试,加深对多线程的理解。6 参考源代码:#include #include #include #include pthread.h#def

    16、ine BUFFER_SIZE 16/* Circular buffer of integers. */struct prodcons int bufferBUFFER_SIZE; /* the actual data */ pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */ int readpos, writepos; /* positions for reading and writing */ pthread_cond_t notempty; /* signaled when buffer is no

    17、t empty */ pthread_cond_t notfull; /* signaled when buffer is not full */;/*-*/* Initialize a buffer */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;/*-*/* Store an integer in

    18、 the buffer */void put(struct prodcons * b, int data) pthread_mutex_lock(&b-lock); /* Wait until buffer is not full */ while (b-writepos + 1) % BUFFER_SIZE = b-readpos) printf(wait for not fulln); pthread_cond_wait(&b-notfull, &b-lock); /* Write the data and advance write pointer */ b-bufferb-writep

    19、os = data; b-writepos+; if (b-writepos = BUFFER_SIZE) b-writepos = 0; /* Signal that the buffer is now not empty */ pthread_cond_signal(&b-notempty); pthread_mutex_unlock(&b-lock);/*-*/* Read and remove an integer from the buffer */int get(struct prodcons * b) int data; pthread_mutex_lock(&b-lock);

    20、/* Wait until buffer is not empty */ while (b-writepos = b-readpos) printf(wait for not emptyn); pthread_cond_wait(&b-notempty, &b-lock); /* Read the data and advance read pointer */ data = b-bufferb-readpos; b-readpos+; if (b-readpos = BUFFER_SIZE) b-readpos = 0; /* Signal that the buffer is now no

    21、t full */ 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 %dn, n); put(&buffer, n); put(&buffer, OVER); printf(producer stopped!n); return NULL;/*-*/void * consumer(void *

    22、data) int d; while (1) d = get(&buffer); if (d = OVER ) break; printf( %d-getn, 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); /* Wait until produc

    23、er and consumer finish. */ pthread_join(th_a, &retval); pthread_join(th_b, &retval); return 0;实验三、串行端口程序设计一、实验目的1 了解在linux环境下串行程序设计的基本方法。2 掌握终端的主要属性及设置方法,熟悉终端IO函数的使用。3 学习使用多线程来完成串口的收发处理。二、实验内容读懂程序源代码, 学习终端IO函数tcgetattr(), tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。三、实验设备及工具硬件:UP-NETARM2410-

    24、S嵌入式实验仪,PC机pentumn500以上, 硬盘40G以上,内存大于128M。软件:PC机操作系统REDHAT LINUX 9.0 MINICOM AMRLINUX开发环境四、实验原理Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在LINUX中进行串行通讯编程的基本方法。1.程序流程图 程序流程图如图2-3所示:图2-3 程序流程图2串口操作需要的头文件#include /*标准输入输出定义*/#include /*标准函数库定义*/#include /*linux标准函数定义*/#include #include #inc

    25、lude /*文件控制定义*/#include /*PPSIX 终端控制定义*/#include /*错误号定义*/#include /*线程库定义*/3打开串口在 Linux 下串口文件是位于 /dev 下,串口一为/dev/ttyS0 ,串口二为 /dev/ttyS1,打开串口是通过使用标准的文件打开函数操作: int fd;/*以读写方式打开串口*/fd = open( /dev/ttyS0, O_RDWR);if (-1 = fd) perror( 提示错误!);4设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各

    26、成员值。 struct termio unsigned short c_iflag; /* 输入模式标志 */ unsigned short c_oflag; /* 输出模式标志 */ unsigned short c_cflag; /* 控制模式标志 */ unsigned short c_lflag; /* local mode flags */ unsigned char c_line; /* line discipline */ unsigned char c_ccNCC; /* control characters */;设置这个结构体很复杂,可以参考man手册或者由赵克佳、沈志宇编

    27、写的UNIX程序编写教程,我这里就只考虑常见的一些设置: 波特率设置:下面是修改波特率的代码:struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200); /*设置为19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校验位和停止位的设置:无效验 8位 Option.c_cflag &= PARENB;Option.c_cflag &= CSTOPB;Option.c_cflag &= CSIZE;Option.c_cflag |= CS8; 奇效验(Odd

    28、) 7位 Option.c_cflag |= PARENB;Option.c_cflag &= PARODD;Option.c_cflag &= CSTOPB;Option.c_cflag &= CSIZE;Option.c_cflag |= CS7; 偶效验(Even) 7位 Option.c_cflag &= PARENB;Option.c_cflag |= PARODD;Option.c_cflag &= CSTOPB;Option.c_cflag &= CSIZE;Option.c_cflag |= CS7; Space效验 7位 Option.c_cflag &= PARENB;Option.c_cflag &= CSTOPB;Option.c


    注意事项

    本文(华北电力大学科技学院嵌入式实验报告.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开