编译makefile生成test可执行文件
#bulid for stp_test
#CROSS =arm-hisiv300-linux- #HI3536平台编译器
CROSS =arm-linux-gnueabihf- #树莓派的编译器
CC = $(CROSS)g++
#C语言编译程序。默认命令是“cc”,即“g++”
LD = $(CROSS)ld
#LD链接器的名字,缺省值是ld
AR = $(CROSS)ar
#AR函数库打开包程序。默认命令是“ar”
CFLAGS += -g -Wall -O2 -fopenmp -mfpu=neon -ldl
#-g 在可执行程序中包含标准调试信息
#-O0 O1 O2 O3 OS ,不同的优化程度
#-w 关闭所有告警
#-Wall 允许发出Gcc提供的所有有用的报警信息
#-werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
#-fopenmp
#-mfpu=neon 使用NEON技术
#-ldl 链接dl库
HOME_DIR = $(PWD)
SRC_DIR := $(HOME_DIR)
INCLUDE_DIR := $(HOME_DIR)/include
AFLAGS += -arv
#编译汇编语言源文件de选项
CFLAGS += -I$(SRC_DIR)
CFLAGS += -I$(INCLUDE_DIR)
CFLAGS += -I$(INCLUDE_DIR)/api
CFLAGS += -I$(INCLUDE_DIR)/inner
CFLAGS += -I$(INCLUDE_DIR)/mkp
#-I 在头文件的搜索路径列表中添加dir目录
LIBS := $(HOME_DIR)/lib/libmed.a \
$(HOME_DIR)/lib/libmpi.a \
$(HOME_DIR)/lib/libhdmi.a \
$(HOME_DIR)/lib/libdnvqe.a \
$(HOME_DIR)/lib/libive.a \
$(HOME_DIR)/lib/libjpeg.a \
$(HOME_DIR)/lib/libjpeg6b.a \
$(HOME_DIR)/lib/libtde.a \
$(HOME_DIR)/lib/libupvqe.a \
$(HOME_DIR)/lib/libVoiceEngine.a \
$(HOME_DIR)/lib/libpciv.a \
$(HOME_DIR)/lib/alg/libgsfacedt.a \
$(HOME_DIR)/lib/alg/libopencv_highgui.a \
$(HOME_DIR)/lib/alg/libopencv_imgproc.a \
$(HOME_DIR)/lib/alg/libopencv_video.a \
$(HOME_DIR)/lib/alg/libopencv_core.a \
$(HOME_DIR)/lib/alg/liblibpng.a \
$(HOME_DIR)/lib/alg/liblibjpeg.a \
$(HOME_DIR)/lib/alg/libzlib.a
#.a 静态库 .so 动态库
mSRCS = $(SRC_DIR)/test.c
#源文件为test.c
OBJS = $(patsubst %.c, %.o, $(mSRCS))
#OBJS = test.o
TARGET := $(PWD)/test
#目标文件 TARGET = test
#hs-build: $(TARGET)
$(TARGET) :$(OBJS)
$(CC) $(CFLAGS) -o $@ $(mSRCS) -lpthread -lm -ldl -Bstatic $(LIBS) #-lz
# $@ 表示当前的目标文件,即TARGET = test
clean:
rm -f $(OBJS)
rm -f $(TARGET)
编译所用的test.c源码
#include "VideoAnalyse.h"
#include
#include
#include
#include
#include
#include
void test(void)
{
struct timeval start,end; //定义两个时间变量用来表示开始和结束
int j=500000000;
gettimeofday(&start,NULL); //获得当前的时间,并把它存放到start中
/*
while (j--)
{
int a = 0;
int i;
for(i=0;i<500000000;i++)
{
a = a +i;
}
for(i=0;i<500000000;i++)
{
a = a +i;
}
//printf("%d: a = %d\n", a);
}
*/
printf("numthread=%d \n",omp_get_thread_num());
gettimeofday(&end,NULL); //获得当前的时间,并把它存放到end中
printf("num_procs=%d thread_num=%d runtime=%ds:%dus\n",omp_get_num_procs(),omp_get_thread_num()
,end.tv_sec -start.tv_sec, end.tv_usec - start.tv_usec);
}
void *thfun_1(void *arg)
{
int i;
printf("new thread 1 start!\n");
for(;;)
{
for(i=0;i<10000000;i++);
for(i=0;i<10000000;i++);
for(i=0;i<10000000;i++);
}
printf("new thread 1 end!\n");
return ((void *)0);
}
void *thfun_2(void *arg)
{
int i;
printf("new thread 2 start!\n");
for(;;)
{
for(i=0;i<10000000;i++);
for(i=0;i<10000000;i++);
for(i=0;i<10000000;i++);
}
printf("new thread 2 end!\n");
return ((void *)0);
}
void *thfun_3(void *arg)
{
int i;
printf("new thread 3 start!\n");
for(;;)
{
for(i=0;i<10000000;i++);
}
printf("new thread 3 end!\n");
return ((void *)0);
}
void *thfun_4(void *arg)
{
int i;
printf("new thread 4 start!\n");
for(;;)
{
for(i=0;i<10000000;i++);
}
printf("new thread 4 end!\n");
return ((void *)0);
}
int main(int argc, char *argv[])
{
int j,ret;
pthread_t pthid;
struct timeval start,end;
#if 1
/*创建四个线程,成功返回0,出错返回错误码
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。*/
ret=pthread_create(&pthid,NULL,thfun_1,(void *)"testTh1");
if(ret!=0)
{
perror("can'tcreat thread 1 ");
exit(EXIT_FAILURE);
}
ret=pthread_create(&pthid,NULL,thfun_2,(void *)"testTh2");
if(ret!=0)
{
perror("can'tcreat thread 2 ");
exit(EXIT_FAILURE);
}
ret=pthread_create(&pthid,NULL,thfun_3,(void *)"testTh3");
if(ret!=0)
{
perror("can'tcreat thread 3 ");
exit(EXIT_FAILURE);
}
ret=pthread_create(&pthid,NULL,thfun_4,(void *)"testTh4");
if(ret!=0)
{
perror("can'tcreat thread 4");
exit(EXIT_FAILURE);
}
#endif
while(1)
{
#pragma omp parallel sections
{
#pragma omp section
printf("section 1 ThreadId = %d\n", omp_get_thread_num());
/*
#pragma omp section
for(j=0;j<3;j++)
{
test();
}
*/
}
/*
gettimeofday(&start,NULL);
#pragma omp parallel for
for(j=0;j<8;j++)
{
test();
}
gettimeofday(&end,NULL);
printf("Total time runtime=%ds:%dus \n",end.tv_sec -start.tv_sec, end.tv_usec - start.tv_usec);
*/
}
exit(0);
return 0;
}