1

我正在尝试编写一个可以轻松移植到任何 MCU 的代码。该 MCU 将充当主机并与另一个音频编解码器芯片通信。与芯片通信时,主机 MCU 将向芯片写入请求,并等待中断线变为高电平,然后读取芯片的响应。

目前,我使用 Raspberry Pi 作为主机,因此我可以输入中断线poll的条目。sysfs如何在可能没有poll方法的原始系统中实现这一点。我在想我可以在中断 ISR 中更新一个全局变量并反复检查这个全局变量。这就是我想要避免的问题。主程序循环本身可能会从 Timer 中断处理程序之一调用,而忙等待可能不是一个好的选择。

有任何想法吗?

4

3 回答 3

2

一种尺寸适合所有人,没有人适合。特别是在空间有限的 mcus 中,使通用的一种尺寸适合所有库。所以请谨慎行事。

每个 mcu 都不同,它们处理数据移动的方式各不相同,有些有缓冲区,有些有 dma 等。人们会期望在设计中可能会出现中断,但并不是每个人都想做。

您留下了大量的系统信息,听起来这是一个外部编解码器芯片,但“响应”是什么意思。大多数 MCU 可以处理导致中断的 gpio 输入上升沿或电平,但您没有描述编解码器芯片的接口,如果它是 i2c 或 spi 之类的通用接口,您正在移动什么样的数据以及结果如何每个单片机都处理这个问题,这当然是品牌和系列特定的,充其量很难制作一个通用(而不是臃肿)的库。

如果有库需要专注于回调和处理功能,库绝不应该关心数据的中断或移动,用户提供它,库反而专注于数据。最坏的情况是库有函数调用,用户填写它来实现事物、发送命令、发送数据、接收数据、等待事件等。

如果这是 i2c,那么确保您也可以使用 bit bang 库,并拥有一个通用的驱动高、驱动低、浮点输入、读取输入、延迟半周期等列表,等待事件,然后实现休息。(好吧,您也可以使用 bit-bang spi 并且独立于 mcu 类型)。

于 2020-08-10T19:53:40.550 回答
2

通常,微控制器有多种低功耗“睡眠模式”。每种睡眠模式都有不同的仍在运行的事物组合以及可以唤醒微控制器的不同事物组合。例如,在一种模式下,您可以让 SPI 外围设备传输数据,并通过中断唤醒,因此您可以给它一些数据传输,然后进入睡眠模式,直到完成。不同的模式可能会关闭除 GPIO 引脚之外的所有外设。不同的模式可能会关闭一切,只让微控制器被复位引脚唤醒。

由于您的代码旨在移植到任何微控制器,因此您不能假设哪些睡眠模式可用。但是您可以编写一个带有可选睡眠的忙等待循环,如下所示:

setUpInterrupt();
while(!interruptHappened) {
    enterAppropriateSleepModeIfAvailable(); // the person who ports the code implements this
}

如果微控制器没有适当的睡眠模式,搬运工将使它enterAppropriateSleepModeIfAvailable不做任何事情,这将是一个忙碌的等待。否则,它将等待中断发生。

while(!interruptHappened)如果中断发生 enterAppropriateSleepModeIfAvailable().

于 2020-08-10T15:45:14.790 回答
-1

你可以尝试信号量、互斥体、锁、监视器。锁、互斥、信号量……有什么区别?这将告诉您它们之间的基本区别。

于 2020-08-10T06:48:15.050 回答