如何应用条件变量实现eCos字符设备驱动的阻塞读

(本文原创,转载请注明出处)

在应用字符接口驱动程序的时候,我们常常需要通过提供阻塞读的这样的接口让等待驱动回应的线程尽快的释放出CPU的资源给其他线程。

eCos在driver层次上提供了条件变量API以满足这个需要

cyg_drv_cond_XXX

同时要应用条件变量还必须创建一个mutex来配合条件变量的工作

cyg_drv_mutex_XXX

那么在具体的驱动程序中该如何实现它呢,下面以MINI2440的touch驱动的阻塞读来举例说明。

具体代码请下载emboslab的ecos代码

1、首先我们必须先创建条件变量和mutex

在ts_lookup中添加条件变量和mutex的初始化代码,ts_lookup会在其他应用程序打开/dev/ts的时候调用


cyg_drv_mutex_init(&res_lock);
cyg_drv_cond_init(&res_wait,&res_lock);

2、在设备读函数中加入条件变量等待函数

static Cyg_ErrNo 
ts_read(cyg_io_handle_t handle, 
        void *buffer, 
        cyg_uint32 *len)
{
	cyg_mutex_lock(&res_lock);
	cyg_cond_wait(&res_wait);
	/*在这里加入你读取数据的代码*/
	cyg_mutex_unlock(&res_lock);
	return ENOERR;
}

3、在中断的DSR中触发条件变量

static void
cyg_mini2440_ts_dsr(cyg_addrword_t param)
{
	cyg_cond_signal(&res_wait);
}

这样一来,当Touch的中断到来的时候touch的中断函数会向驱动读函数发送信号,使得现在因为读不到touch数据而阻塞的线程得以继续运行。

4、通过tests来测试

编译好ecos以后,我们可以进入ecos build的目录去make tests,这样在install/tests/devs/touch/arm/mini2440/current/tests/ 中就会生成touch的测试程序。

通过重新配置mini2440的touch驱动的block read选项,我们可以清楚地观察到两种方式的效果。


你可能感兴趣的:(工作,api,测试,buffer,Build,Signal)