Arduino RP2040 多核心运行模式
- 📌RP2040基于
Earle F. Philhower, III
的开发核心固件:https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
- 🎈相关开发文档在线j简要介绍:
https://arduino-pico.readthedocs.io/en/latest/multicore.html
📒多核处理介绍
📑RP2040芯片有2个内核可以相互独立运行,相互共享外设和内存。Arduino代码通常只会在核心0上执行,第二个核心处于低功耗状态下空闲。
📓使用介绍
-
🌿通过在草图中添加
setup1()
和loop1()
函数,您可以使用第二个核心。从setup1()
或loop1()
例程中调用的任何内容都将在第二个核心上执行。 -
🌿
setup()
和setup1()
将同时调用,并且loop()
或loop1()
将在核心的setup()完成后立即启动(即不一定同时启动!)。
📘暂停核心任务相关函数
有时应用程序需要暂停片上的其他内核(即它正在写入闪存或需要在其他事件发生时停止处理)。
- 🌿
void rp2040.idleOtherCore()
:
- 发送消息以停止另一个核心(即当从核心0调用时,它会暂停核心1,反之亦然)。等待另一个核心确认后再返回。
- 另一个内核将禁用其中断并在基于RAM的例程中忙碌等待,因此可以访问闪存和其他外围设备。
- ✨注意如果核心0空闲时间过长,则USB端口可能会被冻结。这是因为核心0管理USB并需要及时服务IRQ(空闲时无法做到)。
- 🌿
void rp2040.restartCore1()
从Core 0硬重置Core1并从setup1()重新启动其操作。
📙核心之间的通信
RP2040为内核之间的通信提供了硬件FIFO,但它专门用于上述空闲/恢复调用。相反,请使用以下功能访问软件管理的多核安全FIFO。
-
🌿
void rp2040.fifo.push(uint32_t)
将一个值推送到另一个核心。如果FIFO已满,将阻塞。 -
🌿
bool rp2040.fifo.push_nb(uint32_t)
将一个值推送到另一个核心。如果FIFO已满,则立即返回false并且不阻塞。如果推送成功,则返回true。 -
🌿
uint32_t rp2040.fifo.pop()
从此核心的FIFO中读取一个值。阻塞,直到一个可用。 -
🌿
bool rp2040.fifo.pop_nb(uint32_t *dest)
从该核心的FIFO中读取一个值并将其放置在此数据库中。如果成功将返回true,如果弹出将阻止则返回false。 -
🌿
int rp2040.fifo.available()
返回此核心的FIFO中可用的值的数量。
📝测试代码
- 🔖例程位置:
C:\Users\用户名\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.7.2\libraries\rp2040\examples\Multicore
void setup() {Serial.begin(115200);delay(5000);
}void loop() {Serial.printf("C0: Blue leader standing by...\n");delay(1000);
}// Running on core1
void setup1() {delay(5000);Serial.printf("C1: Red leader standing by...\n");
}void loop1() {Serial.printf("C1: Stay on target...\n");delay(500);
}