嵌入式Linux多进程通讯实验报告

嵌入式Linux多进程通讯实验报告
嵌入式Linux多进程通讯实验报告

实验报告

实验题目

嵌入式Linux多进程通讯实验姓名:

学号:

课程名称:

所在学院:

专业班级:

任课教师:

实验项目名称嵌入式Linux多进程通讯实验

一、实验目的与要求:

1、熟悉UNIX/LINUX 支持的无名管道通信方式。

2、熟悉UNIX/LINUX 支持的有名管道通信方式。

3、熟悉 LINUX 系统中进程之间信号通信的基本原理。

4、熟悉UNIX/LINUX 支持的共享内存通信方式。

5、熟悉UNIX/LINUX 支持的消息队列通信方式。

二、实验设备:

华清远见开发环境,PC机

三、实验方法(原理,流程图)

Linux 下的进程通信手段基本上是从 Unix 平台上的进程通信手段继承而来的。而对 Unix 发展做出重大贡献的两大主力 AT&T 的贝尔实验室及 BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对 Unix 早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而 Linux 则把两者的优势都继承了下来,如图1所示。

●Unix 进程间通信(IPC)方式包括管道、FIFO 以及信号。

●System V 进程间通信(IPC)包括 System V 消息队列、System V 信号量

以及 System V 共享内存区。

●Posix 进程间通信(IPC)包括 Posix 消息队列、Posix 信号量以及 Posix

共享内存区。现在在 Linux 中使用较多的进程间通信方式主要有以下几种。

图1进程间通信发展历程

