嵌入式linux实验报告(共22页)_第1页
嵌入式linux实验报告(共22页)_第2页
嵌入式linux实验报告(共22页)_第3页
嵌入式linux实验报告(共22页)_第4页
嵌入式linux实验报告(共22页)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:学号:姓名:武易组员:朱清宇实验一 Linux下进程的创建一 实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二 实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait或waitpid清理进程。三 实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如

2、,只要用户输入一条命令,shell进程就创建一个新进程。fork函数用于在进程中创建一个新进程,新进程是子进程。原型如下:#include<sys/types.h>  /* 提供类型pid_t的定义 */#include<unistd.h>  /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值, fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三

3、种不同的返回值:ü 在父进程中,fork返回新创建子进程的进程ID;ü 在子进程中,fork返回0; ü 如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。e x e c函数原型execl,execlp,execle,execv,exe

4、cve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。 #include <stdlib.h> #include <unistd.h> exit:void exit(int status) _exit:void _exit(int status)3.wait和waitpid一个进程调用了exit之后,该进程 并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所 有内存空间,没有任何可执行

5、代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集。如果一个进程已经终止,但是它的父进程尚未调用wait或waitpid对它进行清理,这时的进程状态称为僵尸(Zombie)进程。该类进程保留了一定的信息(包括pID,退出状态,运行时间等),需要父进程通过wait / waitpid来取时才释放。如果父进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,如果系统大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。也可以

6、杀死父进程,则Zombie子进程会自动由init进程托管(init会负责清理)。四 实验代码#include<stdio.h>int main()int i;for(i = 3;i > 0;i-)printf("This is the childn");sleep(2);return 0;#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main()pi

