【问题标题】:efficient prepending to array有效地添加到数组
【发布时间】:2017-08-21 10:58:25
【问题描述】:

我正在将名为 i2cdevlib 的 arduino 著名库之一移植到我的嵌入式系统。而且我遇到一个问题,其实这次远不是第一次,功能界面如下:

void function(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t len);

我需要做的是首先将dev_addr 写入i2c 总线然后reg_addr 然后data。但是用于将数据发送到 i2c 总线的 i2c 驱动程序(我使用的是 Keil MDK 包中的一个)函数的定义如下:

void send_i2c(uint8_t dev_addr, uint8_t *data, uint8_t len);

由于某些 i2c 属性,我无法按顺序调用它。因此,每次调用function 时,我都必须创建新数组,将第一项设置为reg_addr,然后将memcpy data 放入其中,这看起来很糟糕而且似乎效率不高(老实说,数据流很少使用这些传感器时,但仍然......)。但是,除了修改 i2c 驱动程序或编写新驱动程序之外,我看不到另一种解决方案,但我不想仅仅因为一个功能而重写可持续和经过测试的驱动程序。

那么有没有办法在不这样做的情况下改进这个解决方案?

【问题讨论】:

  • 鉴于现有接口,我不确定是否有其他方法(除了将责任推给function 的调用者)。如果这不是瓶颈,并且您可以将这种粗略封装到一个函数中,那我就不用担心了。
  • @OliverCharlesworth 我无法将它推送到function 调用者,因为function 接口由i2cdevlib 库决定。
  • 所以你被夹在两个固定的函数原型之间,你既不能控制外部调用者也不能控制内部被调用者?
  • @Medinoc 是的,没错。
  • "well known" 可能是对“著名”库的更好描述 - 我不会走那么远。

标签: arrays arduino embedded keil


【解决方案1】:

问题在于 I2CDevLib 是如何实现的。它不应该强制用户指定一个寄存器地址,因为 I2C 协议不要求有一个 8 位的寄存器地址来写入。大多数设备都可以,但有些可能不会。

您最终需要做的是发送寄存器地址,然后是有效负载,而不发送任何停止位。您应该查看 Keil MDK 是否具有 I2C 功能,该功能允许您在不中断传输的情况下逐字节发送数据。这样,您的函数可以分别发送寄存器地址,然后分别发送有效负载的每个字节。

这会引入多个函数调用的开销,除非这些调用是由编译器内联的。如果这些调用很简单,它们应该被内联,但不能保证它们会被内联。

您可以做的另一件事是深入研究您的 MCU 手册,找到 I2C 寄存器、它们如何工作并实现您自己的 I2C 例程。但这需要您做更多的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多