(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

(2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。

(3)消息队列(Messge Queue):消息队列是消息的链接表,包括 Posix 消息

队列 SystemV 消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。

(4)共享内存(Shared memory):可以说这是最有效的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。(5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。

(6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

1、管道通信

管道是 Linux 中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入。Linux 的管道主要包括两种:无名管道和有名管道。

(1)无名管道

无名管道是Linux 中管道通信的一种原始方法,如图2(左图)所示,它具有如下特点。

●它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程

之间)。

●它是一个半双工的通信模式,具有固定的读端和写端。

●管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的

read()、write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

(2)有名管道(FIFO)

有名管道是对无名管道的一种改进,如图2(右图)所示,它具有如下特点:

●它可以使互不相关的两个进程实现彼此通信。

●该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道

之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。

●FIFO 严格地遵循先进先出规则,对管道及 FIFO 的读总是从开始处返回数

据,对它们的写则把数据添加到末尾,它们不支持如 lseek()等文件定位操作。

图2 无名管道(左)和有名管道(右)

2、标准流管道

与 Linux 的文件操作中有基于文件流的标准 I/O 操作一样,管道的操作也支持基于文件流的模式。这种基于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进行一定操作的可执行文件,例如,用户执行“ls -l”或者自己编写的程序“./pipe”等。由于这一类

四、实验过程、步骤及内容

(一)Linux 系统无名管道通信实验

1、创建新的文件目录:

$ cd ~/workdir/linux/application/10-comm $ mkdir pipe

$ cd pipe

2、将实验代码复制到新目录下:

3、编译并执行

$ gcc pipe.c –o pipe

$ ./pipe

4、实验代码

pipe.c

#include

#include

#include

int pid1, pid2;

main( )

{

int fd[2];

char outpipe[100], inpipe[100];

pipe(fd); /*创建一个管道*/

while ((pid1 = fork( )) == -1);

if (pid1 == 0)

{

lockf(fd[1], 1, 0);

sprintf(outpipe, "child 1 process is sending message!");

/*把串放入数组outpipe中*/

write(fd[1], outpipe, 50); /*向管道写长为50字节的串*/

sleep(5); /*自我阻塞5秒*/

lockf(fd[1], 0, 0);

exit(0);

}

else

{

while((pid2 = fork( )) == -1);

if (pid2 == 0)

{ lockf(fd[1],1,0); /*互斥*/

sprintf(outpipe, "child 2 process is sending message!");

write(fd[1], outpipe, 50);

sleep(5);

lockf(fd[1], 0, 0);

exit(0);

}

else

{ wait(NULL); /*同步*/

read(fd[0], inpipe, 50); /*从管道中读长为50字节的串*/

printf("%s/n", inpipe);

wait(NULL);

read(fd[0], inpipe, 50);

printf("%s/n",inpipe);

exit(0);

}

}

(二)Linux 系统有名管道通信实验

1、创建新的文件目录:

$ cd ~/workdir/linux/application/10-comm $ mkdir fifo

$ cd fifo

2、将实验代码复制到新目录下:

3、执行代码

$ gcc create_fifo.c -o create_fifo

$ ./create_fifo test

$ gcc read_fifo.c –o read_fifo

$ gcc write_fifo.c –o write_fifo

4、实验代码

create_fifo.c

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

if (argc < 2)

{

fprintf(stdout, "Usage: %s \n", argv[0]);

exit(1);

}

//int mkfifo(const char *path, mode_t mode);

if (mkfifo(argv[1], 0644) < 0)

{

fprintf(stderr, "mkfifo() failed: %s\n", strerror(errno));

exit(1);

}

return 0;

}

read_fifo.c

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE1024

int main(int argc, char **argv)

{

int fd;

if (argc < 2)

{

fprintf(stdout, "Usage: %s \n", argv[0]);

exit(1);

}

//int open(const char *path, int oflag, ...);

if ((fd = open(argv[1], O_RDONLY)) < 0)

{

fprintf(stderr, "open fifo %s for reading failed: %s\n", argv[1], strerror(errno));

exit(1);

}

fprintf(stdout, "open fifo %s for reading successed.\n", argv[0]);

char buffer[BUFFER_SIZE];

ssize_t n;

while (1)

{

again:

//ssize_t read(int fd, void *buf, size_t count);

if ((n = read(fd, buffer, BUFFER_SIZE)) < 0)

{

if (errno == EINTR)

{

goto again;

}

else

{

fprintf(stderr, "read failed on %s: %s\n", argv[1], strerror(errno));

exit(1);

}

}

else if (n == 0)

{

fprintf(stderr, "peer closed fifo.\n");

break;

}

else

{

buffer[n] = '\0';

fprintf(stdout, "read %d bytes from fifo: %s\n", n, buffer);

}

}

return 0;

}

write_fifo.c

#include

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE1024

void signal_handler(int s);

int main(int argc, char **argv)

{

int fd;

if (argc < 2)

{

fprintf(stdout, "Usage: %s \n", argv[0]);

exit(1);

}

signal(SIGPIPE, signal_handler);

//int open(const char *path, int oflag, ...);

if ((fd = open(argv[1], O_WRONLY)) < 0)

{

fprintf(stderr, "open fifo %s for writting failed: %s\n", argv[1], strerror(errno));

exit(1);

}

fprintf(stdout, "open fifo %s for writting successed.\n", argv[0]);

char buffer[BUFFER_SIZE];

ssize_t n;

//char *fgets(char *s, int size, FILE * stream);

while (fgets(buffer, BUFFER_SIZE, stdin))

{

again:

//ssize_t write(int fd, const void *buf, size_t count);

if ((n = write(fd, buffer, strlen(buffer))) < 0)

{

if (errno == EINTR)

{

goto again;

}

else

{

fprintf(stderr, "write() failed on fifo: %s\n", strerror(errno));

break;

}

} // end if

} // end while

return 0;

}

void signal_handler(int signo)

fprintf(stdout, "Caught signal %d\n", signo);

}

(三)Linux 系统信号机制实验

1、建立新的目录并将实验代码复制到该目录下$ cd ~/workdir/linux/application/10-comm $ mkdir signal

$ cd signal

2、编译代码:

$ gcc signal.c –o signal

3、实验代码:

signal.c

#include

#include

#include

#include

int wait_mark;

void waiting(), stop();

int main(int argc, char *argv[])

{

int p1, p2;

signal(SIGINT,stop);

while((p1 = fork()) == -1);

if (p1 > 0)/*在父进程中*/

{

while((p2 = fork()) == -1);

if (p2 > 0)/*在父进程中*/

{

wait_mark = 1;

waiting();

kill(p1, 10);

kill(p2, 12);

wait(NULL);

wait(NULL);

printf("parent process exit!\n");

exit(0);

}

else/*在子进程2中*/

{

wait_mark = 1;

signal(12, stop);

waiting();

lockf(1, 1, 0);

printf("child process 2 is killed by parent!\n");

lockf(1, 0, 0);

exit(0);

}

}

else/*在子进程1中*/

{

wait_mark = 1;

signal(10, stop);

waiting();

lockf(1, 1, 0);

printf("child process 1 is killed by parent!\n");

lockf(1, 0, 0);

exit(0);

}

}

void waiting()

{

while(wait_mark != 0);

}

void stop()

{

wait_mark = 0;

}

(四)Linux 系统共享内存通信实验

1、创建新的文件夹,并把实验代码复制到该目录下:$ cd~/workdir/linux/application/10-comm

$ mkdir shmem

$ cd shmem

2、编译代码:

$ gcc reader.c -o reader $ gcc writer.c -o writer

3、实验代码:

read.c

#include

#include

#include

#include

#include

#include

#include

#include

#define N 64

typedef struct

{

int pid;

char buf[N];

} shmbuf;

void handler(int signo)

{

return;

}

int main(int argc, char *argv[]) {

int shmid;

key_t key;

pid_t pid;

shmbuf *shmaddr;

signal(SIGUSR1, handler);

if ((key = ftok(".", 'a')) < 0)

{

perror("fail to ftok");

exit(-1);

}

if((shmid = shmget(key, sizeof(shmbuf), IPC_CREAT|IPC_EXCL|0666)) < 0) {

if (errno == EEXIST)

{

shmid = shmget(key, sizeof(shmbuf), 0666);

shmaddr = (shmbuf *)shmat(shmid, NULL, 0);

pid = shmaddr->pid;

shmaddr->pid = getpid();

kill(pid, SIGUSR1);

}

else

{

perror("fail to shmget");

exit(-1);

}

}

else

{

shmaddr = (shmbuf *)shmat(shmid, NULL, 0);

shmaddr->pid = getpid();

pause();

pid = shmaddr->pid;

}

while ( 1 )

{

pause();

if ( strncmp(shmaddr->buf, "quit", 4) == 0)

{

break;

};

printf("message from shm : %s", shmaddr->buf);

usleep(100000);

kill(pid, SIGUSR1);

}

shmdt(shmaddr);

return 0;

}

writer.c

#include

#include

#include

#include

#include

#include

#include

#include

#define N 64

typedef struct

{

int pid;

char buf[N];

} shmbuf;

void handler(int signo)

{

return;

}

int main(int argc, char *argv[])

{

int shmid;

key_t key;

pid_t pid;

shmbuf *shmaddr;

signal(SIGUSR1, handler);

if ((key = ftok(".", 'a')) < 0)

{

perror("fail to ftok");

exit(-1);

}

if((shmid = shmget(key, sizeof(shmbuf), IPC_CREAT|IPC_EXCL|0666)) < 0) {

if (errno == EEXIST)

{

shmid = shmget(key, sizeof(shmbuf), 0666);

shmaddr = (shmbuf *)shmat(shmid, NULL, 0);

pid = shmaddr->pid;

shmaddr->pid = getpid();

kill(pid, SIGUSR1);

}

else

{

perror("fail to shmget");

exit(-1);

}

}

else

{

shmaddr = (shmbuf *)shmat(shmid, NULL, 0);

shmaddr->pid = getpid();

pause();

pid = shmaddr->pid;

}

while ( 1 )

{

printf("please input : ");

fgets(shmaddr->buf, N, stdin);

kill(pid, SIGUSR1);

if (strncmp(shmaddr->buf, "quit", 4) == 0)

{

break;

}

pause();

}

sleep(1);

shmdt(shmaddr);

shmctl(shmid, IPC_RMID, NULL);

return 0;

}

(五)Linux 系统消息队列实验

1、创建新的目录,并把实验代码复制到该目录下$ cd~/workdir/linux/application/10-comm

$ mkdir msg

$ cd msg

2、编译代码:

$ gcc client1.c -o client1

$ gcc client2.c -o client2

$ gcc server.c -o server

3、实验代码:

Server.c

#include

#include

#include

#include

#include

#include

#define KEY_MSG 0x101 //使用共有的IPC key

#define MSGSIZE 64

typedef struct //定义消息结构体:消息类型和消息数据{

long mtype;

char mtext[MSGSIZE];

} msgbuf;

#define LEN sizeof(msgbuf) -sizeof(long)

int main()

{

int msgid;

msgbuf buf1, buf2;

msgid = msgget( KEY_MSG, IPC_CREAT|0666 );

while(1)

{

msgrcv(msgid, &buf1, LEN, 1L, 0);

//接受客户端1的消息

printf( "Receive client1 message: %s\n", buf1.mtext );//打印收到的消息

if ( buf1.mtext[0] == 'x' || buf1.mtext[0] == 'X' )

//若是退出标志,则给2个客户端都发退出信息

{ strcpy( buf1.mtext, "x" );

buf1.mtype = 3L;

msgsnd( msgid, &buf1, LEN, 0 );

buf1.mtype = 4L;

msgsnd( msgid, &buf1, LEN, 0 );

break;

}

buf1.mtype = 4L;

msgsnd( msgid, &buf1, LEN, 0 ); //将客户端1的消息转发给客户端2

msgrcv( msgid, &buf2, LEN, 2L, 0 ); //接受客户端2的消息

printf( "Receive client2 message: %s\n", buf2.mtext ); //打印收到的消息

if ( buf2.mtext[0] == 'x' || buf2.mtext[0] == 'X' )

//若是退出标志,则给2个客户端发退出信息

{ strcpy( buf2.mtext, "x" );

buf2.mtype = 3L;

msgsnd( msgid, &buf2, LEN, 0 );

buf2.mtype = 4L;

msgsnd( msgid, &buf2, LEN, 0 );

break;

}

buf2.mtype = 3L;

msgsnd( msgid, &buf2, LEN, 0 ); //将客户端2的消息转发给客户端1 }

sleep(1); //若退出,则先等待,以确保客户端程序退出

msgctl( msgid, IPC_RMID, NULL ); //删除消息队列,释放空间

exit(0);

}

Client1.c

#include

#include

#include

#include

#include

#define KEY_MSG 0x101

#define MSGSIZE 64

typedef struct

{

long mtype;

char mtext[MSGSIZE];

} msgbuf;

#define LEN sizeof(msgbuf) - sizeof(long)

int main()

{

int msgid;

msgbuf buf1, buf2;

msgid = msgget( KEY_MSG, 0666 );

while( 1 )

{ printf( "input the msg to client2:" );

gets( buf1.mtext );

buf1.mtype = 1L;

msgsnd( msgid, &buf1, LEN, 0 ); //客户端1获取消息并发往服务器

msgrcv( msgid, &buf2, LEN, 3L, 0 ); //准备从客户端2获取消息

if ( buf2.mtext[0] == 'x' || buf2.mtext[0] == 'X' )

{ printf( "client1 will quit!\n" ); break; }

printf( "Receive from client2, message: %s\n", buf2.mtext );

}

return 0;

}

Client2.c

#include

#include

#include

#include

#include

#define KEY_MSG 0x101

#define MSGSIZE 64

typedef struct

{

long mtype;

char mtext[MSGSIZE];

} msgbuf;

#define LEN sizeof(msgbuf) - sizeof(long)

int main()

{

int msgid;

msgbuf buf1, buf2;

msgid = msgget( KEY_MSG, 0666 ); while( 1 )

{

msgrcv( msgid, &buf2, LEN, 4L, 0 ); //等待客户端1 发消息if( buf2.mtext[0] == 'x' || buf2.mtext[0] == 'X' )

{

printf( "client2 will quit!\n" ); break;

}

else

printf( "Receive from client1, message: %s\n", buf2.mtext );

sleep(1); //等待一秒,以确保客户端1 已经收到了回执

printf( "input the msg to client1:" );

gets( buf1.mtext );

buf1.mtype = 2L;

msgsnd( msgid, &buf1, LEN, 0 ); //给客户端1 发送回执消息}

}

五、实验数据(现象)处理分析

(一)Linux 系统无名管道通信实验

运行结果,延迟 5 秒后显示:

child 1 process is sending message!

再显示:

child 2 process is sending message!

(二)Linux 系统有名管道通信实验

$ ./read_fifo test//执行读管道文件的程序

打开另一个终端,进入该目录

$ ./wirte_fifo //执行写管道文件的程序

写入 hello

open fifo ./write_fifo for writting successed.

hello

实验七:Linux多线程编程(实验分析报告)

实验七:Linux多线程编程(实验报告)

————————————————————————————————作者:————————————————————————————————日期:

实验七:Linux多线程编程(4课时) 实验目的:掌握线程的概念;熟悉Linux下线程程序编译的过程;掌握多线程程序编写方法。 实验原理:为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。 1 多线程概念 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。 使用多线程的理由之二是线程间方便的通信机制。同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。2多线程编程函数 Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pthread_t; 它是一个线程的标识符。 函数pthread_create用来创建一个线程,它的原型为: extern int pthread_create((pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)); 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。 函数pthread_join用来等待一个线程的结束。函数原型为: extern int pthread_join(pthread_t th, void **thread_return); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。 函数pthread_exit的函数原型为: extern void pthread_exit(void *retval); 唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。 3 修改线程的属性 线程属性结构为pthread_attr_t,它在头文件/usr/include/pthread.h中定义。属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。 设置线程绑定状态的函数为pthread_attr_setscope,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。 另外一个可能常用的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。 4 线程的数据处理

嵌入式linux基本操作实验一的实验报告

实验一linux基本操作实验的实验报告 一实验目的 1、熟悉嵌入式开发平台部件,了解宿主机/目标机开发模式; 2、熟悉和掌握常用Linux的命令和工具。 二实验步骤 1、连接主机和目标板;(三根线,网线直接连接实验箱和PC机,实验箱UART2连接主机的UART口)。 2、Linux命令的熟悉与操作 PC端:在PC机的桌面上打开虚拟机,并启动Linux系统,打开命令终端,操作Linux基本命令,如:查看:ls,进入目录:cd,创建文件:mkdir,删除文件:rmdir,配置网络:ifconfig,挂载:mount,设置权限:chmod,编辑器:vi,拷贝:cp等命令,要求能熟练操作。 使用方法: 1.查看:ls Ls列出文件和目录 Ls–a 显示隐藏文件 Ls–l 显示长列格式ls–al 其中:蓝:目录;绿:可执行文件;红:压缩文件;浅蓝:链接文件;灰:其他文件;红底白字:错误的链接文件 2.进入目录:cd 改变当前目录:cd 目录名(进入用户home目录:cd ~;进入上一级目录:cd -) 3.创建文件:mkdir 建立文件/目录:touch 文件名/mkdir目录名 4.删除文件:rmdir 删除空目录:rmdir目录名 5.配置网络:ifconfig 网络- (以太网和WIFI无线) ifconfig eth0 显示一个以太网卡的配置 6.挂载:mount mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘- 确定目录'/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘- 先从挂载点'/ mnt/hda2' 退出fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入/etc/mtab文件- 当文件为只读或当磁盘写满时非常有用 mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom挂载一个cdrom或dvdrom mount /dev/hdc /mnt/cdrecorder挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom挂载一个文件或ISO镜像文件

什么是嵌入式linux系统

什么是嵌入式linux系统? 一、什么是嵌入式linux? Linux从1991年问世到现在,短短的十几年时间已经发展成为功能强大、设计完善的操作系统之一,不仅可以与各种传统的商业操作系统分庭抗争,在新兴的嵌入式操作系统领域内也获得了飞速发展。嵌入式Linux(Embedded Linux)是指对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几K或者几M字节的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。嵌入式Linux既继承了intelnet上无限的开放原代码资源,又具有嵌入式操作系统的特性。 二、嵌入式Linux的特点版权费:免费; 购买费用:媒介成本; 技术支持:全世界的自由软件开发者提供支持; 网络特性:免费而且性能优异; 软件移植:容易,代码开放,有许多应用软件支持; 应用产品开发周期:短,新产品上市迅速,因为有许多公开的代码可以参考和移植; 实时性能:RT_Linux,hardhat Linux 等嵌入式Linux支持实时性能; 稳定性:好; 安全性:好。 三、嵌入式Linux的市场前景和商业机会 嵌入式Linux有巨大的市场前景和商业机会,出现了大量的专业公司和产品,如Montavista、Lineo、Emi等。有行业协会,如Embedded Linux Consortum等。得到世界著名计算机公司和oem板级厂商的支持,例如IBM、Motorola、Intel等。传统的嵌入式系统厂商也采用了Linux策略如Lynxworks 、Windriver、QNX等。还有intelnet上的大量嵌入式Linux 爱好者的支持。嵌入式Linux支持几乎所有的嵌入式cpu和被移植到几乎所有的嵌入式oem板。 四、嵌入式Linux的应用领域嵌入式Linux的应用领域非常广泛,主要的应用领域有,信息家电:PDA,STB-Set-stopbox,Digital Telephone,Answering Machine,Screen Phone、数据网络:Ethernet switches,Router,Bridge,Hub,Remote access servers,ATM,Frame relay、远程通信、医疗电子、交通运输、计算机外设、工业控制、航空领域等。 五、嵌入式linux的优势嵌入式Linux的开发和研究是操作系统领域中的一个热点,目前已经开发成功的嵌入式系统中,大约有一半使用的是Linux。Linux之所以能在嵌入式系统市场上取得如此辉煌的成果,与其

《嵌入式系统与开发》构建嵌入式Linux系统-实验报告

《嵌入式数据库sqlite移植及使用》 实验报告 学生姓名:陈彤 学号:13004405 专业班级:130044 指导教师:孙国梓 完成时间:2016.5.31 实验3 嵌入式数据库sqlite移植及使用 一.实验目的 理解嵌入式软件移植的基本方法,掌握sqlite数据库软件移植的步骤,掌握sqlite开发的两种方式—命令模式和C代码开发模式的使用方法,并编程实现简单通讯录查询实验。 二.实验内容 实验3.1 移植嵌入式数据库sqlite 实验3.2 简单通讯录查询实例设计和测试 三.预备知识 Linux使用、数据库相关知识等 四.实验设备及工具(包括软件调试工具) 硬件:ARM 嵌入式开发平台、PC 机Pentium100 以上、串口线。 软件:WinXP或UBUNTU开发环境。 五.实验步骤 5.1 移植嵌入式数据库sqlite 步骤【参看教材103页】: 第一步,解压缩sqlite源码,命令tar zxvf sqlite-autoconf-3080900.tar.gz,在解压后的文件夹下,可以看到源码文件有shell.c 和sqlite3.c文件,生成Makefile的配置脚本文件configure.ac ,并检查当前文件夹下__A__(A.存在 B.不存在)Makefile文件。 第二步利用configure脚本文件生成基于ARM实验台的Makefile,具体命令为./configure CC=arm-linux-gcc –prefix=/opt/sqlite –host=arm-linux(假设安装目录为/opt/sqlite),并检查当前文件夹下___A__(A.存在 B.不存在)Makefile文件。 第三步,编译sqlite,命令为_make_,编译过程中使用的编译器为_ arm-linux-gcc _。 第四步,安装sqlit,命令为_make install_。安装完成后到_/opt/sqlite_文件夹下去查看相关文件,可以看到该文件夹下有_bin_、_include_、__lib__和share文件夹,其中可执行文件sqlite3位于_./bin_文件夹,库位于_./lib_文件夹。 第五步,将sqlite3拷贝到开发板bin目录下,将库下的文件拷贝到开发板的lib目录下【注意链接文件的创建】 第六步,数据库的使用 方式1:命令操纵数据库 在超级终端环境下创建数据库stucomm.db,命令为_sqlite3 stucomm.db_; 创建数据表stutable,字段包括id 整型,name 字符型,phoneNum 字符型,具体命令为_sqlite> create table stutable (id int(20),name char(20),phoneNum char(20));_; 插入2条记录,记录信息如下 001,zhangsan,10086 002,lisi,10000

嵌入式Linux实验三

实验三:文件、目录及其操作命令 1实验目的 通过实验掌握如Linux操作系统的基本操作 2实验设备 硬件:PC机一台 软件:Windows98/XP/2000系统,VMware Workstation6.0,Red Hat Linux 3实验内容 (1)文件的复制、删除和移动命令:cp, rm, mv (2)Linux文件与目录 (3)目录命令:mkdir, rmdir, cd, pwd, ls (4)链接文件与ln (5)文件与目录的权限 4实验预习要求 仔细阅读参考书: 【1】鸟哥的Linux私房菜基础学习篇第三版,人民邮电出版社,鸟哥 【2】嵌入式Linux系统开发标准教程,人民邮电出版社,华清远见嵌入式培训中心 【3】嵌入式Linux应用程序开发标准教程,人民邮电出版社,华清远见嵌入式培训中心关于Linux文件与目录的部分。 5实验步骤 (1)熟悉Red Hat Enterprise Linux系统。 (2)根据实验重点内容测试。 6实验重点: (1)文件的复制、删除与移动:cp, rm, mv 要复制文件,请使用cp (copy) 这个命令即可。不过,cp 这个命令的用途不仅仅于此。除了单纯的复制之外,还可以建立连结文件(就是快捷方式),比对两文件的新旧而予以更新,以及复制整个目录等等的功能。至于移动目录与文件,则使用mv (move),这个命令也可以直接拿来作重命名(rename) 的操作!至于(移除)删除文件,使用rm (remove) 这个命令。

cp (复制文件或目录) [root@localhost ~]# cp [-adfilprsu] 源文件(source) 目标文件(destination) [root@localhost ~]# cp [options] source1 source2 source3 .... directory 选项与参数: -a:相当于-pdr 的意思,至于pdr 请参考下列说明;(常用) -d:若源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身; -f :为强制(force)的意思,若目标文件已经存在则无法开启,则移除后再尝试一次; -i :若目标文件(destination)已经存在时,在覆盖时会先询问操作的进行(常用) -l :进行硬式连结(hard link)的连结文件建立,而非复制文件本身; -p:连同文件的属性一起复制过去,而非使用默认属性(备份常用); -r :递归持续复制,用于目录的复制行为;(常用) -s :复制成为符号链接文件(symbolic link),亦即快捷方式文件; -u :若destination 比source 旧,才更新destination ! 最后需要注意的,如果源文件有两个以上,则最后一个目标文件一定要是目录才行! 范例一:用root身份,将主目录下的.bashrc 复制到/temp 下,并更名为bashrc (~代表目前用户身份所在的主文件夹) [root@localhost ~]# cp ~/.bashrc /temp/bashrc [root@localhost ~]# cp -i ~/.bashrc /temp/bashrc cp: overwrite `/temp/bashrc'? n <==n不覆盖,y为覆盖 说明:重复作两次操作,由于/temp 下已经存在bashrc 了,加上-i 选项后,则在覆盖前会询问使用者是否确定!可以按下n 或者y 来二次确认。 范例二:将主目录下的.bashrc和.bash_history 复制到/temp下。 [root@localhost ~]cp ~/.bashrc ~/.bash_history /temp 可以将多个数据一次复制到同一目录中去,最后面一定是目录。 范例三:复制/etc/ 这个目录下的所有内容到/tmp 下 [root@www tmp]# cp /etc/ /tmp cp: omitting directory `/etc' <== 如果是目录则不能直接复制,要加上-r 的选项 [root@www tmp]# cp -r /etc/ /tmp -r 是可以复制目录,但是,文件与目录的权限可能会被改变。所以,也可以利用cp –a /etc /tmp 来下执行!尤其是在备份的情况下! rm (移除文件或目录) [root@localhost ~]# rm [-fir] 文件或目录 选项与参数:

嵌入式Linux系统期末考试简答题、运用题

简答题与应用题 什么是嵌入式系统?主要有什么特点? 以应用为中心,以计算机技术为基础的, 并且软件硬件是可剪裁的, 能满足应用系统对功能、 可靠性、成本、 体积、功耗等指标的严格要求的专用计算机系统。他可以实现对其他设备的控制、监视或者管理等功能。 与通用的 计算机系统相比,特点为: (1) (2) (5) 嵌入式系统通常由嵌入式处理机、嵌入式外围设备、嵌入式操作系统和嵌入式应用软件等几大部分组成。 4、什么是Linux ?什么是嵌入式 Linux ? 答:严格来讲,Linux 是指由Linux 本人维护并不断更新的内核 。 一个嵌入式Linux 系统指的是一个基于 Linux 内核的,但不包含有关这个内核的任何专业的库或是用户工具 的嵌入式系统。 Linux 内核构建嵌入式操作系统有什么优势(优良特性)? 程度代码是可以获取的,可靠度高; 有完整的源码,软件丰富并且免费; 得到众多硬件生产家的广泛支持;包括 cpu 、计算机外 围设备 完善的通信协议、软件标准和文件管理机制; 提供完全免费且优秀的开发工具; 广泛的社群支持 无需购买lice nee ,是免费的; 不依赖特定厂商、供应商; 成本相对低廉。 6、 RTOS (嵌入式操作系统)强调的实时是什么概念?与中断的关系? 答:实时指的是特定操作所消耗的时间(以及空间)的上限是可预知的。操作系统能够在规定响应时间内完成客 户服务程序。中断程序响应中断并完成 是在固定时间内。 7、什么是实时LinUX ?涉及到哪些软硬件内容? 答:实时LinUX ( RT-Linux )通过在Linux 内核与硬件中断之间增加一个精巧的可抢先的实时内核 ,把标准的Linux 内核作为实时内核的一个进程与用户进程一起调度 ,标准的Linux 内核的优先级最低,可以被实时进程抢断。 正 常的Linux 进程仍可以在Linux 内核上运行,这样既可以使用标准分时操作系统即 Linux 的各种服务,又能提 供低延时的实时环境。它在硬件上涉及到硬件中断,软件上涉及到对高优先级的实时硬件中断的快速响应。 能在规定的时间内完成对突发事件的处理的 Linux 系统; 软件:中断服务程序、进程调度程序,硬件:嵌入式系统所采用的中断管理硬件。 8、试简要说明Linux 内核构成,并简要说明各部分的功能? 答: MMU :内存管理单元,完成地址映射(应用虚拟地址方式) VFS :虚拟文件管理系统,提供了统一管理计算机资源的途径。使统一规范计算机资源的使用格式成为可能,方 1、 答: 面向特定应用,一般都有实时要求; 集先进性的计算机技术、半导体工艺、电子技术和通信网络技术于一体的并且在不断创新的知识集 成系统; 嵌入式系统是和具体应用对象有机结合在一起,因而其升级换代也是和具体的产品同步进行的。 嵌入式系统的软 硬件设计着重于高效率性。在最大限度满足应用需求的前提下,降低成本是必须要 考虑的主要问题。 嵌入式系统软件一般都固化在存储器芯片中。 (3) (4) 5、 用 答:( 1) (2) (3) (4) (5) (6) (7) (8) () 2、 答: 3、嵌入式操作系统的作用是什么?

查看程序的进程和线程实验报告

查看程序的进程和线程实验报告 篇一:程序实验2:11-多线程编程---实验报告 程序实验二:11-多线程编程实验 专业班级实验日期 5.21 姓名学号实验一(p284:11-thread.c) 1、软件功能描述 创建3个线程,让3个线程重用同一个执行函数,每个线程都有5次循环,可以看成5个小任务,每次循环之间会有随即等待时间(1-10s)意义在于模拟每个任务到达的时间是随机的没有任何的特定规律。 2、程序流程设计 3.部分程序代码注释(关键函数或代码) #include #include #include #define T_NUMBER 3 #define P_NUMBER 5 #define TIME 10.0

void *thrd_func(void *arg ) { (本文来自:https://www.360docs.net/doc/d66982164.html, 小草范文网:查看程序的进程和线程实验报告) int thrd_num=(int)arg; int delay_time =0; int count =0; printf("Thread %d is staraing\n",thrd_num); for(count=0;count { delay_time =(int)(rand()*TIME/(RAND_MAX))+1; sleep(delay_time); printf("\tTH%d:job%d delay =%d\n",thrd_num,count,delay_time); } printf("%d finished\n",thrd_num); pthread_exit(NULL); } int main()

南邮嵌入式系统B实验报告2016年度-2017年度-2

_* 南京邮电大学通信学院 实验报告 实验名称:基于ADS开发环境的程序设计 嵌入式Linux交叉开发环境的建立 嵌入式Linux环境下的程序设计 多线程程序设计 课程名称嵌入式系统B 班级学号 姓名 开课学期2016/2017学年第2学期

实验一基于ADS开发环境的程序设计 一、实验目的 1、学习ADS开发环境的使用; 2、学习和掌握ADS环境下的汇编语言及C语言程序设计; 3、学习和掌握汇编语言及C语言的混合编程方法。 二、实验内容 1、编写和调试汇编语言程序; 2、编写和调试C语言程序; 3、编写和调试汇编语言及C语言的混合程序; 三、实验过程与结果 1、寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。 代码1:使用C内嵌汇编 #include int find_gcd(int x,int y) { int gcdnum; __asm { MOV r0, x MOV r1, y LOOP: CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE LOOP MOV r3, r0 MOV gcdnum,r3 //stop // B stop // END } return gcdnum; } int main() { int a; a = find_gcd(18,9);

printf("gcdnum:%d\n",a); return 0; } 代码2:使用纯汇编语言 AREA example1,CODE,readonly ENTRY MOV r0, #4 MOV r1, #9 start CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE start MOV r3, r0 stop B stop END 2、寄存器R0 、R1和R2中有三个正整数,求出其中最大的数,并将其保存在R3中。 代码1:使用纯汇编语言 AREA examp,CODE,READONL Y ENTRY MOV R0,#10 MOV R1,#30 MOV R2,#20 Start CMP R0,R1 BLE lbl_a CMP R0,R2 MOVGT R3,R0 MOVLE R3,R2 B lbl_b lbl_a CMP R1,R2 MOVGT R3,R1 MOVLE R3,R2 lbl_b B . END 代码2:使用C内嵌汇编语言 #include int find_maxnum(int a,int b,int c)

建立嵌入式linux开发环境实验

嵌入式linux开发环境的建立 一、创建文件:vi hello.c如下: 二、安装交叉编译器: arm-linux-gcc-3.4.6-glibc-2.3.6.tar 步骤1、把交叉编译链考贝到任意目录下,并解压:tar zxvf arm-linux-gcc-3.4.6-glibc-2.3.6.tar –C / 2、把以上路径添加到/etc/profile文件的最后:export PATH=$PATH:/gcc-3.4.6-glibc-2.3.6/arm-linux/bin 3、输入命令使环境变量立即生效:source /tec/profile 4、测试是否安装成功:arm-linux-gcc–v 如果显示版本号,则安装成功。 5、编译C文件:arm-linux-gcc hello.c–o hello 三、配置tftp服务步骤

1、检查系统有无安装包:用命令:rpm –aq | grep tftp,如有安装包的版本号,说明系统已有相应的安装包; 2、配置服务器,打开文件:vi /etc/xinetd.d/tftp,显示如下桌面service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = yes } 然后编辑将disable改为no,其他不变 3、重启xinetd服务:service xinetd restart, 停止 xinetd: [ 确定 ] 启动 xinetd: [ 确定 ] 4、输入如下命令:netstat –a | grep tftp,如果出现如下画面

嵌入式Linux系统

10-1 嵌入式Linux系统概述 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。 Linux在所有的操作系统中,Linux 是一个发展最快、应用最为广泛的操作系统。 所谓嵌入式Linux,是指Linux 在嵌入式系统中应用,而不是什么嵌入式功能。实际上,嵌入式Linux 和Linux 是同一件事。 10-2 Linux启动过程综述 一. Bootloader 二.Kernel引导入口 三.核心数据结构初始化--内核引导第一部分 四.外设初始化--内核引导第二部分 五.init进程和inittab引导指令 六.rc启动脚本 七.getty和login 八.bash 附:XDM方式登录 Bootloader 简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。 在Alpha/AXP平台上引导Linux通常有两种方法,一种是由MILO及其他类似的引导程序引导,另一种是由Firmware直接引导。MILO功能与i386平台的LILO相近,但内置有基本的磁盘驱动程序(如IDE、SCSI等),以及常见的文件系统驱动程序(如ext2,iso9660等),firmware有ARC、SRM两种形式,ARC具有类BIOS界面,甚至还有多重引导的设置;而SRM

嵌入式linux实验指导书

嵌入式linux实验指导书 实验一:arm裸机实验 实验条件: pc ADS开发环境FL2440开发套件SecureCRT串口超级终端 实验目的: 熟悉arm裸机开发基本步骤,掌握ADS集成开发环境的使用,能够编写简单的裸机程序并下载到开发板运行测试。 实验原理: ADS 全称为ARM Developer Suite ,是ARM 公司推出的新一代ARM 集成开发工具。ADS 由命令行开发工具、ARM 实时库、GUI 开发环境(Code Warrior 和AXD) 、实用程序和支持软件组成。有了这些部件,用户就可以为ARM 系列的RISC 处理器编写和调试自己开发的应用程序了。本次实验利用ADS集成开发环境建立基于arm9 S3C2440的实验工程,完成工程搭建、代码编写和编译,生成可执行文件并下载到开发板进行运行测试。 实验步骤: 1、首先打开ADS软件CodeWarrior,点击File 菜单下的New 来创建新工程。Project 对话框中选择ARM Executable Image 。在Project name 中输入工程名,例:2440_led,点击“Location:”文本框的“Set...”按钮,选择要将工程保存的路径,然后点击确定即可建立一个新的工程。工程建立之后会出现一个24 40_led.mcp 窗口。 2、创建源文件,点击File 菜单下的New,选择标签页File,在File name 中输入要建立的文件名,如:Init.s (.s 文件为arm 中的汇编文件),若此时选上了Add to Project,创建的文件会自动添加到工程中,选择target方式为DebugRel,点击确定关闭窗口,文件创建完成后编写代码。(可将arm_linux文件夹下的裸机例程代码复制到工程中进行修改,如:复制裸机程序中的led程序init.s led.c 到建立的工程文件目录中,点击Project 菜单下的Add Fils 将源文件添加到工程中)

嵌入式LINUX系统的实现

嵌入式LI N UX系统的实现 检修厂 王小康 摘 要 嵌入式系统正变得越来越流行。被广泛地应用在各种网络设备、控制设备以及个人的数字工具如PDA中。文章论述了作者在嵌入式操作系统领域里所做的研究和实践工作,主要的工作围绕着将L i nux改造成嵌入式操作系统所进行的具体工作展开,包括单板配置代码,系统的引导与修改,核心映象定制与修改和调试工作。 1 引言 在当今数字信息技术、网络技术高速发展与发达的后PC时代,嵌入式系统无处不在,并将不断涌现出新的嵌入式应用系统。传统的操作系统软件[1][2]很难有效地支持嵌入式应用系统的快速开发,因而研究与开发嵌入式操作系统,对有效的支持广大的嵌入式应用系统开发具有重大意义,是十分必要的。L i n ux正在向嵌入式领域的各个方面进军,在不久的将来,我们可以发现嵌入式L i n ux的广泛的应用:各种车载嵌入式设备(GPS,电子地图)、消费电子设备、手持电脑(H PC,PDA)、蜂窝电话、Internet接入设备、工控设备以及各种网络的基础设施(网管设备,路由,网关,交换器,HUB等)[3]。 本文是围绕着嵌入式L i n ux系统的实现展开的。首先介绍嵌入式L i n ux系统的硬件结构和软件结构;然后对基于L i n ux的嵌入式实时操作系统的实现过程进行详细的阐述;最后是简短的总结。 2 嵌入式L inux系统的硬件结构 嵌入式L i n ux系统硬件系统是个微形化的专用PC,它包括系统主机扳、通讯接口板、图象处理和显示板、输入控制板以及存储板等。主机板可采用嵌入式X86CPU系列,图象处理和显示板能支持MPEG数字解压缩和电视终端显示,输入控制包括遥控键盘、遥控器和其他一些输入设备接口,存储板主要 要求。 7 设计报警和连锁保护系统 报警系统的作用在于及时提醒操作人员密切注意监视生产状况,以便采取措施减少事故的发生,连锁保护系统是指当生产出现严重事故时,为保证设备和人身的安全,使各个设备按一定次序紧急停下来。在焙烧炉的炉顶温度控制中,根据工艺要求,一个高限报警温度为480度;三个连锁保护温度设定,一个超高限报警温度自动连锁烧嘴,引起烧嘴自动熄火,从而立即引起调节阀的自动关闭,防止煤气流入焙烧炉,一个低限位报警温度用来连锁模式的切换,使模式从酸模式自动切换到水模式,另一个超低限位报警温度用来连锁三个喷枪,使得三个喷枪自动从焙烧炉提升出来,从而保护喷枪。 8 控制系统的调试和运行状况 控制系统安装完成后,应随生产过程进行试运行,按控制要求检查和调整各控制仪表和设备的工作状况,包括调节器的P、I等参数整定,依次将全部控制系统投入运行,在从投入运行到现在有半年多的时间了,发现焙烧炉的炉顶温度控制效果好,系统运行比较稳定。 20

实验四 同步与互斥 Linux实验报告

实验四同步与互斥 【实验目的和要求】 1、掌握进程(线程)的同步与互斥。 2、掌握生产者消费者问题的实现方法。 3、掌握多线程编程方法。 【实验内容】 实现生产者消费者问题 1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。 2、仓库中每次只能入一个(生产者或消费者)。 3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。 4、当仓库空时,消费者不能从中取出产品。 5、生产、消费速度不同。 【实验原理】 1、信号量mutex提供对缓冲池访问的互斥要求并初始化为1,信号量empty和 full分别用来表示空缓冲项和满缓冲项的个数,信号量empty初始化为n,信号量full初始化为0。 2、定义如下结构及数据: 定义缓冲区内的数据类型:typedef int buffer_item; 缓冲区:buffer_item buffer[BUFFER_SIZE];

对缓冲区操作的变量:int in,out; 信号量mutex提供了对缓冲池访问的互斥要求:pthread_mutex_t mutex; 信号量empty和full分别表示空缓冲顶和满缓冲顶的个数:sem_t empty,full; 可以设定生产者的生产速度及消费者的消费速度:int pro_speed,con_speed; 对缓冲区操作的自增函数:#define inc(k) if(k < BUFFER_SIZE) k = k+1;else k=0 3、并定义了如下实现问题的函数模块: 将生产的产品放入缓冲区: int insert_item(buffer_item item) 从缓冲区内移走一个产品: int remove_item(buffer_item *item) 生产者进程:void *producer(void *param) 消费者进程:void *consumer(void *param) 生产者结构进程消费者结构进程 【程序代码】 //sx.c #include

linux使用多线程解决“读者—写者”问题实验报告

计算机科学与技术系 实验(项目)报告 一、基本信息 二、目的与要求 目的: 通过实验掌握Linux环境下多线程程序的开发方法。 要求: 1.掌握线程的基本概念及操作; 2.掌握线程间通信的基本方法; 3.掌握Linux环境下多线程程序的开发方法及步骤。 三、完成实验(项目)过程和效果 内容: 1.问题分析; 有100个读线程和100个写线程共同读、写文件 (1)允许多个reader同时读一个文件; (2)当有一个reader在读文件时,不允许writer写文件; (3)当有一个writer在写文件时,不允许reader读文件,也不允许其 他writer写文件。

2.程序实现; 3.程序的调试与运行。 步骤: 1.问题分析 可以利用读写锁解决读者-写者问题 2.程序实现 1)读者: void *Reader(void *id) { RandomSleep(); pthread_rwlock_rdlock(&rwlock); ReaderNum++; ReadFile(*((int *)id)); ReaderNum--; pthread_rwlock_unlock(&rwlock); } 2)写者: void *Writer(void *id) { RandomSleep(); pthread_rwlock_wrlock(&rwlock); WriterNum++; WriteFile(*((int *)id)); WriterNum--;

pthread_rwlock_unlock(&rwlock); } 3)线程的创建: for(i=0; i

嵌入式Linux系统开发教程很完整的习题答案

嵌入式Linux系统开发教程很完整的习题答案

参考答案 第一章 一、填空题。 1、嵌入式系统主要融合了计算机软硬件技术、通信技术和微电子技术,它是将计算机直接嵌入到应用系统中,利用计算机的高速处理能力以实现某些特定的功能。 2、目前国内对嵌入式系统普遍认同的定义是:以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 3、嵌入式系统一般由嵌入式计算机和执行部件组成,其中嵌入式计算机主要由四个部分组成,它们分别是:硬件层、中间层、系统软件层以及应用软件层。 4、嵌入式处理器目前主要有ARM、MIPS、Power PC、68K等,其中arm处理器有三大特点:体积小、低功耗、的成本和高性能,16/32位双指令集,全球合作伙伴众多。 5、常见的嵌入式操作系统有:Linux、Vxworks、WinCE、Palm、uc/OS-II和eCOS。 6、嵌入式系统开发的一般流程主要包括系统需求分析、体系结构设计、软硬件及机械系统设计、系统集成、系统测试,最后得到最终产品。 二、选择题 1、嵌入式系统中硬件层主要包含了嵌入式系统重要的硬件设备:、存储器(SDRAM、ROM等)、设备I/O接口等。(A) A、嵌入式处理器 B、嵌入式控制器 C、单片机 D、集成芯片 2、20世纪90年代以后,随着系统应用对实时性要求的提高,系统软件规模不断上升,实时核逐渐发展为,并作为一种软件平台逐步成为目前国际嵌入式系统的主流。(D) A、分时多任务操作系统 B、多任务操作系统 C、实时操作系统 D、实时多任务操作系统 3、由于其高可靠性,在美国的火星表面登陆的火星探测器上也使用的嵌入式操作系统是。(B) A、Palm B、VxWorks C、Linux D、WinCE [在此处键入]

Linux操作系统实验实验报告

实验1:安装L i n u x系统 【实验目的和要求】:安装Linux系统,掌握操作系统的系统配置,建立应用环境的过程。 【实验内容】: 1、首先在windows系统中安装虚拟机。在网上找到VMwareWorksttionPro版本, 确定安装目录。一直下一步,不需要太多的说明。 2、 图为安装完成后的界面。 3、然后在阿里巴巴开源镜像网站下载centos系统镜像,然后虚拟机创建新的虚 拟机, 进行一些简单的虚拟机设置,设置了网络链接nat模式等等。 安装完成后的界面 实验2:Linux下c语言开发 【实验目的】:学会和掌握用c语言开发一个应用程序的全过程,包括,编译,调试等等。

【实验步骤】:首先在系统中查看是否已经安装有gcc,输入查看命令发现没有,于是需要安装gcc。在centos系统中可以使用比较简便的yum命令。在之前已经配置好了yum源。直接输入yuminstallgcc。回车自动安装程序和需要的依赖包。 因为虚拟机中和电脑很多地方切换使用不方便,所以安装了xshell软件。图为xshell中的截图。

安装完毕。然后使用vi或者vim编写 运行,在屏幕上打印出hello,world。 实验3:进程创建 【实验目的和要求】1.了解进程的概念及意义;2.了解子进程和父进程 3.掌握创建进程的方法。 【实验内容】1.子进程和父进程的创建; 2.编写附件中的程序实例 【实验步骤】一1、打开终端,输入命令,在文件中输入中的代码; 2、输入命令,回车后显示无错误; 3、输入命令:./1_fork运行程序。 二、1、打开终端,输入命令,在文件中输入中的代码; 2、输入命令,回车后显示无错误: 3、输入命令:./2_vfork运行程序。 从上面可以看到两次的运行结果不一样。我们知道write函数是不带缓存的。因为在fork之前调用write,所以其数据写到标准输出一次。但是,标准I/O库是带缓存的。如果标准输出连到终端设备,则它是行缓存的,否则它是全缓存的。当以交互方式运行该程序时,只得到printf输出的行一次,其原因是标准输出缓存由新行符刷新。但是当将标准输出重新定向到一个文件时,却得到printf输出行两次。其原因是,在fork之前调用了printf一次,当调用fork时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据 也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在exit 之前的第二个printf将其数据添加到现存的缓存中。当每个进程终止时,缓存中的内容被写到相应文件中。

嵌入式linux实验指导书

目录 实验一 linux常用指令练习 (3) 1、在线帮助指令 (3) 2、linux开关机及注销指令。 (3) 重启指令: (3) 1)、reboot命令 (3) 2)、init 6命令 (3) 关机指令: (3) 1)、halt命令 (3) 2)、poweroff命令 (4) 3)、init 0命令 (4) 4)、shutdown命令 (4) 注销指令: (4) 3、用户管理命令 (4) 1)、用户切换su命令 (4) 2)、添加用户命令adduser/useradd (5) 3)、删除用户及更改用户属性 (5) 4)、设置用户密码 (6) 5)、查看用户信息 (6) 4、文件目录操作指令 (7) 1)、改变当前工作目录命令(cd) (7) 2)、显示当前路径pwd (7) 3)、查看当前目录下的文件命令ls (7) 4)、新建目录指令mkdir (8) 5)、删除目录命令rmdir (8) 6)、新建文件命令touch (8) 7)、删除文件指令rm (8) 8)、文件和目录的复制命令cp (8) 9)、文件和目录的移动命令mv (9) 10)、更改文件或目录的使用权限chmod (9) 11)、查看文件的命令cat (9) 12)、文件链接命令ln (9) 13)、文件压缩解压命令 (10) 5、网络相关命令 (11) 6、磁盘管理命令 (11) 7、挂载文件命令mount (12) 8、其他系统命令 (12) 练习1: (13) 练习2: (15) 练习3: (16) 练习4: (21) 实验二 VI文本编辑器的使用 (24) 1、练习使用VI指令 (24) 2、利用VI编写一个hello.c文件 (24)

相关文档
最新文档