我正在尝试写一个代码,可以很容易地移植到任何MCU。该MCU将作为主机与另一个音频编解码芯片进行通信。当与芯片通信时,主机MCU将向芯片写入请求,并等待中断线变为高电平,然后从芯片读取响应。
目前,我使用Raspberry Pi作为主机,因此我可以poll中断行的sysfs条目。我如何在一个可能没有poll方法的原始系统中实现这一点。我想我可以在中断ISR中更新一个全局变量,并反复检查这个全局变量。这就是我想要避免的问题。主程序循环本身可能被某个定时器中断处理程序调用,忙碌等待可能不是一个好的选择。
有什么想法吗?
发布于 2020-08-11 03:53:41
一种尺寸适合所有人,不适合任何人。特别是在空间有限的mcus中,使通用的一个大小适合所有库。因此,请谨慎操作。
每个mcu都是不同的,它们如何处理数据的移动是不同的,一些有缓冲器,一些有dma,等等。人们期望在设计中中断是可能的,但不是每个人都想做的事情。
你遗漏了大量的系统信息,这听起来像是一个外部编解码器芯片,但“响应”是什么意思。大多数mcu可以处理导致中断的gpio输入上升沿或电平,但是您还没有描述编解码器芯片的接口,如果它是像i2c或spi这样的公共接口,您正在移动的数据类型以及每个mcu如何处理这些数据,这当然是品牌和系列特定的,最多也很难创建通用(而不是臃肿)库。
如果库需要专注于回调和处理函数,则库不应该关心数据的中断或移动,用户提供这些,库则专注于数据。在最坏的情况下,库中有函数调用,由用户执行,发送命令,发送数据,接收数据,等待事件等。
如果这是i2c,那么请确保您也可以执行bit bang库,并具有一个通用的列表,包括驱动高电平、驱动低电平、浮点输入、读取输入、延迟半周期等,等待事件,然后实现其余部分。(当然,您也可以使用bit-bang spi,并且独立于mcu类型)。
发布于 2020-08-10 23:45:15
通常,微控制器有多种低功耗的“睡眠模式”。每种睡眠模式都有一个仍在运行的不同组合,以及一个可以唤醒微控制器的不同组合。例如,在一种模式下,您可以离开SPI外设发送数据,并通过中断唤醒,因此您可以让它发送一些数据,然后进入休眠模式,直到发送完成。不同的模式可能会关闭除GPIO引脚之外的所有外围设备。一种不同的模式可能会关闭一切,只让微控制器用复位引脚唤醒。
因为你的代码被设计成可以移植到任何微控制器上,所以你不能假设哪种睡眠模式是可用的。但您可以编写一个具有可选休眠的忙等待循环,如下所示:
setUpInterrupt();
while(!interruptHappened) {
enterAppropriateSleepModeIfAvailable(); // the person who ports the code implements this
}如果微控制器没有合适的休眠模式,搬运工就会让enterAppropriateSleepModeIfAvailable不做任何事情,这将是一个忙碌的等待。否则,它将等待中断发生。
如果中断发生在while(!interruptHappened)之后但enterAppropriateSleepModeIfAvailable()之前,请确保微控制器仍然唤醒,并且不会卡在休眠模式中。
发布于 2020-08-10 14:48:15
你可以尝试信号量,互斥量,锁,监视器。Lock, mutex, semaphore... what's the difference?这将告诉你它们之间的基本区别。
https://stackoverflow.com/questions/63335066
复制相似问题