嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx

上传人:b****7 文档编号:22625724 上传时间:2023-02-04 格式:DOCX 页数:35 大小:94.20KB
下载 相关 举报
嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx_第1页
第1页 / 共35页
嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx_第2页
第2页 / 共35页
嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx_第3页
第3页 / 共35页
嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx_第4页
第4页 / 共35页
嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx

《嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx(35页珍藏版)》请在冰豆网上搜索。

嵌入式实验报告郭军 华北电力大学Word格式文档下载.docx

mkdirhello

cdhello

2编写程序源代码

在LINUX下的文本编辑器有许多,常用的是vim,Xwindow界面下的gedit等,我们在开发过程中推荐使用vim,用户需要学习vim的操作方法,实际的hello.c源代码较简单。

如下:

#include<

stdio.h>

main()

{

printf(“helloworld\n”);

}

3编写Makefile

CC=armv4l-unknown-linux-gcc

EXEC=hello

OBJS=hello.o

CFLAGS+=

LDFLAGS+=-elf2flt–static

all:

$(EXEC)

$(EXEC):

$(OBJS)

$(CC)$(LDFLAGS)-o$@$(OBJS)

clean:

-rm-f$(EXEC)*.elf*.gdb*.o

这个makefile显示了几个主要的部分:

●CC指明编译器的宏。

●EXEC表示生成的执行文件名称的宏。

●OBJS目标文件列表宏。

●CFLAGS编译参数宏。

●LDFLAGS连接参数宏。

●all:

编译主入口。

●clean:

清除编译结果节。

注意:

“$(CC)$(LDFLAGS)-o$@$(OBJS)”和“-rm-f$(EXEC)*.elf*.gdb*.o”前空白由一个Tab制表符生成,不能单纯由空格来代替。

4编译应用程序

在hello目录下运行make,如果进行了修改,重新编译则运行:

makeclean

make

注意编译、修改程序都是在开发计算机上进行,不要在MINICOM的终端方式下进行。

5下载调试

在宿主PC计算机上启动NFS服务,并设置好共享的目录,之后在开发板上运行:

mount-tnfs192.168.0.10:

/arm2410/host(实际IP地址要根据实际情况修改。

挂接宿主机的根目录。

成功之后在开发板上进入/host目录便相应进入宿主机的/arm2410目录,再进入开发程序目录运行刚刚编译好的hello程序,查看运行结果。

开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重起,就可以一直保持连接。

这样可以反复修改、编译、调试,不需要下载到开发板的过程。

四、实验总结

通过本次实验,对Linux操作系统有初步了解,简单运用Linux操作系统,并设置超级终端,下载已编译好的文件到目标开发板上等,由于初次使用Linux以及嵌入式开发不太了解,实验过程操作比较慢,还应在以后多练。

实验二、多线程应用程序设计

1.了解多线程程序设计的基本原理。

2.学习pthread库函数的使用。

二、实验内容

读懂pthread.c的源代码,熟悉几个重要的PTHREAD库函数的使用。

掌握共享锁和信号量的使用方法。

进入/arm2410/exp/basic/02_pthread目录,运行make产生pthread程序,使用NFS方式连接开发主机进行运行实验。

三、实验设备及工具

硬件:

UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上,硬盘40G以上,内存大于128M。

四、实验原理

1多线程程序的优缺点  

多线程程序作为一种多任务、并发的工作方式,有以下的优点:

  1)提高应用程序响应。

这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(timeconsuming)置于一个新的线程,可以避免这种尴尬的情况。

  2)使多CPU系统更加有效。

操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

  3)改善程序结构。

一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

LIBC中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。

2实验源代码结构流程图

实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。

生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。

流程图如图2-1所示:

图2-1实验源代码结构流程图

3生产者写入共享的循环缓冲区函数PUT

voidput(structprodcons*b,intdata)

pthread_mutex_lock(&

b->

lock);

//获取互斥锁