7、d_t pid,pid_w;pid = fork();if(pid < 0)perror("fork failed");exit(1);if(pid = 0)execl("./chpro","chpro",NULL);elsedopid_w = waitpid(pid,NULL,WNOHANG);if(pid_w = 0)printf("child process has no exitedn");sleep(1);while(pid_w=0);if(pid_w=pid)printf("Get ch

8、ild %dn",pid_w);elseprintf("some error occured.n");return 0;五 实验结果实验二 Linux下shell程序设计一 实验目的掌握Linux下shell程序的设计方法,脚本文件的编写方法二 实验内容1.给shell脚本加注释,说明其功能2.编写一个安装脚本文件,将某个已知的程序安装在/myprogram下三 实验代码注释shell#定义两个变量PREFIX=uptechTARGETDIR=/arm2410sclear# make needed directoryif -f $TARGETDIR/img/zIm

9、age ; then echo "The target dir is already exist! " echo "Please backup your files or change to another directory"exitfimkdir $TARGETDIR 2>/dev/null#初始化arm4l的开发工具inst_armv4l_gcc()echo "install armv4l-unknown-linux-gcc-2.95.2 and libraray ."#解包tar -xjf armv4l-tools-2.

10、95.2.tar.bz2 -C / #安装linux系统及文件系统inst_linux()echo "install linux-2.4."tar -xjf $PREFIX-kernel.tar.bz2 -C $TARGETDIR | exit echo "install busybox-1.00-pre10."tar -xjf $PREFIX-busybox-1.00-pre10.tar.bz2 -C $TARGETDIR | exit echo "install rootfs."tar -xjf $PREFIX-root.tar.

11、bz2 -C $TARGETDIR | exit #gdb调试器初始化inst_gdb()echo "install gdb & gdbserver for arm920t."cp -arf gdb $TARGETDIR | exittar -xjf gdb/insight-6.0.tar.bz2 -C $TARGETDIR | exit 配置exp文件inst_exp()echo "install examples programs."cp -arf exp $TARGETDIR | exitcp -arf doc $TARGETDIR | e

12、xit#初始化GUI程序inst_gui()echo "install gui programs"cp -raf microwindows $TARGETDIR | exitmkdir $TARGETDIR/minigui 2>/dev/nulltar -jxf minigui/basic.tar.bz2 -C $TARGETDIR/miniguitar -jxf minigui/lib.tar.bz2 -C $TARGETDIR/miniguitar -jxf minigui/mde-1.6.0.tar.bz2 -C $TARGETDIR/miniguitar -j

13、xf minigui/mg-samples-1.6.0.tar.bz2 -C $TARGETDIR/miniguitar -jxf minigui/res-host.tar.bz2 -C $TARGETDIR/miniguitar -jxf minigui/res-target.tar.bz2 -C $TARGETDIR/minigui#初始化配置文件inst_config_file()#if -f /root/.bash_profile ; then #如果/root/.bash_profile文件存在#echo "backup old .bash_profile to .bash

14、_profile_bak" #cp -f /root/.bash_profile /root/.bash_profile.bak#fi#echo "copy .bash_profile to /root"#cp -af .bash_profile /root/.bash_profile if -f /etc/minirc.dfl ; then#如果/etc/minirc.dfl文件存在echo "backup /etc/minirc.df1."cp -f /etc/minirc.dfl /etc/minirc.dfl.bakfiecho &qu

15、ot;copy minirc.df1 to /etc"cp -af minirc.dfl /etc/minirc.dfl#.cd armv4l-tools | exitinst_armv4l_gcccd .cd develop | exitinst_linuxinst_config_filecd .cp -arf sh $TARGETDIR cp -arf img $TARGETDIR mkdir $TARGETDIR/demoscd imgtar jxf yaffs.tar.bz2 -C $TARGETDIR/demos/ 2>/dev/nullcd .inst_gdbins

16、t_expcd guiinst_guicd .cd $TARGETDIR echo arm-linux develop enviroment for UP-Netarm2410 install completed!Mysql-5.5.50-linux2.6-x86_64.tar.gz的安装:#!/bin/bashMYSQL_HOME=/myprogram/mysql# 将你的mysql安装程序解压后的文件名设置为MYSQL_DIR,将安装程序(mysql-xxx.tar.gz)放到当前目录MYSQL_DIR=mysql-5.5.50-linux2.6-x86_64MYSQL_DIR_OLD=$

17、PWD/$MYSQL_DIRMYSQL_DIR_NEW=/myprogram/$MYSQL_DIRMYSQL_SOURCE=$MYSQL_DIR_OLD.tar.gzif ! -f $MYSQL_SOURCE then echo "MySQL package not found!" exit 1fiid mysql > /dev/null 2>&1if $? -eq 1 then # If user mysql does not exist, # delete group mysql fisrt if exists sed -i '/mysql/

18、d' /etc/group echo "Add group mysql" groupadd mysql echo "Add user mysql" useradd -g mysql mysqlfiecho "Unzip MySQL-5.5.50"tar zxvf $MYSQL_SOURCE> /dev/null 2>&1echo "Move MySQL to the right place"mv $MYSQL_DIR_OLD $MYSQL_DIR_NEWecho "Create

19、 mysql linkage"ln -s $MYSQL_DIR_NEW $MYSQL_HOMEecho "Change mysql directory to the right user and group"cd $MYSQL_HOMEchown -R mysql .cd $MYSQL_HOME chgrp -R mysql .echo "Create mysql system database"$MYSQL_HOME/scripts/mysql_install_db -user=mysql > /dev/nullcd $MYSQL_HO

20、MEchown -R mysql datacd $MYSQL_HOMEchown -R root .echo "Set environment PATH"sed -i '/export PATH=/myprogram/mysql/bin:$PATH/d' /etc/profileecho 'export PATH=/myprogram/mysql/bin:$PATH' >> /etc/profile. /etc/profileecho "Set mysql as system service"cp $MYSQL

21、_HOME/support-files/mysql.server /etc/init.d/mysqlsysv-rc-conf mysql on/etc/init.d/mysql startecho -n "Please input password of mysql user root: "stty -echoread ROOT_PASSWORDstty echoechoif -z $ROOT_PASSWORD then echo "ERROR: The password is null!" exit 1fimysqladmin -uroot passw

22、ord "$ROOT_PASSWORD"mysql -uroot -p$ROOT_PASSWORD -e"grant all on *.* to rootlocalhost identified by '$ROOT_PASSWORD'"if $? -eq 0 then echo "Set mysql user root password successfully!"fi四 实验结果实验三 Linux下多线程程序设计一 实验目的了解多线程程序设计的基本原理。学习 pthread 库函数的使用。二 实验内容读懂 pthre

23、ad.c 的源代码,熟悉几个重要的 PTHREAD 库函数的使用。掌握共享锁和信 号量的使用方法。 进入/arm2410cl/exp/basic/02_pthread 目录,运行 make 产生 pthread 程序,使用 NFS 方式连接开发主机进行运行实验。三 实验过程1.多线程程序的优缺点多线程程序作为一种多任务、并发的工作方式,有以下的优点: 1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整 个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技 术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的

24、情况。 2) 使多 CPU 系统更加有效。操作系统会保证当线程数不大于 CPU 数目时,不同的线程 运行于不同的 CPU 上。 3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半 独立的运行部分,这样的程序会利于理解和修改。 LIBC 中的 pthread 库提供了大量的 API 函数,为用户编写应用程序提供支持。 2实验源代码与结构流程图 本实验为著名的生产者消费者问题模型的实现,主程序中分别启动生产者线程和消 费者线程。生产者线程不断顺序地将 0 到 1000 的数字写入共享的循环缓冲区,同时消费者 线程不断地从共享的循环缓冲区读取数据。流程图如图所示: 1、阅

