ARM的嵌入式Linux移植体验之应用实例
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系列讲解就全部结束了。
应用 实例 体验 移植 嵌入式 Linux ARM 相关文章:
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- SHARC引领第四代通用DSP高端应用潮流(09-27)
- 在应用可编程测控网络设计(03-15)
- 基于dsPIC33F系列单片机的应用程序升级方法(04-03)
- 采用混合时钟模式提高Linux时钟精度的方法(05-10)
- MSP430低功耗原理及其在海温测量中的应用(06-06)