Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
C 如何利用中断通过SPI外围设备进行数据传输_C_Callback_Embedded_Interrupt_Spi - Fatal编程技术网

C 如何利用中断通过SPI外围设备进行数据传输

C 如何利用中断通过SPI外围设备进行数据传输,c,callback,embedded,interrupt,spi,C,Callback,Embedded,Interrupt,Spi,我一直在用C语言为MCU的SPI外围设备实现设备驱动程序。 我想利用中断机制进行接收和传输 至于接收部分,我认为我可以通过曝光来实现这一点 函数SpiRegisterCallback将被导入SPI驱动程序接口。此函数 启用客户端注册其功能,该功能将在 接收到数据字节,调用接收缓冲区完全中断 至于传输部分,我想使用一些SpitTransmit函数 它将接收指向要传输的数据字节和字节数的指针 要传送。至于实现,我将定义一些内部 SPI驱动程序的回调函数。将注册此内部回调 对于传输缓冲区空中断。在此回

我一直在用C语言为MCU的SPI外围设备实现设备驱动程序。 我想利用中断机制进行接收和传输

至于接收部分,我认为我可以通过曝光来实现这一点 函数SpiRegisterCallback将被导入SPI驱动程序接口。此函数 启用客户端注册其功能,该功能将在 接收到数据字节,调用接收缓冲区完全中断

至于传输部分,我想使用一些SpitTransmit函数 它将接收指向要传输的数据字节和字节数的指针 要传送。至于实现,我将定义一些内部 SPI驱动程序的回调函数。将注册此内部回调 对于传输缓冲区空中断。在此回调函数中,传递的数据字节将逐渐放入传输缓冲区。我不确定这种方法是否可行 这是适当的。有谁能给我一个如何实现SPI外设的建议吗 利用中断进行数据传输的驱动程序?提前感谢您的帮助
建议。

SPI通常非常实时关键,引入带有函数指针的回调意味着不必要的开销代码。从SPI到RAM的实际数据复制必须由驱动程序在内部完成。这就是ISR应该做的。可以找到一些通用指南

所以你的ISR应该填满一个缓冲区,然后交换指向缓冲区的指针,而不是慢内存!以受保护的方式,以便调用方始终有一个包含有效数据的缓冲区,而ISR始终有一个工作缓冲区需要填充。让调用方轮询一个标志,而不是从ISR内部调用回调。如果我能节省内存,我喜欢使用三重缓冲。也就是说:一个用于ISR的缓冲区、一个用于呼叫方的缓冲区和一个备用区,ISR可以在不中断呼叫方的情况下交换这些缓冲区


这对于代码来说相当复杂,大多数程序员都会弄错。DMA在这里优于中断,所以您应该真正考虑使用DMA。这是您在选择MCU时应该考虑的问题。

征求任何建议并不能真正使这成为一个好问题,因为多个答案可能是可以接受的,很少有答案是全面的。它邀请评论而不是回答。不过,我会放纵:

首先,根据任何定义,这都不是利用漏洞。“利用”意味着将某些东西用于一个非预期的目的——在本例中,这不是正确的术语,您不是在利用中断机制,您只是在使用它

在高时钟频率下,在某些情况下,处理中断所涉及的中断延迟和上下文切换时间可能不如简单的忙等待有效。如果传输一次超过两个或三个字节,那么在任何情况下都应该考虑使用DMA(如果可用的话),那么中断将是一个完整传输的DMA中断,而不是单个字符。对于SD卡接口或EEPROM等应用程序,DMA将对性能产生重大影响,并使CPU能够同时执行其他有用的工作。使用忙碌等待进行单字节/字传输,使用DMA进行块传输的驱动程序可能是最佳的。如果您正在使用RTOS,并且ISR触发任务上下文来处理数据,则这一点尤其正确-上下文切换开销可能几乎与单个字节的繁忙等待相同或更多。例如,如果您的SPI时钟>1MHz,您将等待8us的字节传输,您的ISR和回拨可能很容易大于该值,在这种情况下,这是不值得的

因此,我的建议是,只考虑使用慢时钟的SPI中断,在等待中断时可以完成其他有用的工作。


在中断中允许回调的一个问题是,它允许回调提供程序在中断上下文中执行不明智或非法的操作,并且您失去了控制中断处理时间的能力。如果回调是供编写设备驱动程序的人使用的,那么可能没关系——他们应该知道自己在做什么,但这就是设备驱动程序。

“让调用方轮询一个标志”。。或者“如果可用/相关,请等待信号量,直到中断处理程序发出缓冲区已满的信号为止。@如果您有更高级别的操作系统,请确保。”。否则,在裸露金属的情况下,您必须自己实现信号量。环缓冲区或FIFO是可以通过乒乓缓冲区考虑的替代方案。