2023年8月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〈stdio。h>

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:%dn”,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,READONLY

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 〈stdio.h>

int find_maxnum(int a,int b,int c) {

int x;

__asm

MOV r0,a

MOV r1,b

MOV r2,c

CMP r0,r1

BLE lbl_a //相等跳转

CMP r0,r2

MOVGT x,r0

MOVLE x,r2

//MOV r3,x

B lbl_b

lbl_a:

CMP r1,r2

MOVGT x,r1

MOVLE x,r2

//MOV r3,x

lbl_b:

return x;

int for_r3(int t)

{

//int t;

__asm

{

MOV r3,t

}

return 0;

}

int main()

int a;

a = find_maxnum(130,50,70);

for_r3(a);

printf("max:%drn",a);

return 0;

}

3、编程实现将从地址source开始的30个字节数据复制到地址为dest的地方。

代码:

NUM EQU 30

AREA Init, CODE, READONLY

CODE32

ENTRY

START

LDR R0, =SOURCE

LDR R1, =DEST

MOV R2, #NUM

MOV SP, #0X400

BLKCOPY

MOV R3, R2, LSR #3

BEQ COPYWORDS

STMFD SP!, {R4-R11}

OCTCOPY

LDMIA R0!, {R4-R11}

STMIA R1!, {R4—R11}

SUBS R3, R3, #1

BNE OCTCOPY

LDMFD SP!, {R4—R11}

COPYWORDS

ANDS R2,R2, #7

BEQ STOP

WORDCOPY

LDR R3, [R0], #4

STR R3, [R1], #4

SUBS R2, R2, #1

BNE WORDCOPY

STOP

B STOP

LTORG

SOURCE DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6

DEST DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

END

4、用汇编语言设计实现10!。

代码:使用纯汇编语言

AREA Fctrl,CODE,READONLY

ENTRY

CODE32

START MOV R8 , #10

MOV R9 , #0

SUB R0,R8,#1

Loop

MOV R1 , R9

UMULL R8 , R9 , R0 , R8

MLA R9 , R1 , R0 , R9

SUBS R0 , R0 , #1

BNE Loop

Stop B Stop

END

5、实现字符串的逆序复制TEXT1="HELLO"=〉 TEXT2="OLLEH”。

代码:使用纯汇编语言

AREA invstring, CODE, READONLY

ENTRY

ATART

ADR R1, TEXT1

ADR R2, TEXT2

MOV R3, #0

LOOP

LDRB R0, [R1], #1

ADD R3, R3,#1

CMP R0, #0

BNE LOOP

SUB R1, R1, #2

LOOP1

LDRB R0, [R1], #—1

STRB R0, [R2], #1

SUB R3, R3, #1

CMP R3, #1

BNE LOOP1

MOV R5, #&55

NOP

TEXT1 = "HELLO",0

ALIGN

TEXT2 = "OELLH”

END

6、用调用子程序的方法实现1!+2!+3!+…….+10!

代码:

asmp.s

AREA JC, CODE, READONLY

EXPORT JCP

ENTRY JCP ADD R3, R0, #1

MOV R2, #1

MOV R1, #1

LOOP MUL R0, R1, R2

MOV R1, R0

ADD R2, R2, #1

CMP R2, R3

BNE LOOP

NOP

NOP

MOV PC, LR

END

PROGC.c

#include 〈stdio.h〉

Extern int JCP(int N)

int main() {

int res=0;

int m=10;

int i;

for (i=1;i<=m;i++)

res=res+JCP(i);

printf(“The result =%dn”,res);

return 0; }

四、实验小结

实验二 嵌入式Linux交叉开发环境的建立

一、实验目的

1、掌握嵌入式Linux交叉开发环境的建立方法

2、学习和掌握Linux常用命令

3、学习和掌握vi编辑器的使用

二、实验内容

1、搭建嵌入式Linux交叉开发环境

2、熟悉Linux的常用命令

3、熟悉vi编辑器的常用命令

三、实验原理

Linux系统是UNIX系统的分支,是UNIX的微机版。Linux具有异常丰富的驱动程序资源,支持各种主流的硬件设备与技术.Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、进程间通信、对称所处理器、多用户支持等。

Vi编辑器是所有UNIX和Linux下的标准编辑器。它包含3种工作模式。

