Примеры двухъядерных скетчей Rp2040

arduino-nano-rp2040

Итак, у меня есть плата rp2040, и я не смог найти двухъядерный пример кодов. Самое близкое, что я смог найти, - это пример библиотеки планировщика, предоставленный мне IDE

/*
 Несколько Миганий

 Демонстрирует использование библиотеки планировщика для плат:
 
 - Arduino Nano 33 BLE, или
- Arduino Portenta H7, или
- Подключение Arduino Nano RP2040

 Требуется оборудование :
 * Нет (светодиоды уже подключены к светодиоду RGB)

 ВНИМАНИЕ: полярность светодиодов изменена (поэтому loop3 выключит светодиод, написав 1)

 создано 8 октября 2012
 автор: Кристиан Малье
 Изменено
Скоттом Фитцджеральдом 19 октября 2012 г.

 Этот пример кода находится в открытом доступе

 http://www.arduino.cc/en/Tutorial/MultipleBlinks
*/

// Включите планировщик, так как мы хотим управлять несколькими задачами.
#include <Scheduler.h>

// При подключении Nano RP2040 светодиоды RGB подключаются к модулю Wi-Fi
// Пользовательские API одинаковы, но мы не можем преобразовать их в int, поэтому используйте определения
#if defined(ARDUINO_NANO_RP2040_CONNECT)

#include "WiFiNINA.h"
#define led1  LEDR
#define led2  LEDG
#define led3  LEDB

// На Nicla Sense ME светодиоды RGB подключаются через модуль I2C
// Пользовательские API одинаковы, но мы не можем преобразовать их в int, поэтому используйте определения
#elif defined(ARDUINO_NICLA)

#include "Nicla_System.h"
#define led1  LEDR
#define led2  LEDG
#define led3  LEDB

#else

int led1 = LEDR;
int led2 = LEDG;
int led3 = LEDB;

#endif

void setup() {
  Serial.begin(9600);

  // Установите 3 вывода в качестве ВЫХОДНЫХ
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  // Добавьте "loop2" и "loop3" в планирование.
  // "цикл" всегда запускается по умолчанию.
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}

// Задача № 1: мигает светодиод с задержкой в 1 секунду.
void loop() {
  digitalWrite(led1, HIGH);

  // ВАЖНО:
  // Когда выполняется несколько задач, "задержка" передает управление
  // другие задачи во время ожидания и гарантии их выполнения.
  delay(1000);

  digitalWrite(led1, LOW);
  delay(1000);
}

// Задача № 2: мигает светодиод с задержкой 0,1 секунды.
void loop2() {
  digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led2, LOW);
  delay(100);
}

// Задача № 3: прием команд с последовательного порта
// '0' выключает светодиод
// "1" включает светодиод
void loop3() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '0') {
      digitalWrite(led3, LOW);
      Serial.println("Led turned off!");
    }
    if (c == '1') {
      digitalWrite(led3, HIGH);
      Serial.println("Led turned on!");
    }
  }

  // ВАЖНО:
  // Мы должны регулярно вызывать "выход", чтобы пройти
  // управление другими задачами.
  yield();
}

но я не думаю, что он использует второе ядро rp2040. У кого-нибудь есть примеры кодов? потому что я действительно потерял, как это сделать

, 👍1

Обсуждение

Просто запустите новый "main ()" с помощью " multicore_launch_core1()`., @Majenko

@Majenko Итак, теперь у меня есть 3 функции: "настройка ()", "цикл ()" и " главная ()",? куда мне поместить multicore_launch_core1(), @DrakeJest

SDK RP2040 - ваш друг: https://raspberrypi.github.io/pico-sdk-doxygen/, @Majenko

И: https://raspberrypi.github.io/pico-sdk-doxygen/group__pico__multicore.html#multicore_example, @Majenko

@Majenko оооо... Вы можете использовать все функции sdk в arduino IDE?? Я не знал, что ты можешь это сделать., @DrakeJest

Ага. Ядро Arduino - это просто оболочка вокруг SDK., @Majenko


1 ответ


Лучший ответ:

3

Примечание: Эта информация касается чистого ядра "Arduino", а не ядра "MBED". Ядро MBED мешает использовать SDK RP2040, поэтому установите чистый металлический сердечник отсюда.

По умолчанию второе ядро ничего не делает.

Но вы можете запускать на нем все, что захотите, напрямую. Нет необходимости в каких-либо библиотеках. Вы используете функцию multicore_launch_core1(функция) для запуска функции на этом ядре. Вы могли бы сделать его похожим на Arduino, написав функцию-оболочку, такую как этот код:


void setup2() {
    pinMode(1, OUTPUT);
}

void loop2() {
    digitalWrite(1, HIGH);
    delay(750);
    digitalWrite(1, LOW);
    delay(750);
}

void main2() {
    setup2();
    while (1) {
        loop2();
    }
}

void setup() {
    multicore_launch_core1(main2);
    pinMode(0, OUTPUT);
}

void loop() {
    digitalWrite(0, HIGH);
    delay(1000);
    digitalWrite(0, LOW);
    delay(1000);
}
,

Код выдает ошибку в arduino IDE. `sketch_nov05a:21:5: ошибка: "multicore_launch_core1" не был объявлен в этой области", @DrakeJest

@DrakeJest Уверен, что у вас выбрана правильная плата и установлено правильное ядро? Я использую эту функцию все время, без необходимости что-либо делать., @Majenko

Я дважды проверил, и да . Я использую " Платы Arduino Mbed OS RP2040 - Raspberry pi pico`, @DrakeJest

@DrakeJest Ах, похоже, вы используете не ядро Raspberry Pi, а ядро MBED. Я никогда этим не пользовался. Придерживайтесь правильного Pi., @Majenko

@DrakeJest Это тот, который я использую: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json, @Majenko

Как называется ядро pi? Единственный, кто появляется внутри менеджера платы, - это тот, он даже говорит, что он сделан arduino, так что я думаю, что это официальный, @DrakeJest

Нужно его скомпилировать прямо сейчас ! И ничего себе, в эту систему включено так много плат, которые могут даже менять основные часы и прочее. Что тогда с этой ОС Arduino Mbed?, @DrakeJest

@DrakeJest Проблема с MBED в том, что он запускает MBED. Это операционная система (например, FreeRTOS), которая находится между вашим кодом и оборудованием., @Majenko

О, это облом, поэтому я теряю доступ к библиотеке планировщика. существуют ли аналогичные альтернативы? Я думаю, что тогда мне придется кодировать свой проект самым сложным образом, @DrakeJest

Библиотека планировщика-это костыль. Тебе не нужны костыли., @Majenko

Вы правы, если мне нужна ОС, я мог бы с таким же успехом выбрать полноценную raspberry pi 4/zero. Спасибо вам за вашу помощь, Майенко, я приступаю к началу своего проекта. Хорошего дня, @DrakeJest