while((b->

writepos+1)%BUFFER_SIZE==b->

readpos){//如果读写位置相同

pthread_cond_wait(&

notfull,&

//等待状态变量b->

notfull,不满则跳出阻塞。

}

b->

buffer[b->

writepos]=data;

//写入数据

writepos++;

if(b->

writepos>

=BUFFER_SIZE)b->

writepos=0;

pthread_cond_signal(&

notempty);

//设置状态变量

pthread_mutex_unlock(&

//释放互斥锁

4消费者读取共享的循环缓冲区函数GET

intget(structprodcons*b)

intdata;

while(b->

writepos==b->

readpos){//如果读写位置相同

notempty,&

//等待状态变量b->

notempty,不空则跳出阻塞。

否则无数据可读。

data=b->

readpos];

//读取数据

readpos++;

readpos>

readpos=0;

notfull);

pthread_mutex_unlock(&

returndata;

5生产、消费流程图:

生产消费流程图如下图2-2所示:

图2-2生产消费流程图

6主要的多线程API

1、线程创建函数:

intpthread_create(pthread_t*thread_id,__constpthread_attr_t*__attr,

void*(*__start_routine)(void*),void*__restrict__arg);

2、获得父进程ID:

pthread_tpthread_self(void)

3、测试两个线程号是否相同:

intpthread_equal(pthread_t__thread1,pthread_t__thread2)

4、线程退出:

voidpthread_exit(void*__retval)

5、等待指定的线程结束:

intpthread_join(pthread_t__th,void**__thread_return)

6、互斥量初始化:

pthread_mutex_init(pthread_mutex_t*,__constpthread_mutexattr_t*)

7、销毁互斥量:

intpthread_mutex_destroy(pthread_mutex_t*__mutex);

8、再试一次获得对互斥量的锁定(非阻塞):

intpthread_mutex_trylock(pthread_mutex_t*__mutex);

9、锁定互斥量(阻塞):

intpthread_mutex_lock(pthread_mutex_t*__mutex);

10、解锁互斥量

intpthread_mutex_unlock(pthread_mutex_t*__mutex)

11、条件变量初始化

intpthread_cond_init(pthread_cond_t*__restrict__cond,

__constpthread_condattr_t*__restrict__cond_attr)

12、销毁条件变量COND

intpthread_cond_destroy(pthread_cond_t*__cond)

13、唤醒线程等待条件变量

intpthread_cond_signal(pthread_cond_t*__cond)

14、等待条件变量(阻塞)

intpthread_cond_wait(pthread_cond_t*__restrict__cond,

pthread_mutex_t*__restrict__mutex)

15、在指定的时间到达前等待条件变量

intpthread_cond_timedwait(pthread_cond_t*__restrict__cond,

pthread_mutex_t*__restrict__mutex,

__conststructtimespec*__restrict__abstime)

五、实验步骤

1.进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。

2.运行make产生pthread可执行文件。

3.切换到minicom终端窗口,使用NFSmount开发主机的/arm2410到/host目录。

4.进入/host/exp/basic/pthread目录,运行pthread,观察运行结果的正确性。

5.修改一些参数,再次运行调试,加深对多线程的理解。

6.参考源代码:

#include<

stdlib.h>

time.h>

#include"

pthread.h"

#defineBUFFER_SIZE16

/*Circularbufferofintegers.*/

structprodcons{

intbuffer[BUFFER_SIZE];

/*theactualdata*/

pthread_mutex_tlock;

/*mutexensuringexclusiveaccesstobuffer*/

intreadpos,writepos;

/*positionsforreadingandwriting*/

pthread_cond_tnotempty;

/*signaledwhenbufferisnotempty*/

pthread_cond_tnotfull;

/*signaledwhenbufferisnotfull*/

};

/*--------------------------------------------------------*/

/*Initializeabuffer*/

voidinit(structprodcons*b)

pthread_mutex_init(&

lock,NULL);

pthread_cond_init(&

notempty,NULL);

notfull,NULL);

b->

/*Storeanintegerinthebuffer*/

/*Waituntilbufferisnotfull*/

while((b->

readpos){

printf("

waitfornotfull\n"

);

/*Writethedataandadvancewritepointer*/

/*Signalthatthebufferisnownotempty*/

/*Readandremoveanintegerfromthebuffer*/

/*Waituntilbufferisnotempty*/

waitfornotempty\n"

/*Readthedataandadvancereadpointer*/

/*Signalthatthebufferisnownotfull*/

#defineOVER(-1)

structprodconsbuffer;

void*producer(void*data)

intn;

for(n=0;

n<

1000;

n++){

put-->

%d\n"

n);

put(&

buffer,n);

}

put(&

buffer,OVER);

printf("

producerstopped!

\n"

returnNULL;

void*consumer(void*data)

intd;

while

(1){

d=get(&

buffer);

if(d==OVER)break;

%d-->

get\n"

d);

consumerstopped!

intmain(void)

pthread_tth_a,th_b;

void*retval;

init(&

pthread_create(&

th_a,NULL,producer,0);

th_b,NULL,consumer,0);

pthread_join(th_a,&

retval);

pthread_join(th_b,&

return0;

实验三、串行端口程序设计

1了解在linux环境下串行程序设计的基本方法。

2掌握终端的主要属性及设置方法,熟悉终端IO函数的使用。

3学习使用多线程来完成串口的收发处理。

读懂程序源代码,学习终端IO函数tcgetattr(),tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。

UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上,硬盘40G以上,内存大于128M。

PC机操作系统REDHATLINUX9.0+MINICOM+AMRLINUX开发环境

Linux操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在LINUX中进行串行通讯编程的基本方法。

1.程序流程图

程序流程图如图2-3所示:

图2-3程序流程图

2串口操作需要的头文件

/*标准输入输出定义*/

/*标准函数库定义*/

unistd.h>

/*linux标准函数定义*/

sys/types.h>

sys/stat.h>

fcntl.h>

/*文件控制定义*/

termios.h>

/*PPSIX终端控制定义*/

errno.h>

/*错误号定义*/

#include<

pthread.h>

/*线程库定义*/

3打开串口

在Linux下串口文件是位于/dev下,串口一为/dev/ttyS0,串口二为/dev/ttyS1,打开串口是通过使用标准的文件打开函数操作:

intfd;

/*以读写方式打开串口*/

fd=open("

/dev/ttyS0"

O_RDWR);

if(-1==fd){

perror("

提示错误!

"

4设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。

串口的设置主要是设置structtermios结构体的各成员值。

structtermio

{unsignedshortc_iflag;

/*输入模式标志*/

unsignedshortc_oflag;

/*输出模式标志*/

unsignedshortc_cflag;

/*控制模式标志*/

unsignedshortc_lflag;

/*localmodeflags*/

unsignedcharc_line;

/*linediscipline*/

unsignedcharc_cc[NCC];

/*controlcharacters*/

设置这个结构体很复杂,可以参考man手册或者由赵克佳、沈志宇编写的《UNIX程序编写教程》,我这里就只考虑常见的一些设置:

波特率设置:

下面是修改波特率的代码:

structtermiosOpt;

tcgetattr(fd,&

Opt);

cfsetispeed(&

Opt,B19200);

/*设置为19200Bps*/

cfsetospeed(&

tcsetattr(fd,TCANOW,&

校验位和停止位的设置:

无效验8位

Option.c_cflag&

=~PARENB;

=~CSTOPB;

=~CSIZE;

Option.c_cflag|=~CS8;

奇效验(Odd)7位

Option.c_cflag|=~PARENB;

=~PARODD;

Option.c_cflag|=~CS7;

偶效验(Even)7位

Option.c_cflag|=~PARODD;

Space效验7位

=&

~CSIZE;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1