嵌入式系统是专用的计算机系统,它对系统的功能、可靠性、成本、体积、功耗等有严格的要求。大部分嵌入式系统没有大容量存储设备,一般不能安装大型开发软件,系统的开发需要采用交叉开发模式。

四、实验过程与结果

实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。

打开电脑上VMWare软件,在Windows系统下启动虚拟机里的Linux系统。接着需要

1. 宿主机的环境搭建

下载并运行VMWare,根据向导创建一台新虚拟机并选择Linux作为客户操作系统,再根据向导安装RedHat Linux 9。0。

2. 虚拟机中启动Linux操作系统

使用root登陆,用户名为root,密码为123456。之后对共享文件设置进行调整:打开settings界面,打开shared folders功能,同时将路径设置到有课前下载的软件的目录下。

3。 开发工具软件的安装

(1)安装gcc

打开Linux后,打开终端窗口,在共享的目录下找到并运行,命令如下:

ls

。 / install。sh

安装程序将自动建立/arm2410s目录,并将所有的开发软件包安装到/arm2410s 目录下,同时自动配置编译环境,建立合适的符号链接。安装完成后在目录/opt/host/armv4l/bin/下应该能看到主编译器. (2)配置PATH路径

vi 。e

将里面PATH变量改为PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;

存盘后执行

source .bash_profile

以后armv4l—unknown—linux-gcc将被自动搜索到

4. 宿主机上的开发环境配置

(1)配置IP地址 (2)关闭防火墙

(3)配置NFS.

单击“Red”菜单→“系统设置”→“服务器设置”→“服务”,在“服务配置”窗口中勾选nfs,单击“开始"

(4)NFS设置

单击“Red”菜单→“系统设置”→“服务器设置”→“NFS服务器”,打开“NFS服务器配置”窗口,设置NFS共享。

然后在NFS服务器中增加主机IP地址的链接许可和目录。完成配置。

5. 目标机的信息输出

Windows系统下,“开始”→“所有程序”→“附件”→“通讯”→“超级终端”,新建一个通信终端。区号、电话号码随意输入。设置每秒位数为“115200",数据位为“8”,无奇偶校验,停止位为“1”,无数据流控制。单击“确定”。

6. 程序的运行

打开超级终端,启动Linux,屏幕显示:

[/mnt/yaffs]

在超级终端上执行挂载命令:

[/mnt] mount –t nfs 192。168.0.121:/arm2410s /mnt/nfs

挂载成功后可执行程序.

五、实验小结

实验三 嵌入式Linux环境下的程序设计

一、实验目的

1、掌握嵌入式Linux环境下的程序设计方法

2、学会编写Makefile文件

二、实验内容

1、熟悉嵌入式教学实验箱的使用

2、编写C程序和Makefile文件

3、编译程序产生可执行程序

4、完成主机的挂载和程序的执行

三、实验原理

在嵌入式Linux环境下的程序设计方法有一下几个步骤:

1. 编写源程序

2. 编写Makefile文件

3. 编译程序

4. 运行和调试程序

5. 将生产的可执行文件加入文件系统。

前三个步骤在宿主机上完成,后面的步骤在目标机上完成。

四、实验过程与关键代码分析

1. 建立工作目录

mkdir hello

cd hello

2. 编写源程序

用vi编辑器编辑Hello。c文件

vi Hello。c

在Vi中输入源程序如下:

#include 〈stdio.h>

main()

printf(“hello B14011221 n”); //学号

3.编写Makefile文件

vi Makefile

在vi中编辑Makefile文件如下:

CC= armv4l—unknown—linux-gcc

EXEC = hello

OBJS = hello.o

CFLAGS +=

LDFLAGS+= -static

all: $(EXEC) $(EXEC): (OBJS)

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

clean:

—rm –f $(EXEC) *。elf *。gdb *。o

4.编译程序

在hello目录下运行“make"来编译程序.

make clean

make

编译成功后,生成可执行文件Hello.o。

5。下载调试

在宿主机上启动nfs服务,并将/arms2410s设置为共享目录。接下来启动超级终端,建立通讯,挂载。

挂载命令:

执行目录下的hello程序,显示如图:

五、实验小结 实验四 多线程程序设计

一、实验目的

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

2、学习Linux多任务管理程序的开发

3、学习pthread 常用库函数的使用

二、实验内容

1、编写多线程程序和Makefile文件

2、编译程序产生可执行程序

3、完成主机的挂载和程序的执行