25、读源代码及编译应用程序 进入 exp/basic/02_pthread 目录,使用 vi 编辑器或其他编辑器阅读理解源代码。运 行 make 产生 pthread 可执行文件,如图所示。2、下载和调试运行可执行程序,观察运行结果的正确性。四 实验代码#include <stdio.h>#include <stdlib.h>#include <time.h>/#include <conio.h>#include "pthread.h"#define BUFFER_SIZE 16/* 设置一个整数的圆形缓冲区 */struct p

26、rodcons /* 缓冲区数组 */int bufferBUFFER_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,

27、 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 fulln");pthread_c

28、ond_wait(&b->notfull, &b->lock);/*写数据并且指针前移*/b->bufferb->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 prodcon

29、s * b)int data;pthread_mutex_lock(&b->lock);/* 等待缓冲区非空*/while (b->writepos = b->readpos) printf("wait for not emptyn");pthread_cond_wait(&b->notempty, &b->lock);/* 读数据并且指针前移 */data = b->bufferb->readpos;b->readpos+;if (b->readpos >= BUFFER_SIZE) b-

30、>readpos = 0;/* 设置缓冲区非满信号*/pthread_cond_signal(&b->notfull);pthread_mutex_unlock(&b->lock);return data;/*-*/#define OVER (-1)#define ENDMINITERM 27/* ESC to quit miniterm */struct prodcons buffer;int stop = 0;int end = 0;/*-*/void * producer(void * data)int n;for (n = 0; n < 1000

31、; n+) if(stop)break;printf(" put->%dn", n);put(&buffer, n);sleep(1);put(&buffer, OVER);printf("producer stopped!n");end = 1;return NULL;/*-*/void * consumer(void * data)int d;while (1) if(stop)break;d = get(&buffer);if (d = OVER ) break;printf("%d->getn&quo

32、t;, d);sleep(1);printf("consumer stopped!n");end = 1;return NULL;/*-*/void* keyboard(void * data)int c;while(1)if(end)break;c=getchar();if(c = 27)stop = 1;break;return NULL;/*-*/int main(void)pthread_t th_a, th_b, th_c;void * retval;init(&buffer);pthread_create(&th_a, NULL, produce

33、r, 0);pthread_create(&th_b, NULL, consumer, 0);pthread_create(&th_c, NULL, keyboard, 0);pthread_join(th_c, &retval);pthread_join(th_a, &retval);pthread_join(th_b, &retval);return 0;五 实验结果实验四 Linux下串口通信一 实验目的1.了解在 linux 环境下串行程序设计的基本方法。 ¾ 掌握终端的主要属性及设置方法,熟悉终端 I /O 函数的使用。2.学习使用多

34、线程来完成串口的收发处理。二 实验内容读懂程序源代码, 学习终端 I/O 函数的使用方法,学习将多线程编程应用到串口的接 收和发送程序设计中。三 实验过程异步串行 I /O 方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。 数据的各不同位可以分时使用同一传输通道,因此串行 IO 可以减少信号连线,少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成 字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行 IO 方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即

35、每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。 图 2.3.1 给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送 出连续“1”。传送开始时首先发一个“”作为起始位,然后出现在通信线上的是字符的 二进制编码数据。每个字符的数据位长可以约定为 5 位、6 位、7 位或 8 位,一般采用 ASCII 编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数 个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。后是表示停止位的“1” 信号,这个停止位可以约定持续 1 位、1.5 位或 2 位的时间宽度。至此一个字符传送完毕

36、, 线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起 始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率 为 50,95,110,150,300,600,1200,2400,4800,9600 等。 接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误: z 奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。 z 帧格式错:一个字符从起始位到停止位的总位数不对。 z 溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。 每一种错误都会给出相应的出错信息,提示用户处理。一般串口调试都使用空的

37、MODEM 连接电缆,其连接方式如图所示。 Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量 的函数,我们的实验主要是为掌握在 Linux 中进行串行通讯编程的基本方法。本实验的程 序流程图如图所示。四 实验代码#include <termios.h>#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/signal.h>#include <pthread.h>#define BAUDRATE B#defin

38、e COM1 "/dev/ttyUSB0"#define COM2 "/dev/ttyS1"#define ENDMINITERM 27#define FALSE 0#define TRUE 1volatile int STOP=FALSE;volatile int fd;void child_handler(int s)printf("stop!n");STOP=TRUE;/*-*/void* keyboard(void * data)int c;for (;)c=getchar();if( c= ENDMINITERM)STOP=

39、TRUE;break ;return NULL;/*-*/* modem input handler */void* receive(void * data)int c;printf("read modemn");while (STOP=FALSE)read(fd,&c,1); /* com port */write(1,&c,1); /* stdout */printf("exit from reading modemn");return NULL;/*-*/void* send(void * data)int c='0'printf("send datan");while (STOP=FALSE) /* modem input handler */c+;c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论