在应用字符接口驱动程序的时候,我们常常需要通过提供阻塞读的这样的接口让等待驱动回应的线程尽快的释放出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); }
4、通过tests来测试
编译好ecos以后,我们可以进入ecos build的目录去make tests,这样在install/tests/devs/touch/arm/mini2440/current/tests/ 中就会生成touch的测试程序。
通过重新配置mini2440的touch驱动的block read选项,我们可以清楚地观察到两种方式的效果。