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参数,问题解决。 五、实验小结
发布评论