c++ - arduino 低 i2c 读取速度;

标签 c++ performance arduino i2c

我目前正在使用 genuino 101 进行一个项目,我需要通过 i2c 读取大量数据,以填充任意大小的缓冲区。从下图中我可以看到读取请求本身只需要大约 3毫秒,写请求大约 200 纳秒。

Read Transactions

但是在同一个 block 中的读取交易之间有一个非常长的时间(750+ ms)

#define RD_BUF_SIZE 32
void i2cRead(unsigned char device, unsigned char memory, int len, unsigned char * rdBuf)
{
     ushort bytesRead = 0;
     ushort _memstart = memory;
     while (bytesRead < len) 
     {
         Wire.beginTransmission((int)device);
         Wire.write(_memstart);
         Wire.endTransmission();
         Wire.requestFrom((int)device, BLCK_SIZE);
         int i = 0;
         while (Wire.available()) 
         {
              rdBuf[bytesRead+i] = Wire.read();
              i++;
         }
         bytesRead += BLCK_SIZE;
         _memstart += BLCK_SIZE;
     }
}

根据我的理解,这不应该花那么长时间,除非添加到 memstart 和 bytesRead 需要非常长的时间。根据我对时间复杂度的理解,可以说是有限的,这个函数的时间复杂度为 O(n),在最好的情况下,对于 128 字节的查询应该只需要大约 12 毫秒

我错过了什么吗?

最佳答案

那 700 毫秒不是由函数中的几条指令的执行时间造成的。这些应该在微秒内完成。您可能遇到缓冲区溢出,或者其他设备可能延迟传输,或者存在另一个与缓冲区溢出无关的错误。

这是关于我将如何做的:

void i2cRead(unsigned char device, unsigned char memory, int len, unsigned char * rdBuf, int bufLen)
{
     ushort _memstart = memory;
     if ( bufLen < len ) {
         len = bufLen;
     }
     while (len > 0) 
     {
         Wire.beginTransmission((int)device);
         Wire.write(_memstart);
         Wire.endTransmission();

         int reqSize = 32;

         if ( len < reqSize ) {
             reqSize = len;
         }

         Wire.requestFrom((int)device, reqSize);

         while (Wire.available() && (len != 0)) 
         {
              *(rdBuf++) = Wire.read();
              _memstart++;
              len--;
         }
     }
}

关于c++ - arduino 低 i2c 读取速度;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44454300/

相关文章:

生命游戏代码的 C++ 调试

java - Client SocketInputStream.close() 导致更多的资源消耗?

python - 如何从 1m 字符串输入中计算唯一值?

python - namedtuple 字段名称 : single string or sequence?

c - 函数指针数组,传递数组中定义的值

c++ - 代码无法打印出整个字符串并突然结束

c++ - cmd.exe 与 Powershell 中 C++ 程序的不同执行时间

c++ - printf %s 常量字符 *

c++ - 为什么 g++ -Wreorder 不更聪明?

c - 如何旋转2D Controller 的映射