使用cypress平台上时,调试A+G sensor时,通过HID协议在Android上枚举出hid的设备文件,因为A+G是一体的,所以cypress将A+G的数据通过一个HID通道数据发送,android层主动发送取数据的命令,cpress 这面将数据发送到HID设备文件中,但是遇到有时候A+G的数据错乱,但是有时候又不会。

   
  1. while (true) {
  2.                while (eventQue.size() > 0 && eventNum <= count) {
  3.                        data[eventNum] = eventQue.front();
  4.                        eventQue.pop();
  5.                        eventNum++;
  6.                }
  7.                if (eventNum > 0)
  8.                        return eventNum;
  9.                num = poll(mModule.pollfds, mModule.count+1, -1);
  10.                if (num <= 0) {
  11.                    err = errno;
  12.                    LOGE("HidSensors: sensor hal poll error: %d %s", err, strerror(err));
  13.                    return -err;
  14.                }
  15.                usleep(50 * 1000);
  16.                for (int i = 0; i < mModule.count+1; i++) {
  17.                    if (mModule.pollfds[i].revents & POLLIN) {
  18.                        if(i == 0){
  19.                            num = read(mModule.pollfds[0].fd,pipedata,sizeof(pipedata));
  20.                            if (num <= 0) {
  21.                                err = errno;
  22.                                LOGE("HidSensors: sensor hal read error: %d %s", err, strerror(err));
  23.                                return -err;
  24.                            }
  25.                            mModule.pollfds[pipedata[0]].fd = pipedata[2];
  26.                            LOGI("HidSensor: sensor hal fd = %d", pipedata[2]);
  27.                        }
  28.                        else
  29.                            mModule.sensors[i-1]->getData(eventQue);
  30.                    }
  31.                    else if (mModule.pollfds[i].revents != 0){
  32.                        mModule.pollfds[i].fd = -1;
  33.                        LOGE("HidSensors: sensor hal poll event error: %d fd: %d type: %d", mModule.pollfds[i].revents, mModule.pollfds[i].fd, mModule.sensors[i-1]->getDevice().getType());
  34.                    }
  35.                    mModule.pollfds[i].revents = 0;
  36.                   }
  37.        }
  38.        return -1;
mModule 中存放主要的数据结构,循环中会调用
   
  1. mModule.sensors[i-1]->getData(eventQue);

因为数据错乱的原因:我们分析有以下原因:

1.不同的进程调度,怀疑理由:在PC端开不同的线程读取数据,会发生读出的数据错乱,但是很显然,循环是一个线层,通过加锁也无法避免看来不是这个原因。

2.底层数据错误,实际通过PC端数据顺序读取不会出现问题。

后来突然想到每个sensor的实例都要enable一次,enable函数会打开hid的设备文件,意味着A和G的设备描述符不同的,虽然打开文件相同。应该是文件读写指针不对,后来定义了一个静态fd文件描述符,A+G共享一个,后来成功解决数据错乱的原因

结论:

 1. 由于进程级文件描述符表的存在,不同的进程中会出现相同的文件描述符,它们可能指向同一个文件,也可能指向不同的文件    

 2. 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一    个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。

3.但是在同一线程中不会同步偏移量。


更多相关文章

  1. android sqlite db-journal文件产生原因及说明
  2. Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的
  3. 获取Android崩溃crash信息并写入日志
  4. Android(安卓)NDK编程之Android.mk和Application.mk
  5. Android(安卓)API翻译:Contact的子类介绍
  6. 逆向手机内核,添加调试支持及绕过反调试
  7. Android存储之SharePreferences
  8. android数据单位dp,px和sp
  9. android 自定义权限 permission

随机推荐

  1. 用了这么多年的泛型,你对它到底有多了解?
  2. 我的第26个代码
  3. 用long类型让我出了次生产事故,写代码还是
  4. 还不明白可空类型原理? 我可要挖到底了
  5. 追了多年的开发框架,你还认识指针吗?
  6. Sql Server之旅——第一站 那些给我们带
  7. Sql Server之旅——第二站 理解讨厌的表
  8. Sql Server之旅——第三站 解惑那些背了
  9. 命名空间引用类的三种方式 和 命名冲突解
  10. 数据库CURD常用操作-select查询-预处理