• poll机制
    • select函数和poll函数的内部机制是一样的,详细参考:第二期驱动大全poll机制
    • image.png
    • select函数可以监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回
    • readfds 被监测是否可读的文件
    • writefds 被监测是否可写的文件
    • exceptfds 被监测是否有异常的文件
    • timeout 超时时间(指定要监测多久)
    • image.png
    • nfds 最大文件句柄+1
    1. /* 修改输入操作类 */
    2. typedef struct InputOpr{
    3. char *name;
    4. int iFd; /* 添加文件描述符成员 */
    5. int (*DeviceInit)(void);
    6. int (*DeviceExit)(void);
    7. int (*GetInputEvent)(PT_InputEvent ptInputEvent); /* 获取输入事件 */
    8. struct InputOpr *ptNext;
    9. }T_InputOpr, *PT_InputOpr;
    • 在xxxDevInit函数中初始化iFd成员
      • image.png
    • 修改GetInputEvent()函数,通过select函数来监测stdin、touchscreen,有数据之后再调用stdin、touchscreen里相应的GetInputEvent()函数 ```c static fd_set g_tRfds; static int g_iMaxFd = -1; int AllInputDevicesInit(void) { //…. FD_ZERO(&g_tRfds); if(0 == pTemp->DeviceInit())

      1. FD_SER(pTemp->iFd, &g_tRfds); /* 设置想要监测的文件 */
      2. if(g_iMaxFd < pTemp->iFd)
      3. g_iMaxFd = pTemp->iFd;

      g_iMaxFd++; / 最大文件句柄+1 / //… }

    int GetInputEvent(PT_InputEvent ptInputEvent) { /* use select function monitoring stdin/touchscreen,

    1. * when have data, call they GetInputEvent function or get real event
    2. */
    3. PT_InputOpr ptTemp = g_ptInputOprHead;
    4. int iRet;
    5. fd_set tFds;
    6. tFds = g_tFds;
    7. iRet = select(g_iMaxFd, &tFds, NULL, NULL, NULL); /* 只监测可读的文件,不理会可写、异常、超时 */
    8. if(iRet > 0){
    9. while(ptTemp)
    10. {
    11. if(FD_ISSET(ptTemp->iFd, &tFds)){ //tFds
    12. if(0 == ptTemp->GetInputEvent(ptInputEvent))
    13. return 0;
    14. }
    15. ptTemp = ptTemp->ptNext;
    16. }
    17. }

    } ```

    • UNIX环境高级编程 I/O多路转接
    • ls /dev/event* 查看是否有touchscreen设备节点,没有需要insmod xxx_ts.ko加载驱动模块
    • 使用select机制可以极大的减少CPU占用率,适用于很多简单的场合