三、实验原理

(1) pthread_create:创建线程函数

头文件:#include 〈 pthread.h 〉

函数原型:int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);

获得父进程 ID:pthread_self

头文件:#include

函数原型:pthread_t pthread_self(void);

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

头文件:#include

函数原型:int pthread_equal(pthread_t thread1,pthread_t thread2);

(2)pthread_join:使一个线程等待另一个线程结束

头文件 : #include 〈pthread.h〉

函数定义: int pthread_join(pthread_t thread, void **retval);

描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

参数 :thread: 线程标识符,即线程ID,标识唯一线程.retval: 用户定义的指针,用来存储被等待线程的返回值。

返回值 : 0代表成功。 失败,返回的则是错误号.

(3)线程创建函数: pthread_t:线程句柄

类型定义:

typedef unsigned long int pthread_t;

用途:pthread_t用于声明线程ID。

sizeof(pthread_t) =8

pthread_t,在使用printf打印时,应转换为u类型。

四、实验过程与关键代码分析

实验代码: #include

#include 〈stdlib。h>

#include 〈time。h>

#include "pthread。h"

/*-Thread1—-—----——————-————-—-—-————-————-———-*/

void thread1()

{

int i=0;

while(1)

{ printf(”thread1 :%dn",i);

if (i〉3)

pthread_exit(0);

i++;

sleep(1);

}

/*--Thread2---—--———-—-——-————-----—--——*/

void thread2()

{ int i=0;

while(1)

{ printf(”thread2 :%dn",i);

if (i〉5)

pthread_exit(0);

i++;

sleep(1);

}

/*—-—----——-——-———---———--——--————-——---—-——————--———————-*/

int main(void)

pthread_t t1, t2;

pthread_create(&t1, NULL, (void*)thread1, NULL);

pthread_create(&t2, NULL, (void*)thread2, NULL);

pthread_join(t1, NULL);

pthread_join(t2, NULL);

return 0;

实验结果:

实验问题:一开始编译的时候出错,提示pthread_create未定义。网上查询原因以后得知:pthread库不是linux系统默认的库,连接时需要使用静态libpthread。a,因此在编译时要加 –lpthread参数,问题解决。

五、实验小结

2023年8月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〈stdio。h>

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:%dn”,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,READONLY

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 〈stdio.h>

int find_maxnum(int a,int b,int c) {

int x;

__asm

MOV r0,a

MOV r1,b

MOV r2,c

CMP r0,r1

BLE lbl_a //相等跳转

CMP r0,r2

MOVGT x,r0

MOVLE x,r2

//MOV r3,x

B lbl_b

lbl_a:

CMP r1,r2

MOVGT x,r1

MOVLE x,r2

//MOV r3,x

lbl_b:

return x;

int for_r3(int t)

{

//int t;

__asm

{

MOV r3,t

}

return 0;

}

int main()

int a;

a = find_maxnum(130,50,70);

for_r3(a);

printf("max:%drn",a);

return 0;

}

3、编程实现将从地址source开始的30个字节数据复制到地址为dest的地方。

代码:

NUM EQU 30

AREA Init, CODE, READONLY

CODE32

ENTRY

START

LDR R0, =SOURCE

LDR R1, =DEST

MOV R2, #NUM

MOV SP, #0X400

BLKCOPY

MOV R3, R2, LSR #3

BEQ COPYWORDS

STMFD SP!, {R4-R11}

OCTCOPY

LDMIA R0!, {R4-R11}

STMIA R1!, {R4—R11}

SUBS R3, R3, #1

BNE OCTCOPY

LDMFD SP!, {R4—R11}

COPYWORDS

ANDS R2,R2, #7

BEQ STOP

WORDCOPY

LDR R3, [R0], #4

STR R3, [R1], #4

SUBS R2, R2, #1

BNE WORDCOPY

STOP

B STOP

LTORG

SOURCE DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6

DEST DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

END

4、用汇编语言设计实现10!。

代码:使用纯汇编语言

AREA Fctrl,CODE,READONLY

ENTRY

CODE32

START MOV R8 , #10

MOV R9 , #0

SUB R0,R8,#1

Loop

MOV R1 , R9

UMULL R8 , R9 , R0 , R8

MLA R9 , R1 , R0 , R9

SUBS R0 , R0 , #1

BNE Loop

Stop B Stop

END

5、实现字符串的逆序复制TEXT1="HELLO"=〉 TEXT2="OLLEH”。

代码:使用纯汇编语言

AREA invstring, CODE, READONLY

ENTRY

ATART

ADR R1, TEXT1

ADR R2, TEXT2

MOV R3, #0

LOOP

LDRB R0, [R1], #1

ADD R3, R3,#1

CMP R0, #0

BNE LOOP

SUB R1, R1, #2

LOOP1

LDRB R0, [R1], #—1

STRB R0, [R2], #1

SUB R3, R3, #1

CMP R3, #1

BNE LOOP1

MOV R5, #&55

NOP

TEXT1 = "HELLO",0

ALIGN

TEXT2 = "OELLH”

END

6、用调用子程序的方法实现1!+2!+3!+…….+10!

代码:

asmp.s

AREA JC, CODE, READONLY

EXPORT JCP

ENTRY JCP ADD R3, R0, #1

MOV R2, #1

MOV R1, #1

LOOP MUL R0, R1, R2

MOV R1, R0

ADD R2, R2, #1

CMP R2, R3

BNE LOOP

NOP

NOP

MOV PC, LR

END

PROGC.c

#include 〈stdio.h〉

Extern int JCP(int N)

int main() {

int res=0;

int m=10;

int i;

for (i=1;i<=m;i++)

res=res+JCP(i);

printf(“The result =%dn”,res);

return 0; }

四、实验小结

实验二 嵌入式Linux交叉开发环境的建立

一、实验目的

1、掌握嵌入式Linux交叉开发环境的建立方法

2、学习和掌握Linux常用命令

3、学习和掌握vi编辑器的使用

二、实验内容

1、搭建嵌入式Linux交叉开发环境

2、熟悉Linux的常用命令

3、熟悉vi编辑器的常用命令

三、实验原理

Linux系统是UNIX系统的分支,是UNIX的微机版。Linux具有异常丰富的驱动程序资源,支持各种主流的硬件设备与技术.Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、进程间通信、对称所处理器、多用户支持等。

Vi编辑器是所有UNIX和Linux下的标准编辑器。它包含3种工作模式。

嵌入式系统是专用的计算机系统,它对系统的功能、可靠性、成本、体积、功耗等有严格的要求。大部分嵌入式系统没有大容量存储设备,一般不能安装大型开发软件,系统的开发需要采用交叉开发模式。

四、实验过程与结果

实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。

打开电脑上VMWare软件,在Windows系统下启动虚拟机里的Linux系统。接着需要

1. 宿主机的环境搭建

下载并运行VMWare,根据向导创建一台新虚拟机并选择Linux作为客户操作系统,再根据向导安装RedHat Linux 9。0。

2. 虚拟机中启动Linux操作系统

使用root登陆,用户名为root,密码为123456。之后对共享文件设置进行调整:打开settings界面,打开shared folders功能,同时将路径设置到有课前下载的软件的目录下。

3。 开发工具软件的安装

(1)安装gcc

打开Linux后,打开终端窗口,在共享的目录下找到并运行,命令如下:

ls

。 / install。sh

安装程序将自动建立/arm2410s目录,并将所有的开发软件包安装到/arm2410s 目录下,同时自动配置编译环境,建立合适的符号链接。安装完成后在目录/opt/host/armv4l/bin/下应该能看到主编译器. (2)配置PATH路径

vi 。e

将里面PATH变量改为PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;

存盘后执行

source .bash_profile

以后armv4l—unknown—linux-gcc将被自动搜索到

4. 宿主机上的开发环境配置

(1)配置IP地址 (2)关闭防火墙

(3)配置NFS.

单击“Red”菜单→“系统设置”→“服务器设置”→“服务”,在“服务配置”窗口中勾选nfs,单击“开始"

(4)NFS设置

单击“Red”菜单→“系统设置”→“服务器设置”→“NFS服务器”,打开“NFS服务器配置”窗口,设置NFS共享。

然后在NFS服务器中增加主机IP地址的链接许可和目录。完成配置。

5. 目标机的信息输出

Windows系统下,“开始”→“所有程序”→“附件”→“通讯”→“超级终端”,新建一个通信终端。区号、电话号码随意输入。设置每秒位数为“115200",数据位为“8”,无奇偶校验,停止位为“1”,无数据流控制。单击“确定”。

6. 程序的运行

打开超级终端,启动Linux,屏幕显示:

[/mnt/yaffs]

在超级终端上执行挂载命令:

[/mnt] mount –t nfs 192。168.0.121:/arm2410s /mnt/nfs

挂载成功后可执行程序.

五、实验小结

实验三 嵌入式Linux环境下的程序设计

一、实验目的

1、掌握嵌入式Linux环境下的程序设计方法

2、学会编写Makefile文件

二、实验内容

1、熟悉嵌入式教学实验箱的使用

2、编写C程序和Makefile文件

3、编译程序产生可执行程序

4、完成主机的挂载和程序的执行

三、实验原理

在嵌入式Linux环境下的程序设计方法有一下几个步骤:

1. 编写源程序

2. 编写Makefile文件

3. 编译程序

4. 运行和调试程序

5. 将生产的可执行文件加入文件系统。

前三个步骤在宿主机上完成,后面的步骤在目标机上完成。

四、实验过程与关键代码分析

1. 建立工作目录

mkdir hello

cd hello

2. 编写源程序

用vi编辑器编辑Hello。c文件

vi Hello。c

在Vi中输入源程序如下:

#include 〈stdio.h>

main()

printf(“hello B14011221 n”); //学号

3.编写Makefile文件

vi Makefile

在vi中编辑Makefile文件如下:

CC= armv4l—unknown—linux-gcc

EXEC = hello

OBJS = hello.o

CFLAGS +=

LDFLAGS+= -static

all: $(EXEC) $(EXEC): (OBJS)

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

clean:

—rm –f $(EXEC) *。elf *。gdb *。o

4.编译程序

在hello目录下运行“make"来编译程序.

make clean

make

编译成功后,生成可执行文件Hello.o。

5。下载调试

在宿主机上启动nfs服务,并将/arms2410s设置为共享目录。接下来启动超级终端,建立通讯,挂载。

挂载命令:

执行目录下的hello程序,显示如图:

五、实验小结 实验四 多线程程序设计

一、实验目的

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

2、学习Linux多任务管理程序的开发

3、学习pthread 常用库函数的使用

二、实验内容

1、编写多线程程序和Makefile文件

2、编译程序产生可执行程序

3、完成主机的挂载和程序的执行

三、实验原理

(1) pthread_create:创建线程函数

头文件:#include 〈 pthread.h 〉

函数原型:int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);

获得父进程 ID:pthread_self

头文件:#include

函数原型:pthread_t pthread_self(void);

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

头文件:#include

函数原型:int pthread_equal(pthread_t thread1,pthread_t thread2);

(2)pthread_join:使一个线程等待另一个线程结束

头文件 : #include 〈pthread.h〉

函数定义: int pthread_join(pthread_t thread, void **retval);

描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

参数 :thread: 线程标识符,即线程ID,标识唯一线程.retval: 用户定义的指针,用来存储被等待线程的返回值。

返回值 : 0代表成功。 失败,返回的则是错误号.

(3)线程创建函数: pthread_t:线程句柄

类型定义:

typedef unsigned long int pthread_t;

用途:pthread_t用于声明线程ID。

sizeof(pthread_t) =8

pthread_t,在使用printf打印时,应转换为u类型。

四、实验过程与关键代码分析

实验代码: #include

#include 〈stdlib。h>

#include 〈time。h>

#include "pthread。h"

/*-Thread1—-—----——————-————-—-—-————-————-———-*/

void thread1()

{

int i=0;

while(1)

{ printf(”thread1 :%dn",i);

if (i〉3)

pthread_exit(0);

i++;

sleep(1);

}

/*--Thread2---—--———-—-——-————-----—--——*/

void thread2()

{ int i=0;

while(1)

{ printf(”thread2 :%dn",i);

if (i〉5)

pthread_exit(0);

i++;

sleep(1);

}

/*—-—----——-——-———---———--——--————-——---—-——————--———————-*/

int main(void)

pthread_t t1, t2;

pthread_create(&t1, NULL, (void*)thread1, NULL);

pthread_create(&t2, NULL, (void*)thread2, NULL);

pthread_join(t1, NULL);

pthread_join(t2, NULL);

return 0;

实验结果:

实验问题:一开始编译的时候出错,提示pthread_create未定义。网上查询原因以后得知:pthread库不是linux系统默认的库,连接时需要使用静态libpthread。a,因此在编译时要加 –lpthread参数,问题解决。

五、实验小结