Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino中断处理 背景_Arduino_Sd Card_Interrupt_I2c - Fatal编程技术网

Arduino中断处理 背景

Arduino中断处理 背景,arduino,sd-card,interrupt,i2c,Arduino,Sd Card,Interrupt,I2c,我需要一个运行在“Arduino兼容”芯片组UNO32板上的数据记录应用程序,并连接传感器。数据应记录到“Arduino无线SD屏蔽”上的SD卡上。 传感器通过I2C连接 我的问题是,当我使用Arduino SD库时,写入速度很慢:每个print()操作25毫秒,这给了我40赫兹的最大值,这与我的传感器的100-800赫兹数据速率相比是可笑的 我的错误解决方案 幸运的是,该传感器配备了可存储32个传感器值的片上FIFO。这意味着我可以去至少200Hz没有任何问题,因为时间填补先进先出远远大于时间

我需要一个运行在“Arduino兼容”芯片组UNO32板上的数据记录应用程序,并连接传感器。数据应记录到“Arduino无线SD屏蔽”上的SD卡上。 传感器通过I2C连接

我的问题是,当我使用Arduino SD库时,写入速度很慢:每个print()操作25毫秒,这给了我40赫兹的最大值,这与我的传感器的100-800赫兹数据速率相比是可笑的

我的错误解决方案 幸运的是,该传感器配备了可存储32个传感器值的片上FIFO。这意味着我可以去至少200Hz没有任何问题,因为时间填补先进先出远远大于时间写入卡。 但我仍然希望达到至少400Hz,所以我想我应该有以下设置:

  • 告诉传感器将数据放入FIFO
  • 当FIFO几乎满时,传感器触发一个中断(传感器这样做,它工作,我可以捕捉到中断)
  • 当Arduino接收到中断时,它轮询传感器以获取数据(通过I2C),并将数据存储在SRAM的缓冲区中
  • 当SRAM缓冲区已满时,将其内容写入SD卡
  • 不幸的是,这似乎不起作用,因为处理I2C的Arduino Wire库使用中断,不能从中断处理程序中调用。我试过了,它冻结了微控制器

    我的问题 Arduino似乎还有其他不依赖中断的I2C库。我应该试试那条路线吗


    还是我的思维方式(在ISR中获取大量数据)从一开始就不好?还有其他方法吗?

    只需使用中断设置标志并完成ISR。从主循环调用I2C,而不是直接从ISR调用

    boolean fifoFull = false;
    
    void fifoISR() {
        fifoFull = true;
    }
    
    void loop() {
        if(fifoFull) {
            // Do I2C
            fifoFull = false;
        }
    }
    

    问题在于,写入SD卡所需的时间比填充FIFO所需的时间更长。这意味着收集新数据必须优先于写入SD卡。因此,我希望在ISR中收集新数据。ISR不应用于处理密集型任务。因为进来的中断是偶发的、周期性的。