首页 嵌入式系统原理与应用设计-实验指导书

嵌入式系统原理与应用设计-实验指导书

举报
开通vip

嵌入式系统原理与应用设计-实验指导书PAGE1/NUMPAGES97《嵌入式系统原理与应用设计》实验指导书山东科技大学电气信息系二00八年十月PAGE2/NUMPAGES97实验指导书编写说明《嵌入式系统原理与应用设计-实验指导书》是为配合《嵌入式系统原理与设计》课程而编写的实验指导书,主要是依据博创公司的ARM9实验箱UP-NETARM2410-S为硬件平台,LINUX操作系统和C基础语言编程为基础工具进行编写。指导书中含有13个实验,主要用来证明嵌入式系统的应用。使用与具有C语言基础和了解LINUX操作系统的学生。实验一嵌...

嵌入式系统原理与应用设计-实验指导书
PAGE1/NUMPAGES97《嵌入式系统原理与应用 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 》实验指导书山东科技大学电气信息系二00八年十月PAGE2/NUMPAGES97实验指导书编写说明《嵌入式系统原理与应用设计-实验指导书》是为配合《嵌入式系统原理与设计》课程而编写的实验指导书,主要是依据博创公司的ARM9实验箱UP-NETARM2410-S为硬件平台,LINUX操作系统和C基础语言编程为基础工具进行编写。指导书中含有13个实验,主要用来证明嵌入式系统的应用。使用与具有C语言基础和了解LINUX操作系统的学生。实验一嵌入式实验平台的认识PAGE3/NUMPAGES971、实验目的使初学者了解嵌入式教学实验平台UP-NETARM2410-S的硬件资源,学习演示linux操作系统移植的demo程序,了解嵌入式系统的硬件资源LCD显示、声音驱动、步进电机驱动。重点掌握交叉编译环境下的终端调试 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。2、实验仪器博创科技嵌入式教学实验箱UP-NETARM2410-S和电脑。3、实验内容UP-NETARM2410-S实验箱采用基于ARM9架构的嵌入式芯片S3C2410,主频202MHz,64MBSDRAM,64MBFLASH,UP-NETARM2410-S主板资源上有8寸640*480TFT真彩LCD、触摸屏、4个主USB口、1个从USB口、2个JTAG接口、一个100M网卡,预留一个100M网卡、两个串口、一个485接口、CAN总线接口、红外通信收发器、8通道10位AD转换模块、2通道10位DA转换模块等PCMCIA接口、SD/MMC接口、IDE硬盘接口、笔记本硬盘接口、CF卡接口、IC卡接口、直流电机、步进电机*8个用户自定义LED数码管*17键键盘*PS2鼠标、键盘接口。提供软件资源:完整的Linux、WinCE、μC/OS-II操作系统移植、bootloader:vivi、操作系统:linux2.4.x。4、实验原理4.1windows下的超级终端方式运行演示程序⑴建立超级终端:运行Windows系统下(以WindowsXP为例)开始→所有程序→附件→通讯→超级终端(HyperTerminal)。在windowsxp操作系统下,当初次建立超级终端的时候,会出现如下对话框,请在□中打上√,并选择“否”。⑵新建一个通信终端:区号、电话号码等信息随意输入,出现如下所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。单击“确定”按钮。⑶ARM开发平台实际连接的PC机串口选择COM1.端口设置:波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。PAGE4/NUMPAGES97⑷完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。用串口线将PC机串口和平台UART0正确连接后,就可以在超级终端上看到程序输出的信息了。⑸启动实验箱电源打开电源开关,系统会由VIVI开始引导。正常启动时会显示启动信息到“PressReturntostarttheLINUXnow,anyotherkeyforvivi”,不进行任何操作等待30S或按回车则启动进入linux系统,按除回车键外的其它键则进入vivi控制台,如图5.3.1。在这里输入“boot”,进入LINUX系统。⑹是在应用程序目录下,可以通过“ls”查看,如图演示程序都是经过编译后生成的二进制文件,用来测试开发板端口和演示开发板功能⑺演示内容1-播放视频:PAGE89/NUMPAGES89[/mnt/yaffs/iccard]cd/mnt/yaffs/mplayer/--带“/”表示绝对路径,但必须从/mnt开始[/mnt/yaffs/mplayer]lsmplayermplayer2test.avi[/mnt/yaffs/mplayer]mplayertest.avi――看到原始电影[/mnt/yaffs/mplayer]mplayer2test.avi――看到全频电影⑻根据说明书,实验直流电机工作方式。电机的演示:打开电机红色按钮开关(1)直流电机:[/mnt/yaffs]cdmotor/[/mnt/yaffs/motor]lsDCSTEP[/mnt/yaffs/motor]cdDC/――注意大小写[/mnt/yaffs/motor/DC]lsdc-motor.odcm_mainPAGE6/NUMPAGES97[/mnt/yaffs/motor/DC]insmoddc-motor.oUsingdc-motor.os3c2410_dcm_init(159):s3c2410-dc-motordeviceinitialized[/mnt/yaffs/motor/DC]./dcm_main――启动直流电机(2)步进电机:[/mnt/yaffs]cdmotor/[/mnt/yaffs/motor]lsDCSTEP[/mnt/yaffs/motor]cdSTEP/[/mnt/yaffs/motor/STEP]lsexio.ostepmotor[/mnt/yaffs/motor/STEP]insmodexio.oUsingexio.o[/mnt/yaffs/motor/STEP]./stepmotor――启动步进电机(9)播放mp3:[/mnt/yaffs]cdsound/[/mnt/yaffs/sound]ls1.wavmadplayttdl.mp3wavplaywavrec[/mnt/yaffs/sound]madplayttdl.mp3MPEGAudioDecoder0.14.2(beta)-Copyright(C)2000-2001RobertLesliePAGE89/NUMPAGES895、实验思考1)实验过程中目标机、主机、终端机各指什么设备。2)终端显示结果的程序在哪个设备中执行PAGE89/NUMPAGES89PAGE10/NUMPAGES97实验二交叉编译环境设置与终端调试1.实验目的:熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用,使用Linux的armv4l-unknown-linuxgcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。2.实验仪器硬件:博创科技嵌入式教学实验箱UP-NETARM2410-S、PC机Pentium500以上,硬盘10G以上的电脑。软件:WINDOWSXP操作系统、LINUX9.0操作系统、MINICOM终端调试器、ARM-LINUX开发环境。3、实验原理绝大多数Linux软件开发都是以native方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子上系统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC机)上,对应的开发板叫做目标板。运行Linux的PC【宿主机】开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行),然后把可执行文件下载到目标机上运行。调试时的方法很多,可以使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器提供的支持作出选择。宿主机和目标板的处理器一般不相同,宿主机为Intel处理器,而目标板如UP-NetARM2410-S开发板为三星S3c2410.GNU编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标嵌入式linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:建立开发环境:操作系统一般使用REDHAT-LINUX,版本7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。配置开发主机:配置MINICOM,一般参数为波特率115200,数据位8位,停止位1,无奇偶校验,软硬件控制流设为无。在WINDOWS下的超级终端的配置也是这样。MINICOM软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如三星的ARM7、ARM9系列芯片,这样就需要编写烧写开发板上flash的烧写程序,网络上有免费下载的WINDOWS下通过JTAG并口简易仿真器烧写ARM外围flash芯片的程序。也有LINUX下公开源代码的J-FLASH程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果你购买了厂家的仿真器当然比较容易烧写PAGE10/NUMPAGES97flash了,但是其中的核心技术是无法了解的。这对于需要迅速开发应用的人来说可以极大地提高开发速度。下载别人已经移植好的LINUX操作系统,如UCLINUX、ARM-LINUX、PPC-LINUX等,如果有专门针对你所使用的CPU移植好的LINUX操作系统那是再好不过,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带MMU的CPU可以使用模块方式调试驱动,对于UCLINUX这样的系统好像只能编译进内核进行调试。建立根文件系统,从www.busybox.net下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs、genromfs等工具产生烧写映象文件。建立应用程序的flash磁盘分区,一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性flash(NOR型)512K-32M,有的系统使用非线性flash(NAND型)8-512M,有的两个同时使用,需要根据应用规划flash的分区 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。开发应用程序,可以下载到根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II的方式。烧写内核、根文件系统、应用程序。发布产品。4、实验内容4.1开发环境的设置配置网络,包括配置IP地址、NFS服务、防火墙。网络配置主要是要安装好以太网卡,对于一般常见的RTL8139网卡,REDHAT9.0可以自动识别并自动安装好,完全不要用户参与,因此建议使用该网卡。然后配置宿主机IP为192.168.0.121。如果是在有多台计算机使用的局域网环境使用此开发设备,IP地址可以根据具体情况设置。如图2.1所示:图2.1网络配置双击设备eth0的蓝色区域,进入以太网设置界面,如图2.2,2.3所示:PAGE11/NUMPAGES97图2.2以太网常规设置界面图2.3以太网路由设置界面对于REDHAT9.0,它默认的是打开了防火墙,因此对于外来的IP访问它全部拒绝,这样其它网络设备根本无法访问它,即无法用NFSmount它,许多网络功能都将无法使用。因此网络安装完毕后,应立即关闭防火墙。操作如下:点击红帽子开始菜单,选择安全级别设置,选中无防火墙。如图2.4所示:PAGE12/NUMPAGES97图2.4安全级别设置在系统设置菜单中选择服务器设置菜单,再选中服务菜单,将iptables服务的勾去掉,并确保nfs选项选中。配置NFS:点击主菜单运行系统设置->服务器设置->NFS服务器(英文为:SETUP->SYSTEMSERVICE->NFS),点击增加出现如下在界面,在目录(Drictory):中填入需要共享的路径,在主机(Hosts):中填入允许进行连接的主机IP地址。并选择允许客户对共享目录的操作为只读(Read-only)或读写(Read/write)。如图2.5所示:图2.5NFS基本设置图2.6是对客户端存取服务器的一些其他设置,一般不需要设置,取默认值。图2.6NFS用户访问设置当将远程根用户当作本地根用户时,对于操作比较方便,但是安全性较差。最后退出时则完成NFS配置。配置好后,界面应显示如图2.7所示:PAGE13/NUMPAGES97图2.7远程根用户当作本地根用户图2.8配置好的NFS{**我们也可以手工编写/etc/exports文件,其格式如下:共享目录可以连接的主机(读写权限,其他参数)例如:/arm2410s192.168.0.*(rw,sync)表示将本机的/arm2410s目录共享给ip地址为192.168.0.1-192.168.0.254的所有计算机,可以读取和写入。**}配置完成后,可用如下办法简单测试一下NFS是否配置好了:在宿主机上自己mount自己,看是否成功就可以判断NFS是否配好了。例如在宿主机/目录下执行:mount192.168.0.10:/arm2410s/mnt其中192.168.0.10应为主机的IP地址。然后到/mnt/目录下看是否可以列出/arm2410s目录下的所有文件和目录,则可以说明mount成功,NFS配置成功。PAGE14/NUMPAGES97终端调试1)新建终端与编写程序新建终端有三种方式:开始菜单→系统设置→终端;在桌面空白位置单击鼠标右键,选择”新建终端”;单击桌面下面的快速启动栏的新建终端图标.新建一个终端,在终端的命令行状态下编写程序,与Linux操作环境相同。2)启动NFS服务功能新建一个终端,在新建的终端命令行输入[boot/@bc/boot]servicenfsstart启动NFS服务功能3)建立终端调试环境再新建一个终端,输入minicom.之后打开实验箱.,可以调试实验箱上的程序,程序运行于ARM9的核心处理器下,编写的程序可以使用。4.3交叉编译调试环境编程调试实验1)建立工作目录[root@root/arm2410s/exp/basic/]#mkdirhello[root@arm2410s/exp/basic]#cdhello2)编写程序源代码在Linux下的文本编辑器有许多,常用的是vim和Xwindow界面下的gedit等,在开发过程中推荐使用vim,如果学习vim的操作方法,请参考相关书籍中的关于vim的操作指南。Kdevelope、anjuta软件的界面与vc6.0类似,使用它们对于熟悉windows环境下开发的用户更容易上手。hello.c源代码如下:#includemain(){printf(“helloworld\n”);//这里输入自己实验需要显示的内容}我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:[root@hello]#vihello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令“:PAGE15/NUMPAGES97wq”保存并退出。这样我们便在当前目录下建立了一个名为hello.c的文件。3)编写Makefile要使上面的hello.c程序能够运行,必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个“make”命令整个工程就可以实现自动编译,本次实验只有一个文件,它还不能体现出使用Makefile的优越性,但当工程比较大文件比较多时,不使用Makefile几乎是不可能的。下面介绍本次实验用到的Makefile文件。下面介绍这个Makefile文件的几个主要部分:CC指明编译器EXEC表示编译后生成的执行文件名称OBJS目标文件列表CFLAGS编译参数LDFLAGS连接参数all:编译主入口clean:清除编译结果与上面编写hello.c的过程类似,用vi来创建一个Makefile文件并将代码录入其中:[root@hello]#viMakefile4)编译应用程序PAGE16/NUMPAGES97在上面的步骤完成后,可以在hello目录下运行“make”来编译程序了。如果进行了修改,重新编译则运行:[root@hello]#makeclean[root@hello]#make注意:编译、修改程序都是在宿主机(本地PC机)上进行,不能在MINICOM下进行。5)下载调试在宿主PC计算机上启动NFS服务,并设置好共享的目录,(前面已经配置完成)。在建立好NFS共享目录以后,可以进入MINICOM中建立开发板与宿主PC机之间的通讯了。[root@root]#minicom[/mnt/yaffs]mount-tnfs-onolock192.168.0.121:/arm2410s/host注意:IP地址需要根据宿主PC机的实际情况修改成功挂接宿主机的arm2410s目录后,在开发板上进入/host目录便相应进入宿主机的/arm2410s目录,已经给出了编辑好的hello.c和Makefile文件,它们在/arm2410s/exp/basic/01_hello目录下。用户可以直接在宿主PC上编译生成可执行文件,并通过上面的命令挂载到开发板上,运行程序察看结果。再进入/host目录运行刚刚编译好的hello程序,查看运行结果。[/mnt/yaffs]cd/host[/host]./hellohelloworld注意:开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重启,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板。五、思考 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 1)Makefile是如何工作的?其中的宏定义分别是什么意思?PAGE18/NUMPAGES97实验三多线程应用程序设计1.实验目的:进一步熟悉Linux开发环境,了解多线程程序设计的基本原理,掌握Linux多任务管理程序的开发;学习pthread库函数的使用。2.实验仪器硬件:博创科技嵌入式教学实验箱UP-NETARM2410-S、PC机Pentium500以上,硬盘10G以上的电脑。软件:WINDOWSXP操作系统、LINUX9.0操作系统、MINICOM终端调试器、ARM-LINUX开发环境。3、实验原理3.1多线程程序的优缺点多线程程序作为一种多任务、并发的工作方式,有以下的优点:1)提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(PAGE18/NUMPAGES97timeconsuming)置于一个新的线程,可以避免这种尴尬的情况。2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。LIBC中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。3.2实验源代码与结构流程图本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。流程图如图2.2.1所示:图2.2.1生产者-消费者实验源代码结构流程图本实验具体代码如下:PAGE89/NUMPAGES89/*************************************************Theclassicproducer-consumerexample.*Illustratesmutexesandconditions.*byZoujianguo*2003-12-22*************************************************/#include#include#include#include"pthread.h"#defineBUFFER_SIZE16/*设置一个整数的圆形缓冲区*/structprodcons{intbuffer[BUFFER_SIZE];/*缓冲区数组*/pthread_mutex_tlock;/*互斥锁*/intreadpos,writepos;/*读写的位置*/pthread_cond_tnotempty;/*缓冲区非空信号*/pthread_cond_tnotfull;/*缓冲区非满信号*/PAGE20/NUMPAGES97};/*--------------------------------------------------------*//*初始化缓冲区*/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;}/*--------------------------------------------------------*//*向缓冲区中写入一个整数*/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->buffer[b->writepos]=data;b->writepos++;if(b->writepos>=BUFFER_SIZE)b->writepos=0;/*设置缓冲区非空信号*/pthread_cond_signal(&b->notempty);pthread_mutex_unlock(&b->lock);}/*--------------------------------------------------------*//*从缓冲区中读出一个整数*/intget(structprodcons*b){intdata;pthread_mutex_lock(&b->lock);/*等待缓冲区非空*/while(b->writepos==b->readpos){printf("waitfornotempty\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);returndata;}/*--------------------------------------------------------*/#defineOVER(-1)structprodconsbuffer;/*--------------------------------------------------------*/void*producer(void*data){intn;for(n=0;n<1000;n++){PAGE21/NUMPAGES97printf("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;printf("%d-->get\n",d);}printf("consumerstopped!\n");returnNULL;}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;}PAGE89/NUMPAGES893.3主要函数分析:生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。消费者线程与生产者线程类似,这里就不再过多介绍了。流程图如下:PAGE23/NUMPAGES97图2.2.2生产消费流程图PAGE89/NUMPAGES89生产者写入共享的循环缓冲区函数PUTvoidput(structprodcons*b,intdata){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);//释放互斥锁}消费者读取共享的循环缓冲区函数GETPAGE89/NUMPAGES89intget(structprodcons*b){intdata;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);//释放互斥锁PAGE26/NUMPAGES97returndata;}PAGE89/NUMPAGES893.4主要的多线程API在本程序的代码中大量的使用了线程函数,如pthread_cond_signal、pthread_mutex_init、pthread_mutex_lock等等,这些函数的作用是什么,在哪里定义的,将在下面的内容中为大家做一个简单的介绍,并且为其中比较重要的函数做一些详细的说明。线程创建函数:intpthread_create(pthread_t*thread_id,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__restrict__arg)获得父进程ID:pthread_tpthread_self(void)测试两个线程号是否相同:intpthread_equal(pthread_t__thread1,pthread_t__thread2)线程退出:voidpthread_exit(void*__retval)等待指定的线程结束:intpthread_join(pthread_t__th,void**__thread_return)互斥量初始化:pthread_mutex_init(pthread_mutex_t*,__constpthread_mutexattr_t*)销毁互斥量:intpthread_mutex_destroy(pthread_mutex_t*__mutex)再试一次获得对互斥量的锁定(非阻塞):intpthread_mutex_trylock(pthread_mutex_t*__mutex)锁定互斥量(阻塞):intpthread_mutex_lock(pthread_mutex_t*__mutex)解锁互斥量:intpthread_mutex_unlock(pthread_mutex_t*__mutex)条件变量初始化:intpthread_cond_init(pthread_cond_t*__restrict__cond,__constpthread_condattr_t*__restrict__cond_attr)销毁条件变量COND:intpthread_cond_destroy(pthread_cond_t*__cond)PAGE29/NUMPAGES97唤醒线程等待条件变量:intpthread_cond_signal(pthread_cond_t*__cond)等待条件变量(阻塞):intpthread_cond_wait(pthread_cond_t*__restrict__cond,pthread_mutex_t*__restrict__mutex)在指定的时间到达前等待条件变量:intpthread_cond_timedwait(pthread_cond_t*__restrict__cond,pthread_mutex_t*__restrict__mutex,__conststructtimespec*__restrict__abstime)PTHREAD库中还有大量的API函数,用户可以参考其他相关书籍。下面我们对几个比较重要的函数做一下详细的说明:pthread_create线程创建函数intpthread_create(pthread_t*thread_id,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__restrict__arg)线程创建函数第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。pthread_join函数用来等待一个线程的结束。函数原型为:intpthread_join(pthread_t__th,void**__thread_return)第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。pthread_exit函数一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:voidpthread_exit(void*__retval)唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。下面我们来介绍有关条件变量的内容。使用互斥锁来可实现线程间数据的共享和通信,互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线线程间的同步。PAGE29/NUMPAGES97pthread_cond_init函数条件变量的结构为pthread_cond_t,函数pthread_cond_init()被用来初始化一个条件变量。它的原型为:intpthread_cond_init(pthread_cond_t*cond,__constpthread_condattr_t*cond_attr)其中cond是一个指向结构pthread_cond_t的指针,cond_attr是一个指向结构pthread_condattr_t的指针。结构pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。释放一个条件变量的函数为pthread_cond_destroy(pthread_cond_tcond)。pthread_cond_wait函数使线程阻塞在一个条件变量上。它的函数原型为:externintpthread_cond_wait(pthread_cond_t*__restrict__cond,pthread_mutex_t*__restrict__mutex)线程解开mutex指向的锁并被条件变量cond阻塞。线程可以被函数pthread_cond_signal和函数pthread_cond_broadcast唤醒,但是要注意的是,条件变量只是起阻塞和唤醒线程的作用,具体的判断条件还需用户给出,例如一个变量是否为0等等,这一点我们从后面的例子中可以看到。线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。这个过程一般用while语句实现。pthread_cond_timedwait函数另一个用来阻塞线程的函数是pthread_cond_timedwait(),它的原型为:externintpthread_cond_timedwait__P((pthread_cond_t*__cond,pthread_mutex_t*__mutex,__conststructtimespec*__abstime))它比函数pthread_cond_wait()多了一个时间参数,经历abstime段时间后,即使条件变量不满足,阻塞也被解除。pthread_cond_signal函数它的函数原型为:externintpthread_cond_signal(pthread_cond_t*__cond)它用来释放被阻塞在条件变量cond上的一个线程。多个线程阻塞在此条件变量上时,哪一个线程被唤醒是由线程的调度策略所决定的。要注意的是,必须用保护条件变量的互斥锁来保护这个函数,否则条件满足信号又可能在测试条件和调用pthread_cond_wait函数之间被发出,从而造成无限制的等待。4、实验内容读懂pthread.c的源代码,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量的使用方法。进入/arm2410s/exp/basic/02_pthread目录,运行make产生pthread程序,使用NFS方式连接开发主机进行运行实验。PAGE30/NUMPAGES97需要具备知识:有C语言基础、掌握在Linux下常用编辑器的使用、掌握Makefile的编写和使用、掌握Linux下的程序编译与交叉编译过程。5、实验步骤1)阅读源代码及编译应用程序进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make产生pthread可执行文件。图3.1程序所在目录2)下载和调试切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。进入/host/exp/basic/pthread目录,运行pthread,观察运行结果的正确性。运行程序最后一部分结果如下:waitfornotemptyput-->994put-->995put-->996put-->997put-->998put-->999PAGE31/NUMPAGES97producerstopped!993-->get994-->get995-->get996-->get997-->get998-->get999-->getconsumerstopped![/host/exp/basic/02_pthread]6、思考题1)加入一个新的线程用于处理键盘的输入,并在按键为ESC时终止所有线程。2)线程的优先级的控制。实验四串行端口程序设计1.实验目的:了解在linux环境下串行程序设计的基本方法。掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。学习使用多线程来完成串口的收发处理。2.实验仪器硬件:博创科技嵌入式教学实验箱UP-NETARM2410-S、PC机Pentium500以上,硬盘10G以上的电脑。软件:WINDOWSXP操作系统、LINUX9.0操作系统、MINICOM终端调试器、ARM-LINUX开发环境。PAGE32/NUMPAGES973、实验内容与基础知识读懂程序源代码,学习终端I/O函数tcgetattr(),tcsetattr()和tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。有C语言基础,掌握在Linux下常用编辑器的使用。掌握Makefile的编写和使用。掌握Linux下的程序编译与交叉编译过程。4、实验原理RS232C原理:异步串行I/O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。图4.1串行通信字符格式图4.1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。帧格式错:一个字符从起始位到停止位的总位数不对。溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。PAGE33/NUMPAGES97每一种错误都会给出相应的出错信息,提示用户处理。一般串口调试都使用空的MODEM连接电缆,其连接方式如下:图4.2实用RS-232C通讯连线程序分析:Linux操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在Linux中进行串行通讯编程的基本方法。本实验的程序流程图如下:PAGE34/NUMPAGES97图4.3串口通讯实验流程图本实验的代码如下:PAGE89/NUMPAGES89#include#include#include#include#include#include#defineBAUDRATEB115200#defineCOM1"/dev/ttyS0"#defineCOM2"/dev/ttyS1"#defineENDMINITERM27/*ESCtoquitminiterm*/#defineFALSE0#defineTRUE1volatileintSTOP=FALSE;volatileintfd;voidchild_handler(ints){printf("stop!!!\n");STOP=TRUE;}/*--------------------------------------------------------*/void*keyboard(void*data){intc;for(;;){c=getchar();if(c==ENDMINITERM){STOP=TRUE;break;}}returnNULL;}/*--------------------------------------------------------*//*modeminputhandler*/void*receive(void*data){intc;printf("readmodem\n");while(STOP==FALSE){read(fd,&c,1);/*comport*/write(1,&c,1);/*stdout*/}printf("exitfromreadingmodem\n");returnNULL;}/*--------------------------------------------------------*/void*send(void*data){intc='0';printf("senddata\n");while(STOP==FALSE)/*modeminputhandler*/{c++;c%=255;PAGE36/NUMPAGES97write(fd,&c,1);/*stdout*/usleep(100000);}returnNULL;}/*--------------------------------------------------------*/intmain(intargc,char**argv){structtermiosoldtio,newtio,oldstdtio,newstdtio;structsigactionsa;intok;pthread_tth_a,th_b,th_c;void*retval;if(argc>1)fd=open(COM2,O_RDWR);elsefd=open(COM1,O_RDWR);//|O_NOCTTY|O_NONBLOCK);if(fd<0){error(COM1);exit(-1);}tcgetattr(0,&oldstdtio);tcgetattr(fd,&oldtio);/*savecurrentmodemsettings*/tcgetattr(fd,&newstdtio);/*getworkingstdtio*/newtio.c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;/*ctrolflag*/newtio.c_iflag=IGNPAR;/*inputflag*/newtio.c_oflag=0;/*outputflag*/newtio.c_lflag=0;newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=0;/*nowcleanthemodemlineandactivatethesettingsformodem*/tcflush(fd,TCIFLUSH);tcsetattr(fd,TCSANOW,&newtio);/*setattrib*/sa.sa_handler=child_handler;sa.sa_flags=0;sigaction(SIGCHLD,&sa,NULL);/*handledyingchild*/pthread_create(&th_a,NULL,keyboard,0);pthread_create(&th_b,NULL,receive,0);pthread_create(&th_c,NULL,send,0);pthread_join(th_a,&retval);pthread_join(th_b,&retval);pthread_join(th_c,&retval);tcsetattr(fd,TCSANOW,&oldtio);/*restoreoldmodemsetings*/tcsetattr(0,TCSANOW,&oldstdtio);/*restoreoldttysetings*/close(fd);exit(0);}PAGE89/NUMPAGES89程序单功能分析:下对这个程序的主要部分做一下简单的分析PAGE89/NUMPAGES89头文件#include/* 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 输入输出定义*/#include/*标准函数库定义*/#include/*linux
本文档为【嵌入式系统原理与应用设计-实验指导书】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥12.0 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
夕夕资料
拥有专业强大的教研实力和完善的师资团队,专注为用户提供合同简历、论文写作、PPT设计、计划书、策划案、各类模板等,同时素材和资料部分来自网络,仅供参考.
格式:doc
大小:1MB
软件:Word
页数:0
分类:证券期货
上传时间:2021-04-22
浏览量:27