微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM的嵌入式Linux移植体验之应用实例

ARM的嵌入式Linux移植体验之应用实例

时间:05-11 来源:互联网 点击:

iable)。而在头文件semaphore.h中定义的信号量则完成了互斥体和条件变量的封装,按照多线程程序设计中访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。下面的生产者/消费者问题说明了Linux线程的控制和通信:

#include

#include

#defineBUFFER_SIZE16

structprodcons

{

intbuffer[BUFFER_SIZE];

pthread_mutex_tlock;

intreadpos,writepos;

pthread_cond_tnotempty;

pthread_cond_tnotfull;

};

/*初始化缓冲区结构*/

voidinit(structprodcons*b)

{

pthread_mutex_init(b->lock,NULL);

pthread_cond_init(b->notempty,NULL);

pthread_cond_init(b->notfull,NULL);

b->readpos=0;

b->writepos=0;

}

/*将产品放入缓冲区,这里是存入一个整数*/

voidput(structprodcons*b,intdata)

{

pthread_mutex_lock(b->lock);

/*等待缓冲区未满*/

if((b->writepos+1)%BUFFER_SIZE==b->readpos)

{

pthread_cond_wait(b->notfull,b->lock);

}

/*写数据,并移动指针*/

b->buffer[b->writepos]=data;

b->writepos++;

if(b->writepos>=BUFFER_SIZE)

b->writepos=0;

/*设置缓冲区非空的条件变量*/

pthread_cond_signal(b->notempty);

pthread_mutex_unlock(b->lock);

}

/*从缓冲区中取出整数*/

intget(structprodcons*b)

{

intdata;

pthread_mutex_lock(b->lock);

/*等待缓冲区非空*/

if(b->writepos==b->readpos)

{

pthread_cond_wait(b->notempty,b->lock);

}

/*读数据,移动读指针*/

data=b->buffer[b->readpos];

b->readpos++;

if(b->readpos>=BUFFER_SIZE)

b->readpos=0;

/*设置缓冲区未满的条件变量*/

pthread_cond_signal(b->notfull);

pthread_mutex_unlock(b->lock);

returndata;

}

/*测试:生产者线程将1到10000的整数送入缓冲区,消费者线

程从缓冲区中获取整数,两者都打印信息*/

#defineOVER(-1)

structprodconsbuffer;

void*producer(void*data)

{

intn;

for(n=0;n10000;n++)

{

printf(%d--->n,n);

put(buffer,n);

}put(buffer,OVER);

returnNULL;

}

void*consumer(void*data)

{

intd;

while(1)

{

d=get(buffer);

if(d==OVER)

break;

printf(--->%dn,d);

}

returnNULL;

}

intmain(void)

{

pthread_tth_a,th_b;

void*retval;

init(buffer);

/*创建生产者和消费者线程*/

pthread_create(th_a,NULL,producer,0);

pthread_create(th_b,NULL,consumer,0);

/*等待两个线程结束*/

pthread_join(th_a,retval);

pthread_join(th_b,retval);

return0;

}

4.小结

本章主要给出了Linux平台下文件、进程控制与通信、线程控制与通信的编程实例。至此,一个完整的,涉及硬件原理、Bootloader、操作系统及文件系统移植、驱动程序开发及应用程序编写的嵌入式Linux系列讲解就全部结束了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top